HTTP헤더의 중복되는 키값

HttpURLConnection.addRequestProperty 에 대해서…
HTTP Header를 똑같은 이름의 값이 다른 헤더를 2개 보낸다고 가정하면 키가 2개가 되는게 아니라 키는 1개에 값을 컴머로 구분해서 보내진다.라고 생각을 하였으나 사실은 그렇지 않은것 같다.
javadoc을 살펴보면 addRequestProperty은 단지 이미 헤더값이 설정되어 있으면 덮어씌우지 않는다고만 나온다.
setRequestProperty은 이미 헤더값이 설정되어 있어도 값을 덮어씌운다고 나온다.
실제 샘플 코드로 확인해봐도 그렇다…

따라서 아래와 같은 코딩은 잘못되었다.

myUrlConnction.setRequestProperty(“Accept”, “text/html”);
myUrlConnction.addRequestProperty(“Accept”, “text/*”);

Accept: text/html 만 보내지게 된다.

둘모두를 보내려면 코딩하는측에서 아래와 같이 2개의 항목을 합쳐서 설정해야 한다.

myUrlConnction.setRequestProperty(“Accept”, “text/html, text/*”);

하지만 그전에 알아두어야 할것은 HTTP헤더는 같은 항목을 2개 보낼 수 없다는것이다.
예를들어 Authorization헤더의 경우 클라이언트를 인증하는 Basic인증등에서 쓰이는데 여기에 값을 2개 설정한다고 가정해보자.

Authorization: Basic aWQ6cHc=
Authorization: Bearer mytoken

이 경우 위의 Basic인증은 Apache에서 설정된 htpasswd의 인증값이라 가정하고 뒤의 Bearer값은 실제 AP서버에서 필요로 하는 인증정보라 하자.(oauth등의 경우)
이때 재미있는것은 반드시 Basic이 먼저 와야 한다는 것이다.

Authorization: Bearer mytoken,Basic aWQ6cHc=

만약 위와 같이 보내면 Apache에서 HTTP 401 에러가 발생한다.

Authorization: Basic aWQ6cHc=,Bearer mytoken

위와 같이 보내면 Apache에서 컴머까지만 확인후 인증을 실시한다.
물론 AP서버에서도 Bearer이후를 기준으로 값을 가져와야 한다.

즉, HTTP헤더가 컴머나 세미콜론등으로 구분되어 있다고 해서 자동으로 헤더를 2개나 그 이상으로 인식해주지 않고 어플리케이션측에서 해당 헤더값을 판별해야 한다는것이다.

아래 RFC를 참조하자.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

어디에서 HTTP헤더가 여러가 존재한다는 내용은 없다.

This entry was posted in HTML. Bookmark the permalink.