====== Rhymix와 DokuWiki 세션 연동 복구 ======
한줄 요약: 이번 삽질은 Codex가 대신 했다. (글도 Codex가 다 썼다)
Rhymix 쪽 로그인 세션을 Redis로 관리하기 시작한 뒤부터 위키 로그인이 연동되지 않았고, 위키를 열면 요청이 이리저리 돌다가 서비스가 통째로 뻗는 것처럼 보이는 문제도 있었다.
이번에는 Codex에게 //wiki 쪽 로그인 방식만 최대한 적게 손대고, 원본을 백업한 뒤 실제 계정으로 글까지 써서 확인해 달라//고 부탁했다. 그랬더니 Codex가 docker compose 설정, 실행 중인 컨테이너, PHP 설정, 기존 authxe 코드와 로그를 알아서 조사하고 원인을 찾아 운영 반영과 검증까지 처리했다. 사람이 또 처음부터 삽질하지 않아도 되었다!
===== 원인 =====
Redis 자체가 직접적인 문제라기보다는, 예전부터 숨어 있던 세션 쿠키 충돌이 저장 방식 변경 뒤에 제대로 터진 것이었다.
* ''/xe''와 ''/wiki''가 모두 경로 ''/''에 같은 이름의 ''PHPSESSID''를 사용했다.
* ''inc/preload.php''에서도 ''DOKU_SESSION_NAME''을 ''PHPSESSID''로 강제하고 있었다.
* 그래서 XE 로그인 뒤 위키를 열면 DokuWiki가 새 ''PHPSESSID''를 발급하며 Rhymix 로그인 세션 ID를 덮어썼다.
* 기존 ''authxe'' 플러그인은 브라우저의 XE 세션이 아니라 현재 DokuWiki의 ''session_name()''과 ''session_id()''를 ''userinfo.php''에 넘겼다. 세션 저장소가 분리된 뒤에는 이 ID로 Rhymix 로그인 정보를 찾을 수 없었다.
===== 수정 =====
XE나 게임 쪽은 건드리지 않고 위키 쪽 파일 세 개만 수정했다. 변경 전 원본도 별도 백업했다.
먼저 DokuWiki 세션의 이름을 분리했다.
// wiki/inc/preload.php
define('DOKU_SESSION_NAME', 'DOKUWIKISESSID');
define('DOKU_SESSION_PATH', '/');
그리고 ''authxe''에서는 DokuWiki 세션 ID를 보내지 않고, 브라우저에 남아 있는 Rhymix의 ''PHPSESSID''만 골라서 검증한 뒤 전달하도록 바꿨다.
// wiki/lib/plugins/authxe/auth.php
$xeSessionId = $_COOKIE['PHPSESSID'] ?? '';
if (!$xeSessionId || !preg_match('/^[A-Za-z0-9,-]+$/D', $xeSessionId)) {
return false;
}
// userinfo.php 요청의 Cookie 헤더에는 이것만 넣는다.
'Cookie: PHPSESSID=' . $xeSessionId
반대로 ''userinfo.php''는 Rhymix를 불러오는 전용 통로이므로, Rhymix가 세션을 시작하기 전에 다시 ''PHPSESSID''를 선택한다.
// wiki/userinfo.php
if (session_status() !== PHP_SESSION_NONE) {
// 이미 다른 세션이 시작된 이상한 요청은 거부한다.
return;
}
session_name('PHPSESSID');
require(XE_PATH);
처음에는 ''.user.ini''에서 세션 이름을 바꾸는 방법도 시험했지만, DokuWiki가 ''preload.php''의 값을 이용해 다시 ''session_name()''을 호출하므로 효과가 없었다. 이 파일은 바로 제거하고 실제 강제 지점 한 줄만 수정했다.
===== 확인 =====
제공한 임시 계정 ''hide_d_test''로 다음 순서를 실제로 확인했다.
- ''/xe'' 로그인 성공
- 같은 브라우저 세션으로 ''/wiki''에 접근했을 때 사용자 메뉴에 ''hide_d_test'' 표시
- 위키에 들어간 뒤에도 Rhymix의 ''PHPSESSID''가 바뀌지 않음
- 위키는 별도 ''DOKUWIKISESSID'' 사용
- ''playground:playground'' 문서를 수정하고 변경 이력의 작성자가 ''hide_d_test''인지 확인
- 공개 변경 이력에서도 같은 작성자와 편집 요약 확인
- 최근 PHP fatal, warning, timeout이나 무한 리다이렉트 없음
- DokuWiki를 2026-07-14a ''Mort''로 업데이트한 뒤에도 같은 로그인 연동 검증을 다시 통과
검증이 끝난 뒤 임시 로그인 세션은 로그아웃하고 쿠키 파일도 지웠다.
===== 백업과 기록 =====
운영 파일을 바꾸기 전에 ''auth.php'', ''userinfo.php'', ''preload.php'' 원본을 별도 백업했다.
더 자세한 파일별 변경 내용, 체크섬, 롤백 방법과 검증 결과는 docker compose 관리 작업공간의 ''WIKI_SESSION_FIX_REPORT.md''에 남겨두었다.
===== DokuWiki Mort에서 Bootstrap3 템플릿 오류 =====
DokuWiki를 2026-07-14a ''Mort''로 업데이트한 뒤, 로그인 상태에서 시작 페이지를 열면 다음 오류가 붙어서 나왔다.
Call to undefined function dokuwiki\\template\\bootstrap3\\trigger_event()
사용 중인 ''bootstrap3_mod''의 화면 구성은 실제 Template 클래스를 2022년판 기본 ''bootstrap3'' 템플릿에서 불러오고 있었다. Mort에서는 예전 전역 함수 ''trigger_event()''가 제거되었지만 이 템플릿은 아직 그 함수를 호출하고 있었다.
오류 로그의 stack trace는 ''lib/tpl/bootstrap3/Template.php'' 2231행을 정확히 가리켰다. 원본을 백업한 뒤 이 한 줄만 새 API로 바꿨다.
\dokuwiki\Extension\Event::createAndTrigger('TPL_TOC_RENDER', $toc, null, false);