본문 바로가기
☕ Java 웹 프로그래밍/Servlet & JSP

[Servlet&JSP] 사용자 입력: 한글 입력 문제

by 일단연 2023. 5. 24.

* 본 글은 [뉴렉처]의 Servlet&JSP 프로그래밍 강의를 듣고 정리한 글입니다.

 

2020 Servlet&JSP 프로그래밍

 

www.youtube.com

 

 사용자 입력: 한글 입력 문제 

  • POST 요청에 한글을 입력하면 깨지는 문제점

POST 요청 처리 과정

  • 1) 입력 폼을 받기 위해 클라이언트가 서버에 GET 요청
  • 2) 사용자가 값을 입력
  • 3) 입력 폼에 값을 담아 클라이언트가 서버에 POST 요청
  • 4) 서버는 그 값을 출력
  •  

멀티 바이트 문자 전송 문제: 사용자로부터 값을 입력받아 전송할 때 발생

  • POST 요청으로 한글을 입력하면 깨지는 문제
    • 서버가 브라우저에 값을 출력할 때의 문제가 아닌, 클라이언트가 서버에 POST 요청을 보낼 때 발생한 문제
  • UTF-8은 멀티 바이트 문자
    • 문자 하나당 숫자 하나가 연관되어 있음
    • 영문자는 알파벳 하나당 숫자 하나가 1byte면 충분
    • 한글, 일본어, 중국어: 영문자 위에 얹어진 확장된 숫자를 이용해 문자와 연관됨. 문자와 연결되어 있는 코드 값이 2byte
    • 멀티 바이트: 문자 하나당 숫자 하나가 연관되어 있는데, 그숫자의 크기가 2byte 이상일 경우
  • 멀티 바이트 문자 전송 문제가 발생하는 과정
    • 1) POST로 한글을 전달할 때 기본적으로 2byte를 하나로 인코딩
    • 2) 서버에서도 2byte를 하나로 인코딩해야 하지만, Tomcat의 기본적인 인코딩 방식은 ISO-8859-1(1byte를 하나로 인코딩)
    • 3) 서버에서 한글이 깨져서 전달됨
    • 4) 서버에서 클라이언트로 깨진 값을 응답하니 브라우저에서도 한글이 깨져서 출력됨
    •  

멀티 바이트 문자 전송 문제의 해결 방법 2가지

  • 클라이언트가 POST 요청으로 전달한 값을 UTF-8로 인코딩하라고 서버에 요청해야 함
  • 해결 1) Tomcat 홈 디렉토리>conf>server.xml의 <Connector>태그에 URIEncoding="UTF-8" 삽입
<Connector port="8090" protocol="HTTP/1.1"
 connectionTimeout="99999"
 redirectPort="8443"
 maxParameterCount="1000"
 URIEncoding="UTF-8"
/>

 

  • 해결 2) 서버 설정을 변경할 수 없는 경우, 서블릿마다 아래의 코드를 작성
    • request.setCharacterEncoding(”UTF-8”);
protected void service(HttpServletRequest request
                      , HttpServletResponse response)
                      throws ServletException, IOException
{
  response.setContentType("text/html; charset=UTF-8");
  response.setCharacterEncoding("UTF-8");
  request.setCharacterEncoding("UTF-8");
  
  PrintWriter out = response.getWriter();
		
  String title_ = request.getParameter("title");
  String content_ = request.getParameter("content");
		
  out.println(title_);
  out.println(content_);
}
  • 결과