우리가 배운 기존의 코드에서는,

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 설계 또는 접근권한 설정을 잘못 할 경우, 회원이 상품 조회를 못하는 일이 발생함!

그에대한 해결책으로

  1. HTTP 메서드 기반 접근제어

    1. HTTP 메서드(GET, POST, PUT, DELETE 등)에 따라 접근 권한을 다르게 설정함
    http
        .authorizeHttpRequests((requests) -> requests
            .requestMatchers(HttpMethod.GET, "/api/v1/product/**").permitAll()  // GET 요청은 모두 허용
            .requestMatchers(HttpMethod.POST, "/api/v1/product/**").authenticated()  // POST 요청은 인증 필요
            .anyRequest().authenticated()  // 그 외의 모든 요청은 인증 필요
        );
    
  2. 컨트롤러 레벨에서 설정

    1. Spring Security의 @PreAuthorize와 같은 애노테이션을 사용해 컨트롤러의 메서드 레벨에서 접근제어를 할 수 있음
    @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 설계 자체를 권한에 따라 나눈 후 패턴을 사용할 수도 있고,

컨트롤러 단에서 지정해주는 방식도 있음

우리 팀은 어떤 방식을 선택할지는 모르겠으나, 알아두면 좋을듯!