[개발일지] CORS와 세션 검사

이건희·2024년 1월 4일
0

Eyeve Project

목록 보기
4/10

React와 Spring boot를 합치는 과정에서 CORS 문제가 발생했고, 이를 아래처럼 메서드를 추가하여 해결했었다.

@Configuration
public class WebConfig implements WebMvcConfigurer {

    /*
    CORS 문제 해결 메서드
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("*")
                //.allowedOrigins("http://localhost:3000")
                .allowedMethods("OPTIONS", "GET", "POST", "PUT", "DELETE")
                .allowCredentials(true);
    }

    /*
    Interceptor 등록, 세션 처리 메서드
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/users", "/users/login");
    }
}

하지만 세션 쪽에서 알 수 없는 CORS 문제가 발생 했었고, 한동안 어떤것이 문제인지 알 수 없어 방황 했었다.

CORS 개념에서 이에 대한 해결 방법을 알 수 있었는데, CORS는 본 요청을 보내기 전에 Preflight라는 예비 요청을 보내는데, 본 요청에는 세션ID가 담겨 세션 검사를 통과하지만, Preflight에는 세션ID가 담기지 않아 세션 검사에서 막혀 버렸던 것이었다.

이를 해결하기 위해 Preflight 요청은 HTTP Method가 OPTIONS이기 때문에 이를 세션 검사 클래스에 별도로 설정하여 해결하였다.

아래는 세션 검사 클래스이다.

@Slf4j
public class LoginInterceptor implements HandlerInterceptor {

    /*
    세션 처리 메서드
    - 세션을 조회하여 유효하면 요청 진행
    - 세션이 유효하지 않을 시, 401 Unauthorized 응답
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(false);
        if(request.getMethod().equals("OPTIONS")){
            return true;
        }
        if (session == null) {
            response.sendError(401);
            log.info("No Session : request URL : " +request.getRequestURL());
            return false;
        }
        User user = (User) session.getAttribute("user");
        if (user == null) {
            response.sendError(401);
            log.info("No User Session : request URL : " +request.getRequestURL());
            return false;
        }
        log.info("success URL : " + request.getRequestURL());
        return true; //현재 요청 계속 처리
    }

}
  • HTTP Method가 OPTIONS이면, Preflight이므로 이는 true를 반환하게 하여 세션 검사를 통과하게 하였다.
  • 이외에는 기존 세션 검사와 같게 세션이 없거나 유효하지 않다면 false를 반환하게 하였다.

처음에는 문제를 알 수 없어 쿠키가 안 담기는 건가 싶어 따로 쿠키 설정인 HTTP only, SameSite, Secure 등 여러 가지 설정도 건드려 보고 프론트엔드 쪽 문제인가 싶어 여러가지 건드려 봤지만 해결이 안 되었었는데, 이렇게 Preflight는 허용하니 바로 해결되었다.

profile
백엔드 개발자가 되겠어요

0개의 댓글