feat(ap3): add CSRF and SameSite defenses

This commit is contained in:
donghyeon-ka
2026-07-25 14:42:33 +09:00
parent b48a12f101
commit 4495eb63a0
11 changed files with 214 additions and 32 deletions
+15 -7
View File
@@ -17,12 +17,20 @@ Resource Server는 `aud=keycloak-pattern-api`를 검증합니다. 브라우저
보관합니다. BFF를 재시작하면 세션이 사라집니다. 다중 인스턴스 운영에서는
Spring Session/Redis 같은 공유 저장소와 저장 token 암호화 정책이 필요합니다.
## 방어 전 CSRF 재현
## CSRF와 SameSite 방어
feature 브랜치에서는 다음 CSRF 방어 feature와 비교하기 위해 CSRF를
의도적으로 끕니다. 다른 origin의 자동 제출 form이 브라우저 cookie를
자동으로 포함해 `/bff/api/preferences` 상태를 바꾸는 것을 E2E에서
재현합니다.
`feature/keycloak-bff-oauth2login-session`에서는 방어 전 비교 위해
CSRF를 끄고, 다른 origin의 자동 제출 form이 `/bff/api/preferences`
상태를 바꾸는 것을 재현합니다.
이 취약 상태는 `feature/keycloak-bff-csrf-samesite-defense`에서 Spring
CSRF token과 명시적 SameSite=Lax를 적용해 차단합니다.
`feature/keycloak-bff-csrf-samesite-defense`에서는 다음 방어를 함께
적용합니다.
- Spring synchronizer CSRF token과 `CookieCsrfTokenRepository`
- JS가 읽는 `XSRF-TOKEN`과 요청의 `X-XSRF-TOKEN` header
- HttpOnly `AP3_SESSION` cookie의 명시적 `SameSite=Lax`
E2E는 token 없는 동일 위조 POST가 403이 되는 것, CSRF header가 있는
정상 POST는 200인 것, cross-site POST에는 AP3 session cookie가 제외되는
것을 각각 확인합니다. SameSite는 CSRF token을 대체하지 않는
defense-in-depth입니다.