feat(ap3): add CSRF and SameSite defenses
This commit is contained in:
@@ -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입니다.
|
||||
|
||||
Reference in New Issue
Block a user