Spring Security는 어디까지 책임지는가
3줄 요약
- Spring Security는 인증, 인가, SecurityContext, CSRF/CORS/header 같은 공통 웹 보안 경계를 제공하지만 비즈니스 소유권과 데이터 정책을 자동으로 만들어 주지는 않는다.
- FilterChain은 요청이 Controller에 들어오기 전의 공통 경계이고, Method Security와 AuthorizationManager는 호출 단위 권한 결정을 돕는다.
- IDOR, Mass Assignment, SQL Injection, XSS 출력 인코딩, secret 관리, 로그 마스킹, gateway/WAF 운영은 애플리케이션과 인프라가 별도로 책임져야 한다.
핵심 정리
- Spring Security의 기본 책임은 “누구인지 확인하고, 허용된 요청/메서드인지 판단하고, 보안 context를 전달하는 것”이다.
- Authentication은 신원 확인 결과이고 Authorization은 특정 resource와 action에 대한 허용 결정이다.
- SecurityContext는 현재 실행 흐름의 인증 정보를 담지만, 비동기/배치/메시지 경계에서는 전파와 초기화를 따로 확인해야 한다.
- URL 권한은 시작점이고 객체 소유권은 Service/Repository 조건으로 다시 확인해야 한다.
- Gateway와 WAF는 공통 차단, rate limit, TLS termination, 관측을 돕지만 애플리케이션 권한 모델을 대신하지 않는다.
- Spring Security를 켰다는 말은 보안 설계 완료가 아니라 공통 보안 프레임워크를 선택했다는 뜻에 가깝다.
하위 문서 연결
-
- Security FilterChain의 책임: 요청 matcher, filter 순서, 예외 endpoint, CSRF/CORS/header 설정의 책임을 다룬다.
-
- Authentication Provider SecurityContext: credential 검증, principal 최소화, SecurityContext 전파와 오염 위험을 정리한다.
-
- Authorization Manager Method Security: URL 권한과 method 권한, policy service, self-invocation, repository ownership 조건을 연결한다.
-
- Gateway WAF Infra와 책임 경계: gateway/WAF/infra가 맡는 공통 방어와 애플리케이션이 다시 확인해야 하는 경계를 나눈다.
-
- Spring Security로 해결되지 않는 보안 문제: 입력 검증, 출력 인코딩, business abuse, secret, 로그, crypto, 데이터 모델 책임을 정리한다.
헷갈리는 지점
anyRequest().authenticated()면 인가가 끝났다고 생각하기 쉽다.
- 이것은 로그인 여부 확인이지 특정 주문, 결제, 관리자 action 접근 허용이 아니다.
- resource ownership과 business permission은 별도 정책이 필요하다.
- Method Security를 쓰면 Repository 조건이 필요 없다고 생각하기 쉽다.
- method 권한은 호출 허용을 결정하지만 데이터 조회 범위가 넓으면 실수와 우회가 남는다.
findByIdAndMemberId 같은 데이터 경계가 같이 있어야 한다.
- WAF가 있으면 애플리케이션 검증을 줄여도 된다고 생각하기 쉽다.
- WAF는 generic attack pattern을 줄일 수 있지만 비즈니스 권한과 상태 전이는 모른다.
- false positive와 bypass 가능성도 운영 경계에 포함해야 한다.
- SecurityContext의 principal을 곧 최신 사용자 상태라고 믿기 쉽다.
- 세션이나 token에 담긴 권한은 변경 뒤 stale할 수 있다.
- 민감 action은 서버 DB나 policy service에서 최신 상태를 확인한다.
확인 질문
- Spring Security가 주로 책임지는 것은 무엇인가?
- 인증, 인가 인프라, SecurityContext, 공통 웹 보안 설정, filter 기반 요청 보호다.
- Spring Security만으로 해결되지 않는 대표 문제는 무엇인가?
- 객체 소유권, Mass Assignment, SQL Injection, XSS 출력 인코딩, secret 관리, 로그 마스킹, abuse detection이다.
- 책임 경계를 검증하는 가장 좋은 방법은 무엇인가?
- FilterChain/Method Security 테스트와 함께 Service/Repository 권한 테스트, 실패 로그, 운영 설정 검증을 연결하는 것이다.