`HTTP 405 Method Not Allowed` 에러 디버깅

이eun·2025년 3월 28일

사용자가 기능을 처음 요청할 때 HTTP 405 Method Not Allowed 에러가 발생하고, 새로고침 후에는 정상 작동한다면, 이 현상은 프론트엔드(View)와 백엔드 컨트롤러 매핑 간의 HTTP 메서드 불일치 또는 시큐리티 필터 문제일 가능성이 높습니다.


🔍 가능성 분석

원인 후보가능성설명
🔒 Spring Security 설정 문제⚠️ 높음첫 요청 시 CORS, CSRF, 인증/인가 문제로 인해 요청이 차단될 수 있음
🧭 Controller 매핑 문제⚠️ 중간뷰에서 요청하는 메서드(GET/POST 등)와 실제 컨트롤러 메서드가 불일치하면 405 발생
🖼 View (Thymeleaf/JS) 문제⚠️ 중간JS가 페이지 로딩 전 실행되어 잘못된 요청을 보낼 경우
🧠 브라우저 캐시 or Preflight 요청 문제⚠️ 낮음일부 초기 요청이 OPTIONS로 보내지는 경우 405 유발 가능 (특히 JS fetch/axios에서)

✅ 우선 확인할 항목

  1. 📍 요청 메서드 확인

    크롬 개발자 도구(F12) → Network 탭에서 첫 요청과 재요청의 Method(GET/POST 등) 확인

    • 첫 요청이 POST인데 Controller는 @GetMapping이라면 405 발생
    • 첫 요청이 OPTIONS일 경우, Spring Security가 OPTIONS 요청을 차단했을 수 있음
  2. 📍 Controller 매핑 확인

    @PostMapping("/my-feature") // 혹은 @GetMapping
    public String handleFeature(...) { ... }

    View에서 이 URL로 GET인지 POST인지 확인하고, Controller와 메서드가 일치하는지 확인

  3. 📍 SecurityConfig 설정 확인

    HttpSecurity 설정에서 CSRF, CORS, OPTIONS 허용 여부를 점검:

    http
        .csrf().disable() // 혹은 필요 시 토큰 방식 적용
        .authorizeHttpRequests()
            .requestMatchers(HttpMethod.OPTIONS, "/**").permitAll()
            .anyRequest().authenticated()

    특히 JS가 초기 요청을 OPTIONS로 보내는 경우 permitAll()로 허용해야 함


🛠️ 해결 방법 예시

1. Controller 메서드와 HTTP 요청 방식이 일치하는지 확인

  • View에서 <form method="post">인데 Controller는 @GetMapping이면 405
  • JS fetch가 POST인데 Controller는 @GetMapping이면 405

2. SecurityConfig 설정 보완 (OPTIONS 요청 허용)

http
    .csrf().disable()
    .authorizeHttpRequests()
        .requestMatchers(HttpMethod.OPTIONS, "/**").permitAll()
        .anyRequest().authenticated();

3. HTML 폼 또는 JS에서 잘못된 초기 요청 방지

  • JS 코드에서 DOMContentLoaded 이후에 AJAX 호출되도록 보장
  • 폼 전송 시 method, action 올바르게 지정되어 있는지 확인

✅ 결론

문제 원인조치
405 에러 발생 후 새로고침 시 정상 작동💡 초기 요청 시 보안 필터나 메서드 미스매치로 405 발생 가능성
가장 가능성 높은 원인Spring Security의 OPTIONS 요청 미허용 또는 요청 메서드 불일치
추천 조치🔧 SecurityConfig에 OPTIONS 허용, Controller 매핑 검토, View 요청 메서드 점검

0개의 댓글