PR 리뷰하며 Spring security 공부하기.

공채로 들어오신 Zach이 아이슬랜드 어드민에 ldap 붙이는 작업을 해서 리뷰 요청을 했다. 나도 하고 싶던 작업이라 반가웠다. zach은 spring security를 이용해 구현했는데, 나는 자바와 스프링은 이 팀에 들어와서 쓰기 시작했고, 우리 팀은 기존에 스프링을 DI에만 쓰다보니 Spring security를 잘 모른다. 그래서 공부했다.

WebMvcInitializer에서 DelegatingFilterProxy를 등록한다. 이 필터는 자신의 동작을 어플리케이션 컨텍스트에 bean으로 등록된 Filter 구현에 위임한다. 이 때 어떤 필터 빈에 위임할지는 생성자에 넣어 준다.

AbstractSecurityWebApplicationInitializer를 구현하는 경우 별도로 DelegatingFilterProxy(“springSecurityFilterChain”)를 등록할 필요는 없다.

springSecurityFilterChain 빈과 이 체인에 연결 되는 보안 기능을 수행하는 빈들은 웹 보안을 활성화할 때 생성된다.

웹 보안은 WebSecurityConfigurerAdapter를  구현한 클래스에 @EnableWebSecurity 어노테이션을 붙여서 활성화 시킬 수 있다. 이 어노테이션으로 관련 필터 빈을 생성하고, 이 Config를 어플리케이션 컨텍스트에 추가한다.

이 때, WebSecurityConfigurerAdapter의 세가지 configure 함수를 오버라이딩 하여 웹 보안을 커스텀하게 설정할 수 있다. 어떤 범위에 어떤 보안 혹은 권한 수준을 적용할 건지, 어떤 데이터 소스를 사용할건지, 로그인은 어떻게 시킬건지 등을 설정한다.

책에서는 인메모리, jdbc, ldap, 사용자 서비스 저장소 사용 방법 등을 소개했다. zach은 AuthenticationProvider를 사용했다. AuthenticationProvider를 구현하고, public Authentication authenticate(Authentication authentication) throws AuthenticationException를 오버라이딩 해서 인증 프로세스를 제공한다. 우리는 사내 ldap 서비스가 있으므로 여기를 찌르는 서비스를 구현했다.

여기서 Authentication은 요청이 처리될 때 인증을 위한 토큰을 나타낸다. 한번 요청이 인증되고 나면 이 객체는 authenticated field가 true로 set 되어 SecurityContextHolder에 의해 관리되는 SecurityContext라는 thread-local에 저장된다.

Zach이 protected void configure(final HttpSecurity http) throws Exception에서 위와 같이 formLogin을 쓰도록 설정했으므로, 해당 로그인 페이지에서 해당 파라미터 포맷을 가지는 form 요청이 오면 이를 가지고 인증을 시도하며, 이 때 protected void configure(final AuthenticationManagerBuilder auth) throws Exception에서 설정한 대로 AuthenticationProvider를 사용해서 인증한다.

그럼 세션 유지는 어떻게 하는거지?

이건 @EnableWebSecurity를 통해 만들어진 springSecurityFilterChain 관련 필터 빈 중 SecurityContextPersistenceFilter의해 유지 된다. 기본은 HttpSessionSecurityContextRepository를 이용해 저장하며, cookie를 이용한 http session을 storage로 사용한다. 기본 타임아웃은 30분이다.

https://www.baeldung.com/spring-security-session

그리고 모든 컨트롤러 상황에서 이 세션에 들어있는 userName을 쓰기 위해 어드바이스를 두었는데 이 때 SecurityContextHolder에서 Authentication을 가져와 AnonymousAuthenticationToken인지 본다. 인증되지 않은 요청은 Authentication이 null로 들어있지 않고 AnonymousAuthenticationToken로 들어 있다. http://springcert.sourceforge.net/sec-3/anonymous.html

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

search previous next tag category expand menu location phone mail time cart zoom edit close