반응형

@Controller에서 요청을 받아 특정 url로 redirect시켜주는 컨트롤러가 있는데

정상적으로 요청이 전달이 되지 않는 것 같아 로그를 확인해 보니 다음과 같은 에러메세지가 떨어지고 있었다.

java.lang.IllegalArgumentException: Model has no value for key 'e_e_ttt'
at org.springframework.web.servlet.view.RedirectView.replaceUriTemplateVariables(RedirectView.java:387)
at org.springframework.web.servlet.view.RedirectView.createTargetUrl(RedirectView.java:346)
at org.springframework.web.servlet.view.RedirectView.renderMergedOutputModel(RedirectView.java:307)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1370)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1116)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:94

 

문제는 리다이렉트 하려는 url에 e_e_ttt라는 문자열을 '{', '}'가 감싸고 있었던 것이다. 

ex) www.hello.com?name=blog&param={e_e_ttt} 

 

왜 문제가 되느냐???

URL내에서 몇 몇 문자는 특별한 의미로 예약되어 있거나, 어떤 문자는 US-ASCII의 출력 가능한 문자 집합에 포함되어 있지 않고 어떤 문자는 몇몇 인터넷 게이트웨이와 프로토콜에서 혼동되는 것으로 알려져 있어, 사용하면 안되는 것들이 있다.

 

URL에서 사용하면 안되는 문자들

% : 인코딩된 문자에 사용할 이스케이프 토큰으로 선점

/  : 경로 컴포넌트에서 선점

. : 경로 컴포넌트에서 선점

.. : 경로 컴포넌트에서 선점

# : 프래그먼트의 구획 문자로 선점

? : 질의 문자열의 구획 문자로 선점

; : 파라미터의 구획 문자로 선점

: : 스킴, 사용자 이름/비밀번호, 호스트/포트의 구획 문자로 선점

$, + : 선점

@ & = : 특정 스킴에서 특별한 의미가 있기 때문에 선점

{}|\~[]` : 게이트웨이와 같은 여러 전송 에이전트에서 불안전하게 다루기 때문에 제한됨

<> " : 안전하지 않음. 반드시 인코딩되어야함

 

근데 이번에 문제가 된 경우에는 {} 문자열이 있었기 때문이다.

 

항상 안전하지 않은 문자들에 대해서는 인코딩을 하도록 하자!!!!

 

반응형

+ Recent posts