Programming/JPA ⁄Spring

서블릿에서 한글 쿠키 사용하기. An invalid character [32] was present in the Cookie value 해결하기.

📝 작성 : 2021.06.04  ⏱ 수정 : 
반응형

 

Cookie에 간단하게 String 데이터를 넣는데 에러가 발생했습니다.

SEVERE: Servlet.service() for servlet [springDispatcherServlet] in context with path [/gaia] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value] with root cause
java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value
	at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateCookieValue(Rfc6265CookieProcessor.java:197)
	at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:123)
	at org.apache.catalina.connector.Response.generateCookieString(Response.java:982)
	at org.apache.catalina.connector.Response.addCookie(Response.java:930)
	at org.apache.catalina.connector.ResponseFacade.addCookie(ResponseFacade.java:386)
	at javax.servlet.http.HttpServletResponseWrapper.addCookie(HttpServletResponseWrapper.java:58)
	at org.springframework.security.web.firewall.FirewalledResponse.addCookie(FirewalledResponse.java:68)
	at javax.servlet.http.HttpServletResponseWrapper.addCookie(HttpServletResponseWrapper.java:58)
	at javax.servlet.http.HttpServletResponseWrapper.addCookie(HttpServletResponseWrapper.java:58)
	at best.gaia.project.controller.ProjectUrlMapper.projectMenuOverview(ProjectUrlMapper.java:94)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)

 

쿠키에 invalid character [32]가 있다는 건데요,

더보기

This error is due to the default cookie standard in the new version of Tomcat 8.5.RFC 6265Special symbols such as semicolon (;), comma (,), equal sign (=), and space cannot be used in the cookie value, otherwise an exception will occur.

 

해당 에러는 톰캣 8.5에서 새로 추가된 기본 쿠키 규칙 때문입니다. 세미콜론, 콤마, 이콜 사인, 그리고 공백은 쿠키 값으로 이용될 수 없습니다. ';' , ',', '=' , ' ' 중 하나도 쓴게 없는데 없으니 , 한글때문에 그렇다는걸 알 수 있습니다.

 

쿠키를 추가할 때 UTF-8로 인코딩을 먼저 해 줘야 합니다.

 

String proj_user_nick = dao.getProjectNickNameByMemNo(projnoMemno);
resp.addCookie(new Cookie("proj_user_nick",proj_user_nick));

 

이전에 쿠키에 저장하던 코드 입니다.

 

String proj_user_nick = dao.getProjectNickNameByMemNo(projnoMemno);
proj_user_nick = URLEncoder.encode(proj_user_nick, "utf-8");
resp.addCookie(new Cookie("proj_user_nick",proj_user_nick));

 

인코딩 하는 한 줄을 추가 해 주었습니다.

 

 

이제 문제없이 쿠키가 추가 되는 것을 확인 할 수 있습니다.

Chrome의 개발자 탭 에서 Application - > Cookies 를 들어가면 저장된 쿠키의 값도 확인 할 수 있습니다.

그런데 URLEncoder는 공백 문자를 + 로 인코딩 해 버리는 문제가 있습니다.

		String proj_user_nick = dao.getProjectNickNameByMemNo(projnoMemno);
		proj_user_nick = URLEncoder.encode(proj_user_nick, "utf-8").replaceAll("\\+", "%20");
		resp.addCookie(new Cookie("proj_user_nick",proj_user_nick));

이렇게 다시 바꿔 줬습니다. 매번 URFEncoder를 쓸 때마다 replaceAll 을 쓸 수 없으니, 따로 static method로 등록 해 두고 사용해야 겠습니다.

 

package best.gaia.utils;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

public class CookieUtil {
	public static void addCookie(String cookieName, String value, HttpServletResponse resp) {
		try {
			value = URLEncoder.encode(value, "utf-8").replaceAll("\\+", "%20");
		} catch (UnsupportedEncodingException e) {}
		
		resp.addCookie(new Cookie(cookieName,value));
	}
	
}

쿠키를 추가하는 static 메서드를 만들었습니다

이제 의도한 값이 나오는 것을 확인 할 수 있습니다 ! 

이상입니다.

 

반응형