JSP 파라미터[Parameter] 값의 인코딩과 디코딩
웹 브라우저는 웹서버에 파라미터를 전송할 때 알맞은 캐릭터 셋을 이용해서 파라미터 값을 인코딩하여 전달한다.
반대로 웹 서버는 알맞은 캐릭터 셋을 이용해서 웹브라우저가 보내온 파라미터를 디코딩한다.
어떤 캐릭터 셋을 이용할지의 여부는 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