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

작성: 2021.06.04

수정: 2021.06.04

읽는시간: 00 분

Programming/JPA ⁄ Spring

반응형
1

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]가 있다는 건데요,

더보기

해당 에러는 톰캣 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));

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

img

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

img

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 메서드를 만들었습니다

img

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

이상입니다.

반응형