Preflight란? (CORS)

1. 정의

  • Preflight(프리플라이트) 요청
    브라우저가 “실제 요청 전에” 서버에 OPTIONS 메서드로 사전 질의하는 과정입니다.
  • 목적은:
    “내가 앞으로 이 API에 특수 헤더/메서드/쿠키 등을 붙여서 요청해도
    서버가 허락해주는지 먼저 확인하겠다”는 것.

2. 언제 Preflight가 발생하는가?

  • 브라우저가 CORS 규칙 위반 요청을 하려 할 때
    (예: 커스텀 헤더, 인증 필요, JSON POST 등)
  • 예시:
    • Authorization, X-CUSTOM-TOKEN 같은 커스텀 헤더 포함
    • Content-Type이 application/json 등 표준이 아닐 때
    • 메서드가 GET/POST/HEAD가 아닌 경우 (PUT, PATCH, DELETE 등)

3. Preflight의 실제 동작 순서

  1. 브라우저가 서버로 OPTIONS 요청 전송
    • 헤더:
    • pgsql
      복사편집
      Origin: http://localhost:63342 Access-Control-Request-Method: POST Access-Control-Request-Headers: authorization,content-type,x-plannext-token
  2. 서버가 CORS 허용 응답을 내려줘야 함
    • 필수 응답 헤더:
    • mathematica
      복사편집
      Access-Control-Allow-Origin: http://localhost:63342 Access-Control-Allow-Methods: POST, GET, OPTIONS, ... Access-Control-Allow-Headers: authorization, content-type, x-plannext-token
  3. 200 OK로 응답
  4. 브라우저가 “이제 진짜(POST 등) 요청을 보낼 수 있겠군!” 하고
    실제 API 호출을 보냄

4. Spring/Security에서 주의할 점

  • OPTIONS(Preflight)는 인증/토큰/비즈니스 검증/로깅 절대 하지 말고, 바로 통과시켜야 함
  • CORS 필터가 OPTIONS 요청에 대해 위 헤더와 200 OK만 리턴해야 브라우저가 통과 허락
  • Preflight가 실패하면 실제 요청 자체가 서버에 도달하지 않음

5. 실전 실수 패턴

  • OPTIONS 요청을 인증, 토큰 필터에서 검증해버림 → 무조건 CORS 실패
  • Security에서 OPTIONS를 permitAll 안 함 → 무조건 CORS 실패
  • CorsWebFilter 설정이 빠짐 → 브라우저에 CORS 헤더 없음

6. 네트워크 분석 꿀팁

  • F12 → Network → OPTIONS 요청 →
    응답 헤더에 Access-Control-Allow-*가 있는지 항상 확인!
  • 이게 없으면 실제 POST가 절대 서버에 안 옴

7. 결론

  • Preflight는 “실제 요청 전, 브라우저가 서버에 물어보는 사전 질의(OPTIONS)”
  • 서버는 200 OK와 올바른 CORS 허용 헤더만 주면 OK!
  • 실제 인증/토큰/로깅 등은 진짜 API(POST 등) 요청에만 적용
반응형