DPoP (RFC 9449)
액세스 토큰을 클라이언트 키에 결속합니다. 토큰만 탈취해도 해당 키 없이는 쓸 수 없습니다. PAR 시점·인가코드 교환 시점·자원 접근 시점 전부에서 jkt 일치를 검증합니다.
Security
각 항목은 코드에 대응물이 있고, 잘못된 조합이 실제로 거부되는지는 컨포먼스 스위트가 확인했습니다.
액세스 토큰을 클라이언트 키에 결속합니다. 토큰만 탈취해도 해당 키 없이는 쓸 수 없습니다. PAR 시점·인가코드 교환 시점·자원 접근 시점 전부에서 jkt 일치를 검증합니다.
plain 방식은 거부합니다.
인가 요청을 사전 등록하고 브라우저로는 request_uri만 전달합니다. 서명 없는 직접 인가 요청은 400 invalid_request 로 거부합니다.
제시되는 자격증명이 지갑 보유 키에 묶여 있는지 검증합니다. nonce·aud·sd_hash 불일치는 모두 거부합니다.
위 동작은 FAPI 2.0 Security Profile FINAL 모듈로 시험했고, 잘못된 조합은 전부 거부되는 것을 확인했습니다.
모든 운영 행위(로그인, 발급, 폐지, 신뢰목록 변경, 권한 조회)를 해시 체인으로 기록합니다. 각 이벤트가 직전 이벤트의 해시를 포함하므로, 중간 레코드를 지우거나 바꾸면 체인이 깨집니다. 관리자 웹에서 무결성 재검증을 실행해 검증 결과를 확인할 수 있습니다.
필터(행위자·리소스·기간·결과)와 JSONL 내보내기를 지원합니다. 감사 대응 시 그대로 제출 가능한 형식이며, append-only JSON Lines + SHA-256 구조입니다. 전자금융감독규정 §15와 개인정보보호법의 로그 보존 요건을 염두에 두고 설계했습니다.
| 위협 | 대응 |
|---|---|
| 발급 엔드포인트 폭주 | Bucket4j 이중 버킷 — 엔드포인트별 + 전역 레이트 리밋 |
| 중복 요청으로 인한 이중 발급 | Idempotency-Key 기반 차단 (Redis SETNX, 24시간 보존) |
| 인가코드 재사용 | 1회 사용 후 즉시 폐기. 재사용 시도 시 해당 토큰까지 함께 폐기 |
| request_uri 재사용·만료 | 둘 다 400. 컨포먼스 시험 항목 |
| 미등록 redirect_uri | allowlist 검증 (FAPI2 요건) |
전송 구간은 TLS 1.2 이상(운영 권장 1.3)이며 mTLS 구성이 가능합니다. 자격증명 제시 응답은 direct_post.jwt — 검증자에게 가는 응답 자체가 암호화·서명됩니다. 관측은 Prometheus · OpenTelemetry · Grafana 로 하고, tail-sampling 으로 에러와 500ms 초과 흐름을 100% 보존합니다.
Veritra는 발급자와 검증자를 별도 시스템으로 배포합니다. 관리자 웹도 발급자용·검증자용이 분리되어 있고, 한쪽의 인증 토큰은 다른 쪽에서 통하지 않습니다. 발급자와 검증자가 법적으로 다른 주체인 신뢰 삼각형 구조를 시스템 경계로 그대로 옮긴 것입니다.