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);