3장. ContractHub를 실행하고 기본 보안을 관찰한다
spring-boot-starter-security가 classpath에 들어오면 Boot는 기본 보안을 구성한다. 그러나 우리가 SecurityFilterChain을 제공하면 URL 규칙, 로그인 방식, 로그아웃, 헤더를 직접 소유한다. 복사한 설정을 쌓기 전에 /, /api/**, 정적 자원, 오류 경로, 관리 경로의 소유자를 정한다.
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/public/**", "/error").permitAll()
.anyRequest().authenticated())
.formLogin(withDefaults())
.httpBasic(withDefaults());
return http.build();
}
예제의 HTTP Basic은 curl과 자동 테스트를 쉽게 만드는 학습 장치다. 운영 브라우저 서비스의 기본안은 HTTPS 위의 서버 세션 또는 검증된 OIDC 로그인이고, API는 짧은 수명의 Bearer token을 검증하는 resource server다. “Basic이 있으니 비밀번호를 매 요청에 보내도 된다”로 읽으면 안 된다.
첫 관찰은 성공 요청보다 실패 요청이다. 익명 GET /api/tenants/ACME/contracts/C-1042는 401, 로그인했지만 권한이 없으면 403, 존재하지 않는 계약은 권한 검사를 통과한 사용자에게만 404가 되어야 한다. 리소스 존재 여부를 403과 404로 어떻게 감출지도 제품 정책으로 정한다.