오류 메시지 (개발자도구 자바스크립트 콘솔)
GET https://localhost/(method 경로) 400 (Bad Request)
결제페이지 내 셀렉트박스에서 쿠폰 정보를 불러와야 하는 상황에서 오류가 발생했다.
1) [콘솔창] 400 Bad Request
2) [프론트 페이지] 쿠폰 셀렉트박스 Null
3) [서버 로그] 쿠폰맵 Null
1. 원인
Javascript
$.ajax({
url: "method",
type: "get",
headers: {
"Content-Type": "application/json"
},
dataType: "json",
async: false,
success: function (data) {
...
}
});
Controller.java
RequestMapping(value = "method", method = RequestMethod.GET)
public ResponseEntity<List<CouponDTO>> method(HttpSession session) throws Exception {
// 생략
}
1) 의미 없는 헤더
내가 작성한 Ajax 요청은 아니지만, 어쨌든 에러가 나서 봤는데 헤더 부분이 잘못된 것 같다.
GET 요청인데 'Content-Type: application/json'을 넣고 있는 것이 문제였다.
'Content-Type: application/json'은 '요청의 본문(body)이 JSON 형식'이라고 서버에 알려주는 역할을 하는데,
해당 부분은 POST일 때만 의미가 있다.
GET 요청에는 본문(body)이 없기 때문에 데이터를 보내더라도 URL 쿼리 스트링으로만 전달된다.
즉, 이번 이슈의 원인은 GET 요청에 'Content-Type: application/json'을 지정하면 의미 없는 헤더를 강제로 붙였기 때문에 발생한 셈이다.
Content-Type을 'application/x-www-form-urlencoded'로 명시할 수도 있지만, 일반적으로 GET 요청은 필요없다.
2) 서버가 비정상적인 요청으로 간주
Spring의 '@RequestMapping(method = GET)' 컨트롤러는 기본적으로 다음과 같은 요청을 기대한다.
GET /searchMyCoupon HTTP/1.1
Host: example.com
Accept: application/json
하지만 헤더를 붙인 Ajax 요청은 아래와 같다.
GET /searchMyCoupon HTTP/1.1
Host: example.com
Content-Type: application/json
이 경우, 서버는 '본문이 없는 GET 요청인데 왜 Content-Type이 JSON이지?' 라고 판단해서 400 (Bad Request)를 응답할 수 있다.
3) jQuery가 빈 body를 함께 전송
jQuery는 Content-Type을 설정할 경우, 명시적으로 data가 없어도 빈 body를 포함시킬 수 있다.
이게 서버 입장에서는 아래와 같은 문제가 될 수 있다.
- GET 요청은 본문이 없어야 정상이나, 이 설정 때문에 본문이 생겨버림
- Spring은 이걸 규격 위반으로 보고 400 Bad Request를 반환
2. 해결
Ajax 요청하는 부분에서 headers를 제거한다.
$.ajax({
url: "method",
type: "get",
dataType: "json",
async: false,
success: function (data) {
...
}
});
headers를 제거하면 jQuery는 기본적으로 GET 요청에는 본문(body), Content-Type도 포함하지 않는다.
따라서 아래의 요청이 나간다.
GET /method HTTP/1.1
Host: localhost
Accept: */*
Spring도 이런 요청은 정상으로 판단하고 200 OK로 응답한다.
급하게 만들어진 프로젝트라 이것말고도 자잘하거나 크게 고칠 게 태산일 것 같은 느낌 ..
휴우 ................................... ~
올리고 싶은 글이 8개나 임시저장에 있는데 바빠서 못올리고 있다 ..
'[Project] > 업무일지' 카테고리의 다른 글
| [카카오 로그인 API] 테스트앱 설정 (2) | 2025.08.12 |
|---|---|
| [Oracle 12c] SQL Error [1502] [72000]: ORA-01502: 인덱스 또는 인덱스 분할영역은 사용할 수 없는 상태입니다 (0) | 2025.07.29 |
| [카카오 공유하기] 카카오톡 공유(개발 모드) 요청 실패 ([adbrix] ERROR: network offline) (0) | 2025.05.15 |
| Exception in thread "main" java.lang.UnsupportedClassVersionError 원인 및 해결 (0) | 2025.04.30 |
| [JavaScript(ES5)/JSP] 바코드 스캔/인식 기능 개발 (+라이브러리 추천) (1) | 2025.04.23 |