85 lines
3.7 KiB
Markdown
85 lines
3.7 KiB
Markdown
# 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이 현재 머신에 없다.
|
|
|
|
~~~text
|
|
AP1 64175266df05545f8f181fc91c1f0364bc47fce9
|
|
AP2 d019846f8725bdb0badde33043b020dc252e32ff
|
|
AP3 934c5da5d6edc2429dfb558b773656e46f21d677
|
|
AP4 f4aea65dc6255eae07b20ebbe21e02fb6115e563
|
|
~~~
|
|
|
|
따라서:
|
|
|
|
~~~text
|
|
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에서는 다음은 확인했다.
|
|
|
|
~~~text
|
|
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를 발급하지 않는다.**
|