14장. 메서드 보안으로 업무 경계를 지킨다
@EnableMethodSecurity를 켜면 @PreAuthorize, @PostAuthorize, filter 계열을 사용할 수 있다. Boot starter만 추가했다고 자동 활성화되지 않는다. 메서드 보안 공식 문서는 service 계층 강제와 method parameter 기반 세밀한 인가를 주요 용도로 설명한다.
@PreAuthorize("@contractAuthorization.can(authentication, #tenantId, #action)")
ActionReceipt act(String tenantId, String contractId, String action) {
// authorization 다음에도 도메인 상태 전이를 검증한다.
}
긴 SpEL에 정책을 다 넣지 않는다. ContractAuthorization 같은 Java bean으로 꺼내면 IDE 지원, 단위 테스트, 결정 근거 구조화를 얻는다. @PostFilter로 대량 결과를 메모리에서 지우기보다 SQL부터 tenant 조건을 포함한다. 공식 문서도 in-memory filtering 비용을 주의하라고 설명한다.
프록시 기반이므로 같은 객체 안에서 self-invocation하면 method interceptor를 거치지 않을 수 있다. 공개 service 경계를 나누고 통합 테스트로 실제 bean을 호출한다. annotation이 interface와 구현에 충돌하는 경우도 시작 실패나 예상 밖 정책을 만들 수 있어 한 위치 원칙을 정한다.