티스토리 뷰


발생일: 2013.12.05

문제:
리버스 프록시 역할을 하는 노드 서버를 하나 띄워뒀다.

헌데, 클라이언트에서 `$.ajax()` 로 POST 요청을 보내면 서버에서 제대로 전달하지 못하는 경우가 있다.

왜 그런 걸까~


해결책:

요청은 '클라이언트 --> 노드 프록시 --> 실제 API 서버'로 전달되고,
노드 프록시는 클라이언트의 헤더와 바디를 그대로 API 서버로 전달한다.

클라이언트에서 노드 프록시로는 잘 전달되지만 프록시에서 API 서버로 제대로 전달되지 않았는데,
확인해보니, 원인은 `jquery`에서 POST 데이터를 유니코드로 인코딩할 때, 공백을 `+`로 변환하는 것 때문이었다.



코드에서 `jQuery.param` 부분을 보면, '%20'을 '+'로 강제로 변환하는 부분이 있다.




`+`는 `space`의 이스케이프 캐릭터인데, 실제로 `RFC1738`에 정의되어 있진 않지만,
일단은, 프록시에서 `content-length`를 다시 설정하도록 처리하는 걸로 해결했다.

URL을 표시하기도 편하고, 데이터 사이즈도 줄어드는 장점이 있으니 그렇게 하는 모양이다.
별도의 주석이 달려있진 않다.


여튼, 우린 프록시 서버에서 `+`로 변환된 데이터를 `%20`으로 다시 변환하게 되면서,
`content-length`가 일치하지 않아 발생했던 문제였다.

프록시에서 바디 데이터를 재구성한 후에 `content-length`를 다시 계산해주는 식으로 해결했다.


반응형
댓글
공지사항