이 필터는 DefaultSecurityFilterChain에 기본적으로 등록되는 필터로 가장 첫 번째에 위치한다.
필터가 등록되는 목적은 URL 파라미터에 세션 id가 인코딩되어 로그로 유출되는 것을 방지하기 위함이다.
→ Session Id를 통한 세션 공격 방지.
URL로 간주되지 않는 부분을 포함하지 않도록 설정.
커스텀 SecurityFilterChain을 생성해도 등록되면 비활성은 세션관리 설정을 disable하면 된다.
http
.sessionManagement((manage) -> manage.disable())
;
public class DisableEncodeUrlFilter extends **OncePerRequestFilter** {
public DisableEncodeUrlFilter() {
}
// 기존의 response는 session Id를 파라미터 값을 가지게 된다.
// 다음 필터로 넘길때 response를 DisableEncodeUrlResponseWrapper로 처리한 다음에 넘겨준다.
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(request, new DisableEncodeUrlResponseWrapper(response));
}
// session Id 가 파라미터로 유출 되는 것을 막아줌.
private static final class DisableEncodeUrlResponseWrapper extends HttpServletResponseWrapper {
private DisableEncodeUrlResponseWrapper(HttpServletResponse response) {
super(response);
}
public String encodeRedirectURL(String url) {
return url;
}
public String encodeURL(String url) {
return url;
}
}
}
기존 org.apache.catalina.connector.Response 에서 제공하는 URL은 session Id를 인코딩하여 반환한다.
따라서 Security 의 DisableEncodeUrlFilter에서는 session Id를 인코딩 하지 않고 그냥 url 만 반환하도록 한다.