새 호스트로 마이그레이션할 때 사용자 세션 유지하기

Move your Discourse Instance to a Different Server에서 이어서 토론을 계속합니다:

Discourse 인스턴스를 새 서버로 이전하거나 새로 구축한 인스턴스에 백업을 복원할 때 발생하는 문제 중 하나는 모든 로그인된 사용자 세션이 손실될 수 있다는 점입니다. 이로 인해 사용자는 다시 로그인해야 합니다. 커뮤니티에 따라 다음과 같은 이유로 이는 바람직하지 않을 수 있습니다:

  • 재로그인이 어려운 경우, 일부 사용자는 참여를 꺼릴 수 있습니다.
  • 일부 사용자는 비밀번호 복구에 도움이 필요할 수 있습니다.
  • 일부 사용자는 새 계정을 생성하여 게시 기록과 사용자 노트에서 분리되고, 썩은 계정(zombie account)만 남길 수 있습니다.

세션 손실이 발생하는 이유는 Discourse 세션 쿠키가 기본적으로 Redis에 저장되는 무작위로 생성된 비밀 키(secret key)로 암호화되어 있기 때문입니다. Redis 데이터는 백업에 포함되지 않으므로, 사이트를 새 호스트에 복원할 때 새 비밀 키가 다시 생성됩니다.

이 방식의 장점은 손상된 백업 파일에 사용자 세션을 손상시키는 데 필요한 키가 포함되어 있지 않다는 점입니다. 이는 매우 나쁜 결과를 초래할 수 있기 때문입니다.

Discourse 인스턴스를 이전할 때, 사용자 세션을 유지하면서 호스트 이전이 가능하도록 비밀 키를 복사하기 위해 다음 단계를 따름으로써 이를 우회할 수 있습니다.

단계 1: 비밀 키 가져오기

기존 Discourse 인스턴스에 진입하여 rails 콘솔을 실행한 후, 비밀 키를 가져옵니다:

admin@host:/var/discourse$ ./launcher enter app
root@host:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"

마지막 줄에 출력된 값을 확인하고 안전하게 보관하세요.

단계 2: 새 인스턴스에 비밀 키 설정

이전을 위해 백업을 받을 준비가 된 Discourse 인스턴스가 이미 있다고 가정하고, 방금 얻은 비밀 키를 설정하기 위해 app.yml을 편집합니다. env 섹션에 추가합니다:

env:
  DISCOURSE_SECRET_KEY_BASE: "90.......fed"

이를 추가한 후, 인스턴스를 다시 빌드합니다:

admin@newhost $ launcher rebuild app

단계 3: 새 인스턴스에서 비밀 키 확인

이것은 단계 1과 동일하지만, 새 호스트에서 명령을 실행합니다:

admin@newhost:/var/discourse$ ./launcher enter app
root@newhost:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"

출력된 비밀 키는 단계 1의 키와 정확히 동일해야 합니다.

단계 4: 이전 진행

소스 Discourse를 읽기 전용으로 설정하고, 백업을 받아 대상 Discourse로 복사한 후 복원합니다. 사용자가 새 사이트로 향하도록 DNS 레코드를 업데이트합니다(또는 테스트를 위해 hosts 파일 해킹을 사용).

이전까지 로그인된 세션은 이제 새 호스트에 유지되어야 합니다.

경고

여러 Discourse 인스턴스 간에 비밀 키를 공유해서는 절대 안 됩니다. 비밀 키를 보유하면 누군가가 사이트에서 자신의 세션 쿠키를 복호화하고 수정할 수 있으며, 이는 매우 나쁜 보안 결과를 초래할 수 있습니다.

항상 그렇듯, 실제 Discourse 인스턴스를 작업하기 전에 샌드박스 인스턴스나 테스트 설치 환경에서 위의 단계를 연습하고 검증하세요. 성공을 준비하세요!

마지막으로, 이 방법을 설명해 주신 @david님께 감사드립니다. 저는 단지 이를 테스트하고 여기에 기록했을 뿐입니다(편집하거나 보완하는 것은 자유롭게 하세요!).

1개의 좋아요