Skip to content

ReSSO v0.9.70

Choose a tag to compare

@hkjang hkjang released this 04 Sep 14:13
· 32 commits to main since this release

브라우저의 SSO 세션을 읽지 못한 것이 "로그인하지 않았다"로 답해지고 있었습니다. 세션을 읽는 OIDC 엔드포인트 둘 — 인가와 로그아웃 — 이 SessionByToken의 에러를 "없음"과 같이 취급했고, 거기서 나가는 두 답은 모두 RP가 그대로 행동으로 옮기는 단언입니다. v0.9.69가 userinfo와 introspection의 조회들에, v0.9.67이 Role 조회에 그은 그 구분이 세션 조회에는 아직 없었던 것입니다.

수정

  • prompt=none에 대한 login_required는 "세션이 없다"는 말입니다. 조용한 갱신(silent renewal)을 하는 RP는 그것을 "사용자가 로그아웃했다"로 읽고 자기 세션도 끝냅니다 — 그게 올바른 처리이고 어느 라이브러리나 그렇게 합니다. 그래서 이 서비스에 갇힌 장애가 저하로 끝나지 않고 모든 RP에서 모든 사람을 한꺼번에 로그아웃시켰습니다.
  • 바로 한 줄 아래는 이미 그렇게 하고 있었습니다. SessionAuthenticatedRecently는 돌지 못하면 server_error를 냅니다. 다만 세션 조회가 그보다 먼저 돌기 때문에, 저장소 장애는 그 배려에 닿기 전에 이 조회에서 먼저 답을 받았습니다.
  • 로그아웃에서는 endSession이 "이 서비스가 가진 가장 오해를 부르는 실패"라고 이미 적어둔 그 결과가 벌어집니다 — 세션은 살아 있고, 거기 묶인 Refresh Token을 든 RP는 계속 갱신하며, 폐기가 곧 통지이므로 back-channel logout도 나가지 않습니다. endSession은 그 경우 세션을 지목하는 PARTIAL 감사 기록을 남깁니다. 세션을 읽지 못한 것은 한 단계 앞에서 벌어지는 같은 결과인데 기록이 아예 없었습니다.
  • 그 요청은 로그인하지 않은 브라우저의 로그아웃과 글자 그대로 같은 모습이었습니다. 쿠키는 지워지고 RP는 post-logout 페이지로 리다이렉트되어 다 끝난 것처럼 보였습니다.
  • 이제 store.ErrNotFound만 "로그인하지 않음"입니다. 그 밖의 에러는 인가 엔드포인트에서 server_error, 로그아웃에서 PARTIAL LOGOUT 감사 기록이고 양쪽 다 Realm을 적은 로그를 남깁니다.
  • 로그아웃의 응답은 일부러 그대로 뒀습니다. endSession 위에 이미 적혀 있는 판단입니다 — 그 시점엔 쿠키가 이미 지워졌고, 사람에게 내놓을 수 있는 조치가 없습니다.
  • 기록은 세션을 지목하지 못합니다 — 세션을 읽는 일 자체가 실패했기 때문입니다. 그래서 docs/operations.md기록된 IP와 시각으로 찾으라고 적었고, prompt=none의 새 구분은 docs/compatibility.md에 적었습니다.
  • 새 연동 테스트가 sso_sessionsRENAME으로 숨기고(테스트마다 전용 스키마) 수정 전 코드에서 세 건이 모두 실제로 실패하는 것을 확인했습니다. 쿠키 없는 로그아웃이 새 기록을 만들지 않는 것과, 정상 상태에서 prompt=none이 코드를 받는 것도 같은 테스트가 함께 지킵니다.

Upgrade notes

동작이 달라집니다: 세션 조회가 실패하면 /realms/{realm}/protocol/openid-connect/authprompt=none에 **login_required 대신 server_error**로 답합니다. 정상 동작에서는 아무것도 달라지지 않습니다 — 이 응답이 보이기 시작한다면 그것은 새 결함이 아니라 지금까지 "로그인하지 않았다"로 가려져 있던 저장소 장애이므로, 로그의 Realm과 error를 먼저 보시면 됩니다. 로그아웃의 응답은 그대로이고, 대신 PARTIAL LOGOUT 감사 기록이 전에 없던 자리에서 생길 수 있습니다 — 세션을 지목하지 못하므로 기록된 IP와 시각으로 찾으십시오(docs/operations.md). 저장되는 데이터는 바뀌지 않고 되돌릴 때 이전 이미지도 그대로 동작합니다.


Docker image: resso:v0.9.70

Archive: resso-v0.9.70.tar.gz

SHA-256: b8a2971ceb4856f7c478c174785c7495bf0f8a6447c2fc870bf11986ef9d7aa9