티스토리 뷰

반응형

서버에서 Get Parameter를 받을때 쿼리로 받게 된다. 예로들면 아래처럼 @PathVariable을 사용하는 경우..

  @GetMapping(value = "/test/{path}")
  public String testGetMethod(@PathVariable(name = "path") String path) {
    return response.ok(path);
  }

 

하지만 이 방법으로는 파라미터를 받을때 URL에 특수문자가 포함되어 있을 경우 특수문자 뒤는 잘리게 된다.

사용불가능한 특수문자는 +& 이다.

+와 &는 Get 요청에서 지정된 예약 문자이기 때문에 사용할 수 없다.

 

  @GetMapping(value = "/test/{path}")
  public String testGetMethod(@RequestParam(value = "path") String path) {
    return response.ok(path);
  }

@RequestParam을 사용하는 경우도 마찬가지다.

특수문자 +는 띄어쓰기로 대체되고 &가 들어가면 아예 쿼리가 나뉘게 된다.

 

파라미터에 특수문자가 안 들어가면 문제가 없겠지만, 특수문자를 반드시 포함해서 조회를 해야할 경우에는 따로 처리가 필요하다.


해결법 1

아래 path에 {path:.+} 같이 :.+ 특수문자를 포함하면 +와 &를 포함하여 파라미터를 매핑할 수 있다.

  @GetMapping(value = "/test/{path:.+}")
  public String testGetMethod(@PathVariable(name = "path") String path) {
    return response.ok(path);
  }

 

하지만 문제가 있다. 특수문자 +와 &는 처리가 되지만

만약 특수문자에 /(슬러시)가 포함되어 있으면 슬러시 뒷 부분은 다른 path로 인식하여 잘리게 된다


해결법 2

그럼 슬러시도 포함하여 파라미터를 받는 방법은 있는 걸까? 이 부분은 의존성 도움 없이 수동으로 받을 수 밖에 없다.

@GetMapping(value = "/test/**")
  public String testGetMethod(HttpServletRequest request) {
  	String path 
  		= request.getRequestURI().split(request.getContextPath()+"/test/")[1];
    return response.ok(path);
  }

path 값을 "test/**"로 설정하여 test 뒤에 오는 모든 URL path를 받아 split으로 잘라서 사용한다.

이럴경우 슬러시를 연속으로(//) 포함하는 경우도 사용할 수 있다.

 


결론

사실은 path에 특수문자가 포함되지 않는 것이 제일 베스트다. 특수문자를 위해서 해결법2와 같은 URL 방법을 사용할 시 보안이나 디자인 패턴 철학에 맞지 않는다고 할 수 있다. 보통 슬래시와 같은 특수문자들은 암호화하여 서버에서 디코딩으로 받는 것을 추천하고 있다. 아파치 서버와 그 외 서버의 경우 슬래시도 자동으로 인식하도록 업데이트 되고 있다지만 결국 이런 방법은 보안을 무시하는 방법으로 사용하기 좋지 않다.

 

반응형
댓글
공지사항