우리가 배운 기존의 코드에서는,
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/api/v1/auth/**").permitAll() // 인증 관련 API는 누구나 접근 가능
.requestMatchers("/api/v1/product/**").permitAll() // 상품 조회 관련 API는 누구나 접근 가능
.requestMatchers("/swagger-ui/**").permitAll() // Swagger UI는 누구나 접근 가능
.requestMatchers("/v3/api-docs/**").permitAll() // API 문서화 관련 경로는 누구나 접근 가능
.anyRequest().authenticated() // 그 외의 모든 요청은 인증 필요
);
위와 같이 특정 URL 또는 URL 패턴에따라 접근 권한을 제어하였음
쇼핑몰, 특히 우리의 도메인에서는 많은 기능이 비회원으로도 가능함
/endpoint 설계 또는 접근권한 설정을 잘못 할 경우, 회원이 상품 조회를 못하는 일이 발생함!
그에대한 해결책으로
HTTP 메서드 기반 접근제어
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers(HttpMethod.GET, "/api/v1/product/**").permitAll() // GET 요청은 모두 허용
.requestMatchers(HttpMethod.POST, "/api/v1/product/**").authenticated() // POST 요청은 인증 필요
.anyRequest().authenticated() // 그 외의 모든 요청은 인증 필요
);
컨트롤러 레벨에서 설정
@RestController
@RequestMapping("/api/v1/product")
public class ProductController {
@GetMapping("/{id}")
@PermitAll // 모든 사용자에게 접근 허용
public ResponseEntity<Product> getProduct(@PathVariable Long id) {
// ...
}
@PostMapping
@PreAuthorize("hasRole('ROLE_ADMIN')") // 관리자만 접근 가능
public ResponseEntity<Product> createProduct(@RequestBody Product product) {
// ...
}
}
API 설계 자체를 권한에 따라 나눈 후 패턴을 사용할 수도 있고,
컨트롤러 단에서 지정해주는 방식도 있음
우리 팀은 어떤 방식을 선택할지는 모르겠으나, 알아두면 좋을듯!