웹 개발에서
빼놓을 수 없는 것이
'인코딩' 설정이다.
우리는 웹에서 한글이 ê°ë¯¼êµ¬ 이나 뤱뜲핟뷇와 같이 깨지는 것을 자주 보았다. 한글이 깨지는 이유는 웹브라우저와 웹서버가 서로 다른 인코딩 방식을 사용하기 때문이다.
웹브라우저는 2Byte씩 처리하는 UTF-8 인코딩 방식을 사용하는데, 웹서버는 1Byte씩 처리하는 ISO-8859-1 방식으로 인코딩을 하면, 서로 다른 인코딩 방식 때문에 적절한 디코딩이 이루어지지 않는 것이다.
위와 같이, 한글을 POST 방식과 GET 방식으로 서버에 전송하여, 서버 콘솔을 통해, 서버에 어떻게 값이 전달되었는지 확인해 보았다.
POST 방식은 한글이 깨졌지만 GET 방식은 한글이 깨지지 않았다. GET과 POST가 다른 결과가 나오는 이유는 무엇일까? 우선 나는 meta 태그를 통해 브라우저가 UTF-8 방식으로 한글을 인코딩하도록 설정하였다.
브라우저의 문자셋(charset)은 UTF-8로 세팅되었다. 그리고 F12를 눌러 한글이 어떻게 인코딩 되는지 확인해 보았다.
GET 방식과 POST 방식 모두 '강민구'라는 문자가 "퍼센트 인코딩 방식"으로 인코딩이 되었음을 알 수 있다. 퍼센트 인코딩 방식은 RFC 3986 규약에 따라 표준화된 방식이다.
URL를 통한 데이터 통신은 아스키코드만으로 전송되기로 규정되어있다. 하지만 아스키 코드로 표현하지 못하는 문자들이 있다. 그런 경우, 퍼센트 인코딩 방식을 사용하여 문자를 인코딩한다. 만약 브라우저가 UTF-8 인코딩 방식을 사용한다면 UTF-8 방식을 토대로 퍼센트 인코딩이 이루어진다.
'강민구'라는 한글이 %EA%B0%95%EB%AF%BC%EA%B5%AC로 인코딩된다.
그러므로 GET 방식과 POST 방식 둘다 같은 인코딩 방식으로 서버에 전달되었다. 그러나 결과는 하나는 깨짐, 하나는 정상출력이다. 원인은 웹서버에서 둘을 처리하는 인코딩 방식이 다르기 때문이다.
아파치 톰캣 관련 문서를 살펴보면, HTTP body의 디폴트 인코딩 방식은 ISO-8859-1이라고 적혀있다. ISO-8859-1은 서유럽권 문자를 나타내는데 사용하는 인코딩 방식이다.
HTTP body에 담겨져서 전달되는 방식은 POST 방식을 의미한다. 한마디로 POST 방식으로 전달된 데이터는 톰캣(웹서버)에서 ISO-8859-1 방식으로 디코딩한다는 말이다.
하지만 GET 방식은 다르다.
아파치 API 문서에 따르면, URIEncoding은 URI를 처리하는 인코딩 방식을 설정하는 속성이다. 디폴트 값이 UTF-8이다.
아파치 톰캣 관련 문서에 따르면, 톰캣은 URL 인코딩 방식을 앞으로 ISO-8859-1 방식으로 할 예정이지만, 현재 톰캣 8버전의 URIEncoding 속성의 디폴트는 UTF-8로 설정되어 있다고 말한다. 나는 현재 톰캣 9 버전을 사용하고 있는데, 아직 URIEncoding이 디폴트로 UTF-8로 유지되고 있는 것 같다.
그러므로
GET방식은 UTF-8로 디코딩되어 정상출력이되고 POST방식은 UTF-8을 ISO-8859-1 문자셋으로 인식하여 디코딩하니 문자가 깨지는 것이다. 이렇듯 브라우저와 서버간의 서로 다른 인코딩 방식은 문자의 깨짐으로 이루어진다. 그러므로 적절한 인코딩 설정은 필수다.
정리
웹브라우저와 웹서버는 서로 다른 인코딩 방식을 가지므로, 적절한 인코딩 설정이 필요하다.
참고자료
'Web언어 > JSP' 카테고리의 다른 글
[ JSP ] 상태 유지 ( Session, Cookie ) (0) | 2022.01.25 |
---|---|
[ JSP ] 인코딩(Encoding) 설정 (0) | 2021.06.21 |
[ JSP ] HttpServlet이란? (0) | 2021.06.21 |
[ JSP ] Servlet 과 ServletConfig (0) | 2021.06.20 |
[ JSP ] 서블릿(Servlet) 등록 (web.xml 과 어노테이션) (1) | 2021.06.20 |