Skip to content

ReSSO v0.9.73

Choose a tag to compare

@hkjang hkjang released this 08 Sep 19:13
· 25 commits to main since this release

id_token_hint가 로그인 화면 앞에서 멈춰 있었습니다. RP는 이 파라미터로 **"이 계정을 갱신하는 중"**이라고 지목합니다. 그런데 인가 Endpoint는 그것을 브라우저에 이미 있는 Session과만 대조했습니다. 그 대조에 실패한 요청은 로그인 화면으로 보내지는데, 보관되는 authorization_requests 행에는 hint의 흔적이 없어서, 그 화면에서 로그인한 사람이 누구든 코드가 나갔습니다.검사가 가장 필요한 경로에만 검사가 없었습니다 — 요청이 그 화면까지 오는 이유가 대개 거기 있던 Session이 지목된 계정이 아니었기 때문입니다.

수정

  • RP는 한 계정을 물었는데 다른 사람을 건네받았고, 응답에는 그 사실을 알리는 것이 아무것도 없었습니다. 코드는 평범한 성공으로 돌아갔습니다. OIDC Core 3.1.2.1은 hint가 지목한 사람이 로그인하지 않았으면 코드가 아니라 오류를 답하라고 합니다.
  • 약속은 이미 문서에 적혀 있었습니다. docs/compatibility.md는 "지정한 계정과 다르면 재인증을 요구한다"고 적고 있었지만, 그 재인증이 실제로 일어난 뒤에는 아무도 결과를 보지 않았습니다.
  • 이제 hint가 요청과 함께 보관됩니다. 마이그레이션 015가 authorization_requests.id_token_hint_subject를 더하고, login인가 코드를 만들기 직전에 방금 인증된 사용자와 대조합니다. 다르면 **403 account_mismatch**이고 아무것도 발급하지 않습니다.
  • 인가 요청은 일부러 소진하지 않습니다. 같은 화면에서 지정된 계정으로 다시 로그인하면 흐름이 이어집니다 — RP로 돌아가 새 request token으로 처음부터 시작할 필요가 없습니다.
  • 응답은 어느 계정인지 밝히지 않습니다. 키보드 앞의 사람은 방금 자신이 그 사람이 아님을 증명했습니다.
  • 로그인 자체는 성공했으므로 세션과 쿠키는 그대로 둡니다. resso_login_attempts_total{result="success"}도 그대로 오릅니다 — 자격 증명은 받아들여졌고 세션은 진짜입니다. 코드를 발급하지 않은 사실은 사유가 맞는 자리인 트레일에 LOGIN_SUCCESS result=PARTIAL + reason=id_token_hint_mismatch로 남습니다.
  • max_age는 함께 보관하지 않았습니다. 로그인 화면을 거친 요청은 항상 새 Session을 만들어 auth_time이 그 시점이므로 정의상 충족됩니다. 다음 사람이 다시 따져보지 않도록 그 판단을 docs/compatibility.md에 적었습니다.
  • 새 연동 테스트가 세션 없는 브라우저로 hint 붙은 인가 요청을 보내 로그인 화면으로 park시킨 뒤 다른 계정으로 로그인하고, 수정 전 코드에서 네 건이 모두 실제로 실패하는 것을 확인했습니다(200 + code=가 실린 redirect_to, error != account_mismatch, PARTIAL 감사 0건). 지정된 계정으로 같은 request token을 써서 다시 로그인하면 등록된 redirect_uri로 코드가 나가는 것과, 거절 문구가 hint 계정 이름을 노출하지 않는 것도 같은 테스트가 함께 지킵니다.
  • docs/operations.mdresult=PARTIAL 항목에는 이 기록 하나만은 장애가 아니라 정책이라는 예외를 적었습니다 — 그곳의 다른 모든 PARTIAL은 무언가 실패한 것입니다.

Upgrade notes

동작이 달라집니다: id_token_hint가 붙은 인가 요청이 로그인 화면을 거칠 때, **hint가 지목한 계정이 아닌 사람이 로그인하면 인가 코드 대신 403 account_mismatch**가 나갑니다. 정상 동작에서는 아무것도 달라지지 않습니다 — hint를 보내지 않는 RP와, 지목한 계정으로 로그인하는 경우는 전과 같습니다. 이 응답이 보인다면 RP가 오래된 hint를 계속 보내고 있는지 먼저 확인하시고, 사용자에게는 같은 화면에서 지정된 계정으로 다시 로그인하면 그대로 이어진다고 안내하시면 됩니다. LOGIN_SUCCESS result=PARTIAL 기록이 전에 없던 자리에서 생길 수 있는데, 상세가 reason=id_token_hint_mismatch인 것만은 장애가 아니라 정책입니다(docs/operations.md). 마이그레이션 015가 authorization_requests에 컬럼 하나를 더하며 기본값이 빈 문자열이라 처리 중인 요청에는 영향이 없고, 되돌릴 때 이전 이미지도 그대로 동작합니다.


Docker image: resso:v0.9.73

Archive: resso-v0.9.73.tar.gz

SHA-256: a27ba680b9f90594461c3e52d659e9874f7aeba8edcc0b4791c5d877cc79f654