개발:rhymix_dokuwiki_세션_연동_복구

Rhymix와 DokuWiki 세션 연동 복구

한줄 요약: 이번 삽질은 Codex가 대신 했다. (글도 Codex가 다 썼다)

Rhymix 쪽 로그인 세션을 Redis로 관리하기 시작한 뒤부터 위키 로그인이 연동되지 않았고, 위키를 열면 요청이 이리저리 돌다가 서비스가 통째로 뻗는 것처럼 보이는 문제도 있었다.

이번에는 Codex에게 wiki 쪽 로그인 방식만 최대한 적게 손대고, 원본을 백업한 뒤 실제 계정으로 글까지 써서 확인해 달라고 부탁했다. 그랬더니 Codex가 docker compose 설정, 실행 중인 컨테이너, PHP 설정, 기존 authxe 코드와 로그를 알아서 조사하고 원인을 찾아 운영 반영과 검증까지 처리했다. 사람이 또 처음부터 삽질하지 않아도 되었다!

Redis 자체가 직접적인 문제라기보다는, 예전부터 숨어 있던 세션 쿠키 충돌이 저장 방식 변경 뒤에 제대로 터진 것이었다.

  • /xe/wiki가 모두 경로 /에 같은 이름의 PHPSESSID를 사용했다.
  • inc/preload.php에서도 DOKU_SESSION_NAMEPHPSESSID로 강제하고 있었다.
  • 그래서 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로 다음 순서를 실제로 확인했다.

  1. /xe 로그인 성공
  2. 같은 브라우저 세션으로 /wiki에 접근했을 때 사용자 메뉴에 hide_d_test 표시
  3. 위키에 들어간 뒤에도 Rhymix의 PHPSESSID가 바뀌지 않음
  4. 위키는 별도 DOKUWIKISESSID 사용
  5. playground:playground 문서를 수정하고 변경 이력의 작성자가 hide_d_test인지 확인
  6. 공개 변경 이력에서도 같은 작성자와 편집 요약 확인
  7. 최근 PHP fatal, warning, timeout이나 무한 리다이렉트 없음
  8. DokuWiki를 2026-07-14a Mort로 업데이트한 뒤에도 같은 로그인 연동 검증을 다시 통과

검증이 끝난 뒤 임시 로그인 세션은 로그아웃하고 쿠키 파일도 지웠다.

운영 파일을 바꾸기 전에 auth.php, userinfo.php, preload.php 원본을 별도 백업했다.

더 자세한 파일별 변경 내용, 체크섬, 롤백 방법과 검증 결과는 docker compose 관리 작업공간의 WIKI_SESSION_FIX_REPORT.md에 남겨두었다.

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);
  • 개발/rhymix_dokuwiki_세션_연동_복구.txt
  • 마지막으로 수정됨: 2026/08/08 17:39
  • 저자 hide_d