Language/JSP

JSP 파라미터[Parameter] 값의 인코딩과 디코딩

적외선 2014. 1. 14. 12:53

웹 브라우저는 웹서버에 파라미터를 전송할 때 알맞은 캐릭터 셋을 이용해서 파라미터 값을 인코딩하여 전달한다.

반대로 웹 서버는 알맞은 캐릭터 셋을 이용해서 웹브라우저가 보내온 파라미터를 디코딩한다.

 

어떤 캐릭터 셋을 이용할지의 여부는 GET방식과 POST방식에 따라 다르다.

 

1.POST방식

 

POST방식에서는 응답결과에 사용하는 캐릭터셋을 이용해서 파라미터를 인코딩한다.

<%@ page contentType="text/html; charset="EUC-KR" %>

 

위와 같이 응답결과에 사용할 캐릭터셋을 'EUC-KR'로 설정한 경우 웹브라우저는 해당 캐릭터셋을 이용해서 인코딩한 파라미터를 웹서버에 전달한다.

 

서버에서 인코딩된 파라미터 값을 사용하기 위해선 알맞은 캐릭터셋으로 디코딩 해주어야 하는데JSP에서는 request기본객체가 제공하는

setCharacterEncoding() 메서드를 이용해서 파라미터 값을 디코딩 할 때 사용할 캐릭터 셋을 지정해준다.

<%

  request. setCharacterEncoding("euc-kr");

%>

 

위 스크립트릿에서 request 기본객체를 이용해서 디코딩 할 때 사용할 캐릭터셋을 지정해 주었다.

위와같이 지정하지 않는경우 기본적으로 사용되는 캐릭터셋 기본값은 "ISO-8859-1"이다.

 

한가지 주의 할 점은 파라미터 값을 읽어오기 이전 최 상단에 디코딩 할 때 적용할 캐릭터셋을 지정해 주저야 한다는 것이다.

그렇지 않을 경우, 파라미터를 읽어온 이후에 설정하는 것은 소용없다. 그런경우 자동으로 "ISO-8859-1" 로 디코딩 된다.

<%

  String name = request.getParameter("name");

  request. setCharacterEncoding("euc-kr");

  String country = request.getParameter("country");

%>

 

위처럼 이미 request.getParameter("name"); 를 사용한 이후에 지정할 경우에는 모두 "ISO-8859-1" 캐릭터 셋이 이용된다.

request.getParameter("country"); 의 경우 또한 마찬가지 이다.

 

 

2.GET방식

 

GET방식의 경우 파라미터 전송방법에 따라 인코딩이 다르게 결정된다.

(1)<a>태그의 링크 태그에 쿼리 문자열 추가

= 웹 페이지 인코딩 사용

(2)HTML 폼의 메서드 속성값을 "GET"으로 지정해서 폼을 전송

=웹 페이지 인코딩 사용

(3)웹 브라우저의 주소에 직접 쿼리 문자열 포함한 URL 입력

=웹 브라우저마다 다름

 

GET 방식에서는 POST방식에서처럼 request 기본객체를 통한 디코딩 시 사용할 캐릭터셋 지정이 불가능하다.

서블릿 규약에 따라 setCharacterEncoding() 메서드는 HTTP 프로토콜의 데이터 영역을 인코딩 할 때 사용한 캐릭터 셋을 지정할 때 사용된다.

POST방식은 팔라미터를 데이터영역을 통해서 전달되므로 해당 메서드 사용이 가능하지만 GET 방식은 요청 라인에 URI와 함께 파라미터가 전달되기 때문에

setCharacterEncoding() 메서드에서 지정한 캐릭터셋이 적용되지 않는 것이 원칙이다.

 

(3)번에서 말한 것 처럼 웹브라우저에 직접 쿼리 문자열을 포함하는 경우 브라우저마다 기본 캐릭터셋이 다르게 적용된다.

IE : 현재 웹 브라우저에 선택되어 있는 캐릭터 셋을 이용해서 파라미터 값을 인코딩.

사파리,크롬 : UTF-8 을 기본값으로 인코딩.

 

GET 방식으로 전달되는 파라미터 값을 지정한 캐릭터 셋으로 알맞게 읽어오는 방법은 WAS에 따라 다른데 가장 많이 사용하는 톰캣을 기준으로 설명하면 두가지 방법이 있다.

 

(1)server.xml 파일에서 <Connector>의 useBodyEncodingForURI 속성의 값을 true로 지정하는 방법

(2)server.xml 파일에서 <Connector>의 URIEncoding 속성으 ㅣ값으로 원하는 캐릭터 셋을 지정하는 방법

 

(1)번 방법은 [톰캣설치디렉터리]/conf/server.xml 파일을 수정한다.

<Connector port="8080" protocol="HTTP/1.1"

   connectionTimeout="20000"

   redirectPort="8443"

    useBodyEncodingForURI="true" />

 

위 처럼 useBodyEncodingForURI의 옵션을 "true" 로 지정하면 GET 방식으로 전달되 파라미터도 setCharacterEncoding()메서드로 지정한 캐릭터 셋이 적용된다.

 

(2)번 방법 또한 [톰캣설치디렉터리]/conf/server.xml 파일을 수정한다.

<Connector port="8080" protocol="HTTP/1.1"

   connectionTimeout="20000"

   redirectPort="8443"

    URIEncoding="euc-kr" />

 

위 경우 URIEncoding 에서 지정한대로 항상 "euc-kr" 로 캐릭터셋을 지정하여 인코딩 된 값을 디코딩하여 읽어오게 된다.

(1)번과 (2)번을 동시에 다 적용할 수 있는게 그런 경우 setCharacterEncoding()메서드를 통해 지정한 캐릭터셋을 이용한다.


출처 - http://blog.naver.com/PostView.nhn?blogId=hckind&logNo=20153048048