사용자가 기능을 처음 요청할 때 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에서) |
크롬 개발자 도구(F12) → Network 탭에서 첫 요청과 재요청의 Method(GET/POST 등) 확인
POST인데 Controller는 @GetMapping이라면 405 발생OPTIONS일 경우, Spring Security가 OPTIONS 요청을 차단했을 수 있음@PostMapping("/my-feature") // 혹은 @GetMapping
public String handleFeature(...) { ... }
View에서 이 URL로 GET인지 POST인지 확인하고, Controller와 메서드가 일치하는지 확인
HttpSecurity 설정에서 CSRF, CORS, OPTIONS 허용 여부를 점검:
http
.csrf().disable() // 혹은 필요 시 토큰 방식 적용
.authorizeHttpRequests()
.requestMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.anyRequest().authenticated()
특히 JS가 초기 요청을 OPTIONS로 보내는 경우 permitAll()로 허용해야 함
<form method="post">인데 Controller는 @GetMapping이면 405POST인데 Controller는 @GetMapping이면 405http
.csrf().disable()
.authorizeHttpRequests()
.requestMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.anyRequest().authenticated();
DOMContentLoaded 이후에 AJAX 호출되도록 보장method, action 올바르게 지정되어 있는지 확인| 문제 원인 | 조치 |
|---|---|
| 405 에러 발생 후 새로고침 시 정상 작동 | 💡 초기 요청 시 보안 필터나 메서드 미스매치로 405 발생 가능성 |
| 가장 가능성 높은 원인 | ✅ Spring Security의 OPTIONS 요청 미허용 또는 요청 메서드 불일치 |
| 추천 조치 | 🔧 SecurityConfig에 OPTIONS 허용, Controller 매핑 검토, View 요청 메서드 점검 |