앞서 시큐리티의 구성과 원리와 같이 청사진을 파악했다면, 앞으로 스프링 시큐리티를 구성하는 각 Filter에 대해서 다뤄보겠다.
그리고 이번 게시글에서 다룰 Filter는 DisableEncodeUrlFilter이다.
DisableEncodeUrlFilter의 목적
해당 필터는 DefaultSecurityFilterChain( 시큐리티 의존성을 추가하면 자동으로 등록 )에 기본적으로 등록되는 필터이며,
시큐리티 필터의 가장 첫 번째에 위치한다.
해당 필터가 동작하는 기능은 URL 파라미터에서 세션ID가 인코딩되어서 로그로 유출되는 것을 방지한다.
( 세션 하이재킹과 같은.. )
세션 탈취해서 로그인하기(세션 하이재킹) feat. 쿠키와 세션 실습
HttpSession session = request.getSession(); 자바에서 클라이언트의 세션을 얻기 위해 위의 코드를 많이 사용한다. 세션이 존재하지 않으면 초기에는 WAS 컨테이너에서 Session Id를 발급해준다. 그리고 Session
stir.tistory.com
그리고 DefaultSecurityFilterChain는 커스텀 SecurityFilterChain을 생성하여도 등록된다.
만약 이를 비활성화하고 싶다면, 아래와 같이 커스텀 SecurityFilterChain의 코드에 아래의 로직을 넣어주면 된다.
http
.sessionManagement((manage) -> manage.disable());
동작 방식을 이해하기 위해서 DefaultSecurityFilterChain을 구성하는 코드도 살펴보자.
public class DisableEncodeUrlFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
filterChain.doFilter(request, new DisableEncodeUrlResponseWrapper(response));
}
private static final class DisableEncodeUrlResponseWrapper extends HttpServletResponseWrapper {
private DisableEncodeUrlResponseWrapper(HttpServletResponse response) {
super(response);
}
@Override
public String encodeRedirectURL(String url) {
return url;
}
@Override
public String encodeURL(String url) {
return url;
}
}
}
Filter로 동작하기 위한 request와 response를 처리하는 doFilter() 의 파라미터를 보면
response를 DisableEncodeUrlResponseWrapper 클래스로 감싸고 있다.
해당 클래스의 로직을 보면 단순하게 url을 넘겨주는 형태이다.
그리고 본래 파리미터로 넘겨주던 HttpServletResponse 인터페이스를 구현한
org.apache.catalina.connector.Response 클래스에 정의되어 있는 encodeRedirectURL(), encodeURL() 는 아래와 같다.
@Override
public String encodeRedirectURL(String url) {
if (isEncodeable(toAbsolute(url))) {
return toEncoded(url, request.getSessionInternal().getIdInternal());
} else {
return url;
}
}
@Override
public String encodeURL(String url) {
String absolute;
try {
absolute = toAbsolute(url);
} catch (IllegalArgumentException iae) {
// Relative URL
return url;
}
if (isEncodeable(absolute)) {
// W3c spec clearly said
if (url.equalsIgnoreCase("")) {
url = absolute;
} else if (url.equals(absolute) && !hasPath(url)) {
url += '/';
}
return toEncoded(url, request.getSessionInternal().getIdInternal());
} else {
return url;
}
}
두 메소드 모두 request.getSessionInternal().getInternal() 을 통해 session 값을 넘겨준다.
따라서 url에는 세션값이 담기며, 보안 측면에서 이를 방지하기 위해 DisableEncodeUrlFilter는 url에 세션 정보를 제거하는 것이다.
'Spring > 시큐리티 기본원리' 카테고리의 다른 글
시큐리티 기본 원리( 10 ) - SecurityContextHolderFilter (0) | 2025.01.23 |
---|---|
시큐리티 기본 원리( 9 ) - WebAsyncManagerIntegrationFilter (0) | 2025.01.23 |
시큐리티 기본 원리( 7 ) - GenericFilterBean과 OncePerRequestFilter 차이 (0) | 2025.01.20 |
시큐리티 기본 원리( 6 ) - 필터 구조와 상속( GenericFilterBean과 OncePerRequestFilter ) (0) | 2025.01.19 |
시큐리티 기본 원리( 5 ) - SecurityContextHolder( 인증 정보 공유 방식 ) (0) | 2024.06.15 |
댓글