배경

웹 쇼핑몰 프로젝트를 하면서 스프링 컨트롤러에서 Get Mapping 요청시 쿼리 파라미터가 노출되는 문제를 마주했다. 당장 서비스를 런칭하는 것도 아니기 때문에 큰 문제가 있는 것은 아니었지만 내부 구조가 그대로 드러나는 것 같아 상당히 찜찜했다. 조금만 생각해보아도 보안상이 의슈로 연결되기 쉬운 부분이었다.

예컨대 커뮤니티 서비스에서 게시글을 검색하는 과정에서 다음과 같이 쿼리 파라미터가 노출된다.

articles?page=0&sort=&searchType=HASHTAG&searchValue=hashtag1

아래는 해당 URI를 매핑하는 search 메서드 구현부이다.

이와 같은 문제를 해결하는 방법으로 아래의 대안책들을 고려했었다.

POST 방식은 URL을 사용하지 않으며, HTTP 요청 본문에 데이터를 담아 전송하기 때문에 보안상 더욱 안전하다. 하지만 일반적인 조회에서 POST 요청을 보내는 것이 적절한 것인가에 대한 의문이 남는다.

SSL(Secure Socket Layer)은 데이터를 암호화하여 전송하는 보안 프로토콜이다. SSL을 적용하면, 전송 중인 데이터가 제3자에게 노출될 가능성을 줄일 수 있다. 하지만 별도 비용이 존재해 현재 프로젝트에서 당장 도입하기 어려운 것으로 판단했다.

URL 인코딩은 URL에서 사용하는 특수 문자를 변환하여 보안성을 높이는 방법이다. Spring에서는 URLEncoder 클래스를 사용하여 URL 인코딩을 할 수 있어 추후 이 방법으로의 리팩토링을 고려해본다.

Redirect를 사용하면, 클라이언트는 실제 페이지 URL을 알 수 없다. 따라서, URL 노출 문제를 해결하는 가장 빠른 해결법이 될 것이다. 그러나 결국엔 서블릿 요청이 필요하게 되고 다른 URI을 이용한 Get 호출을 연쇄적으로 일으키므로 근본적인 해결점은 아니다.

무엇보다도 가장 문제가 될 수 있는 부분은 id 값이 그대로 노출되는 경우일 것이다.

예를들어 다음과 같은 API 호출이다.