- 목차
- Lesson 1: Breaking Down the Authentication Flow
- Lesson 3: The Security Context
- Lesson 4: Configure the Filter Chain
- 인증 흐름을 분석하고 이해합니다.
DelegatingFilterProxy는 스프링 시큐리티가 모든 애플리케이션 요청을 감싸게 해서 모든 요청에 보안이 적용되게 하는 서블릿필터이다.(스프링 프레임워크에서 제공) 스프링 프레임워크 기반의 웹 애플리케이션에서 서블릿 필터 라이프 사이클과 연계해 스프링 빈 의존성을 서블릿 필터에 바인딩하는데 사용한다.
사용자명과 비밀번호로 이뤄진 폼기반 인증에 사용하는 가상 URL요청을 감시하고 요청이 있으면 사용자의 인증을 진행함
- 먼저 DelegatingFilterProxy를 호출하게됩니다.
- UsernamePasswordAuthenticationFilter가 발생하게 됩니다.
- 여기서는 인증 시도를 통해 앞으로 진행됩니다.
- 사용자 이름과 암호를 요청에서 가져와 토큰으로 래핑됩니다.
- 토큰은 실제 인증 프로세스의 시작입니다.
- 토큰을
AuthenticationManager
에게 위임합니다.
- 자신이 가지고 있는 인증 AuthenticationProviders 를통해서 반복해서 인증을 시도합니다.
- 인증이 성공하면
AuthenticationManager
는 인증 인ㅅ턴스를UsernamePAsswordAuthenticationFilter
에 반환합니다. - 필터는 세션 전략을 사용합니다. 즉 세션을 어떻게 구성했느냐에 따라서 방법이 달라집니다.
Security Context
가 동일한 세션 내의 요청에 대해 설정되고 저장되고 사용되는 방법을 설명
- SecurityContext - 실행중인 스레드에 관련된 기본적인 보안 정보
- SecurityContextHolder - 보안 정보의 저장 메커니즘
- SecurityContentHolder ThreadLocal을 사용하여 세부 정보를 저장합니다. 즉 스레드별로 컨텍스트에 저장됩니다.
@Async
로 작업하는 경우 새 스레드가 더 이상 주 스레드와 동일한 주체에 액세스 할 수 없다는 것입니다. 이것을 해결하기 위해서. 기본 전략을 변경해야합니다.
spring.security.strategy = MODE_INHERITABLETHREADLOCAL // env 속성을 통해이 작업을 수행 할 수 있습니다.
SecurityContextHolder.setStrategyName ( "MODE_INHERITABLETHREADLOCAL") // 자바코드로 제어 할 수있습니다.
Object principal = SecurityContextHolder.getContext (). getAuthentication (). getPrincipal (); // 테스트하기 위해 현재 사용자에 대한 정보를 얻을 수 있습니다.
-
필터 체인을 구성하여 상위 레벨 구성을 넘어 저급 레벨 작업을 수행하는 방법을 보여주는 것입니다.
-
인증 요청을 통해 디버깅하여 기본 필터 체인을 사용할 수 있습니다.
@Component
public class LssLoggingFilter extends GenericFilterBean {
@Override
public void doFilter(SevletRequest request, ServeltRsponse response, FilterChanin chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String url = httpServletRequest.getRequestURL().toString();
String queryString =
Optional.ofNullable(httpServletRequest.getQueryString()).map(value -> "?" + value).orElse("");
log.info(String.format("applying LssLoggingFilter for URI: %s%s", url, queryString));
chain.doFilter(request, response);
}
}
GenericFilterBean
상속해서doFilter()
메서드를 재정의합니다.- 재정의한
doFilter()
는 간단하게 로깅 하는 예제입니다.
...
http
.addFilterBefore (lssLoggingFilter, AnonymousAuthenticationFilter.class)
- 해당 필터를
addFilterBefore()
메서드를 통해서 의존성을 주입해줍니다.