아주 특이한 경우라 메모를 남겨본다.


jQuery를 이용하여 Ajax 서버 호출을 하는데

서버 요건 때문에 POST로만 호출을 할 수 있는 상황이라

보낼 데이터가 없더라도 GET이 아닌 POST 요청을 하고 있는데

매우 특이하게도 크롬(Chrome) 브라우저에서만,

그것도 HTTPS 일 때만,

그것도 data 없이 POST 요청할 때에만

403 Forbidden: Access is Denied 에러가 발생하는 것이 아닌가!?


즉, 다음과 같은 결과가 발생했다.


언어

Java 1.8

웹 서버

Tomcat 7

브라우저

IE / Edge

Chrome

프로토콜

HTTP

HTTP

HTTPS

HTTPS

HTTP

HTTP

HTTPS

HTTPS

Ajax 호출

$.post

$.post

$.post

$.post

$.post

$.post

$.post

$.post

data

있음

없음

있음

없음

있음

없음

있음

없음

결과

200

200

200

200

200

200

200

403


혹시나 싶어 똑같은 기능을 하고 있는

IIS로 구성된 .NET 서버로 호출해봤더니 멀쩡하게 잘 동작했다.


언어

C# (.NET 4.52)

웹 서버

IIS 8.0

브라우저

IE / Edge

Chrome

프로토콜

HTTP

HTTP

HTTPS

HTTPS

HTTP

HTTP

HTTPS

HTTPS

Ajax 호출

$.post

$.post

$.post

$.post

$.post

$.post

$.post

$.post

data

있음

없음

있음

없음

있음

없음

있음

없음

결과

200

200

200

200

200

200

200

200


즉,

크롬(Chrome) 브라우저에서 HTTPS로 Tomcat 서버에 데이터 없는 POST 요청을 하면 403 에러가 나는 것.

이것은 과연 Tomcat 서버가 문제일까, 크롬이 문제일까?

아니면 둘 다가 문제일까?


F12 개발자 모드로 요청 트래픽을 비교해봐도 IE나 크롬이나 별반 다를 것이 없는데

IE에서는 잘 되고 크롬에서는 403 Forbidden 에러가 발생했다.


또, Postman으로 똑같이 요청을 만들어서 호출해 봤더니 크롬처럼 403 에러가 발생했다.

아니, 그렇다면 IE가 잘 되는 것이 문제인 것일까?



...



해결 방법은 contentType을 명시적으로 넣어주는 것이었다.


contentType을 넣어주기 위해서는 $.post를 $.ajax로 변경해야 하고,

아래와 같이 써 주어야 한다.


$.ajax( {
    type: "POST",
    contentType: "application/x-www-form-urlencoded; charset=UTF-8",
    ... } )


아래 참조 링크된 jQuery 사이트를 봐도 위 contentType이 기본값으로 들어가기 때문에 

명시적으로 넣을 필요가 없을 것 같은데 대체 왜 이렇게 해야 하는지 이유는 잘 모르겠다.


>> 참조: http://api.jquery.com/jquery.ajax/




이상으로 짐작할 수 있는 것은,

아마도 IE에서는 POST 요청인 경우 contentType이 없으면 자동으로 붙어서 넘어가는 모양이다. 

F12 개발자 모드에서도 안 잡히면서 말이다...





Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]