[쿠키 설정시] java.lang.IllegalArgumentException: Control character in cookie value or attribute. 오류 해결 방법
쿠키값 설정시 오류가 발생하였다.
Cookie값으로 한글을 설정할 때 발생하는 오류이다.
쿠키는 콤마(,) 세미콜론(;), 공백문자를 제외한 ASCII 코드로 구성된다. 그럼으로 값을 설정할 때 한글 사용이 불가능하다.
java.lang.IllegalArgumentException: Control character in cookie value or attribute.
at org.apache.tomcat.util.http.LegacyCookieProcessor.needsQuotes(LegacyCookieProcessor.java:412)
at org.apache.tomcat.util.http.LegacyCookieProcessor.generateHeader(LegacyCookieProcessor.java:284)
at org.apache.catalina.connector.Response.generateCookieString(Response.java:940)
at org.apache.catalina.connector.Response.addCookie(Response.java:888)
at org.apache.catalina.connector.ResponseFacade.addCookie(ResponseFacade.java:392)
JAVA Cookie 설정 예제
Cookie cookie = new Cookie("userId", "test");
cookie.setPath("/");
cookie.setMaxAge(60*60*24*365); // 기간을 하루로 지정(60초 * 60분 * 24시간 * 365일)
response.addCookie(cookie);
Cookie linkUrlCookie = new Cookie("userName", "홍길동");
linkUrlCookie.setPath("/");
linkUrlCookie.setMaxAge(60*60*24*365);
response.addCookie(linkUrlCookie);
[오류 해결 방법]
오류 해결을 위해서는 URLEncoder.encode()메소드를 사용하여 UTF-8로 인코딩 처리하면 오류가 발생하지 않는다.
Cookie linkUrlCookie = new Cookie("userName", URLEncoder.encode("홍길동", "UTF-8"));
linkUrlCookie.setPath("/");
linkUrlCookie.setMaxAge(60*60*24*365);
response.addCookie(linkUrlCookie);
만약 jsp 혹은 vue.js 화면 단에서 쿠키값을 가져오는데 한글이 깨지는 경우
decodeURI() 스크립트를 이용하면 한글깨짐은 해결 할 수 있다.
JAVA에서 escape() 처리하는 방법
그런 경우라면 자바 코드단에서 org.apache.commons.lang.StringEscapeUtils를 import 후에 escape()처리하여 쿠키값으로 담아준다.
import org.apache.commons.lang.StringEscapeUtils;
..............생략
Cookie linkUrlCookie = new Cookie("userName", StringEscapeUtils.escapeJava("홍길동"));
linkUrlCookie.setPath("/");
linkUrlCookie.setMaxAge(60*60*24*365);
response.addCookie(linkUrlCookie);
역으로 jsp 화면단에서 escape()처리되서 넘어온 쿠키값을 java 단에서 StringEscapeUtils.unescape…함수를 사용하여 처리할 수 있다.
[tomcat9 이슈] 쿠키에 ;(세미콜론) ,(콤마) 들어가는 경우 오류 발생시 처리 방법
// 쿠키 생성 메소드
public static Cookie makeCookie(String name, String value, String path, int maxAge)
throws IOException {
// 공백을 +로 인코딩하는 문제
// Cookie cookie = new Cookie(name, URLEncoder.encode(value, "utf-8"));
// Cookie cookie = new Cookie(name, UrlEscapers.urlFragmentEscaper().escape(value));
// [tomcat9 이슈] 쿠키에 ;(세미콜론) ,(콤마) 들어가는 경우 오류 발생하여 인코딩
// 공백을 +로 인코딩시 공백으로 치환 추가
Cookie cookie = new Cookie(name, URLEncoder.encode(value, "utf-8").replaceAll("\+", "%20"));
cookie.setPath(path);
cookie.setMaxAge(maxAge);
return cookie;
}
Cookie 클래스 알아보기
서블릿/JSP에서 쿠키를 위해 사용.
■ 쿠키를 웹 브라우저에 전달
– HttpServletResponse.addCookie()
■ 쿠키 설정
1) Cookie 객체를 만듬.
2) 쿠키에 속성을 부여.
3) 쿠키를 전송.
■ 생성자
○ Cookie(String name, String value)
– 이름이 name이고 값이 value인 쿠키를 생성.
■ 속성을 부여할 수 있는 메소드
○ void setComment(String purpose)
– 쿠키에 관련된 정보를 주석 형식으로 기술.
○ void setDomain(String pattern)
– 쿠키가 사용될 도메인을 설정.
– 해당 도메인에 속해 있는 컴퓨터를 방문하면 웹 브라우저는 자동적으로 쿠키를 그 웹서버에 전송.
○ void setMaxAge(int expiry)
– 쿠키가 유효한 기간을 설정. (단위: 초)
– 기간이 초과되면 쿠키는 삭제.
– 이 속성을 기술하지 않으면 쿠키는 클라이언트 컴퓨터에 저장되지 않고, 현재 웹 브라우저가 실행되는 동안에만 유효.
○ void setPath(String url)
– 쿠키가 적용될 패스 정보를 설정.
– 패스가 설정되면 해당되는 패스에 방문하는 경우에만 웹 브라우저가 웹 서버에 쿠키를 전송.
○ void setSecure(boolean flag)
– 보안을 설정.
– flag가 true이면 보안성이 있는 채널(예:SSL)을 사용하는 경우에만 쿠키를 전송.
○ void setValue(String newValue)
– 쿠키 값을 설정.
■ 속성을 읽는 메소드
○ String getComment()
– 쿠키의 목적 등을 기술하는 주석을 읽어 옴.
○ String getDomain()
– 쿠키의 도메인 이름을 얻어 옴.
○ int getMaxAge()
– 쿠키의 유효 기간을 얻어 옴. (단위: 초)
○ String getName()
– 쿠키의 이름을 얻어 옴.
○ String getPath()
– 패스 정보(URI)를 얻어 옴.
○ boolean getSecure()
– 쿠키가 보안이 설정된 프로토콜에서만 보내지면 true, 아니면 false를 리턴.
○ String getValue()
– 쿠키 값을 얻어 옴.
[REFERENCE]
- https://stackoverflow.com/questions/9109318/java-lang-illegalargumentexception-control-character-in-cookie-value-or-attribu
- https://blog.naver.com/chocolleto/30083786336