11장. 보안 헤더와 콘텐츠 경계를 기본으로 둔다
Spring Security는 여러 보안 헤더 기본값을 제공한다. 제품에 맞는 CSP, frame ancestor, referrer policy, permissions policy를 추가한다. CSP를 한 번에 강제하면 결제나 분석 스크립트가 깨질 수 있으므로 report-only에서 위반을 수집하고 허용 출처를 줄인 뒤 강제한다.
http.headers(headers -> headers
.contentSecurityPolicy(csp -> csp
.policyDirectives("default-src 'self'; frame-ancestors 'none'; object-src 'none'")));
TLS 종료가 CDN이나 ingress에 있어도 애플리케이션과 내부 구간의 신뢰를 별도로 평가한다. HSTS는 HTTPS가 안정적으로 전 사이트에 적용된 후 사용하며, 잘못된 preload는 복구가 어렵다. 클릭재킹을 막기 위해 iframe이 정말 필요한 경로만 별도 정책으로 분리한다.
파일 업로드는 확장자 검사로 끝나지 않는다. 크기 제한, MIME 감지, 격리 저장, malware 검사, 랜덤 저장 이름, 다운로드 시 Content-Disposition, 접근 권한 재검사를 적용한다. 사용자 HTML을 보여 준다면 검증된 sanitizer와 CSP를 함께 쓴다.