Files
document-haness/reviews/2026-09-20-keycloak-role-contract-remediation/04-fact-reviewer-review.md
T

3.7 KiB

fact-reviewer 역할 재검토

VERDICT: FAIL

이 FAIL은 “현재 문서에서 틀린 사실을 발견했다”는 뜻이 아니다. fact-reviewer 계약이 요구하는 최종 source/evidence 역대조를 exact revision까지 완료하지 못했다는 뜻이다.

읽은 계약

  • .claude/agents/fact-reviewer.md
  • Record의 source가 가리키는 docs/keycloak/final/document.md
  • 현재 수정된 17개 Record diff
  • local evidence checker 결과
  • source repository contract (tech-log-tree.json)

현재 직접 대조한 핵심 주장

다음은 현재 SSOT에서 직접 근거를 확인했다.

  1. AP1은 browser 환경에서 장기 client credential 기밀성과 trusted client authentication을 유지하기 어려운 public client다.
  2. AP2는 server-side confidential client이며 이 프로젝트에서 client_secret_basic을 사용한다.
  3. public/confidential client type과 browser token custody/API caller는 별도 축이다.
  4. AP2는 Authorization Code confidential client까지 확인했고 현재 구현을 PKCE S256 예시라고 확정하지 않는다.
  5. AP3의 SameSite와 CSRF는 서로 다른 방어선이며 raw XSRF-TOKEN/X-XSRF-TOKEN 검증 경로가 있다.
  6. Google federation은 upstream IdP 경계이고 downstream issuer는 Keycloak이다.
  7. 외부 identity key는 provider + upstream sub이며 email collision은 자동 병합하지 않는다.
  8. mock provider 검증은 실제 Google account/public HTTPS callback/consent 검증을 의미하지 않는다.
  9. Bearer JWT 검증은 signature/issuer·time/audience/role conversion을 분리한다.
  10. multi-instance/session 문제는 현재 단일 인스턴스 검증 범위를 넘는 open question이다.

대조하지 못한 것

1. exact source revisions

Tree가 고정한 네 revision을 가진 checkout이 현재 머신에 없다.

AP1 64175266df05545f8f181fc91c1f0364bc47fce9
AP2 d019846f8725bdb0badde33043b020dc252e32ff
AP3 934c5da5d6edc2429dfb558b773656e46f21d677
AP4 f4aea65dc6255eae07b20ebbe21e02fb6115e563

따라서:

check_evidence.mjs keycloak --repo
exit 3
mismatch 0
unverifiable 1

2. refreshTokenMaxReuse 설명의 exact revision provenance

현재 Record는 refreshTokenMaxReuse를 동일 refresh token의 최대 재사용 횟수로 설명하고 lifespan과 분리한다.

현재 final/document.md에는 이 identifier/설명이 직접 없다.

과거 Library의 실제 Keycloak source snapshot에서는 다음은 확인했다.

revokeRefreshToken == true
refreshTokenMaxReuse == 0
validator message = "refresh token max reuse must be 0"

하지만 그 snapshot에는 Tree의 exact AP1 revision SHA가 없다. 따라서 source content의 보조 확인은 가능하지만 revision-proven reconciliation은 아니다.

3. Referrer-Policy 일반 규칙

현재 Record는 referrer에 전달되는 범위가 Referrer-Policy와 same-origin/cross-origin 관계에 따라 달라진다고 좁혔다. 이전의 “query가 항상 referrer에 남는다”보다 범위를 제한하는 수정이지만, 현재 SSOT에는 Referrer-Policy 자체가 직접 기록돼 있지 않다.

이 항목 역시 현재 local SSOT만으로는 source-derived claim으로 완결되지 않는다.

대조했는데 맞은 것

  • 위 핵심 주장 10개 그룹: current SSOT와 일치하거나 현재 SSOT가 명시한 미검증 범위를 유지함.
  • local evidence checker: mismatch 0.

대조하지 못한 것

  • live/exact revision source reconciliation: 1 source repository class.
  • 그 영향으로 exact source provenance를 요구하는 변경 주장 일부는 최종 확정하지 않음.

결론: 문서 내용이 틀렸다고 판정한 것은 아니며, source repository가 복구되기 전에는 fact-reviewer 최종 PASS를 발급하지 않는다.