key()
: remember-me 쿠키에 대한 고유 식별키 (미입력시 랜덤 텍스트)rememberMeParameter()
: remember-me 쿠키 파라미터명(default remember-me)tokenValiditySeconds()
: 쿠키 만료 시간 (초 단위)alwaysRemember()
: 항상 remember-me 를 활성화 시킴 (기본값 false)http
...
.rememberMe()
.key("my-remember-me")
.rememberMeParameter("remember-me")
.tokenValiditySeconds(300)
.alwaysRemember(false)
.and()
실제 인증은 RememberMeServcies에서 인증 처리한다.
interface RememberMeServcies
abstract class AbstractRememberMeServices
RememberMeServices
autoLogin()
processAutoLoginCookie()
)한다.createSuccessfulAuthentication()
을 통해 RememberMeAuthenticationToken
을 생성class TokenBasedRememberMeServices
AbstractRememberMeServices
onLoginSuccess()
class PersistentTokenBasedRememberMeServices
AbstractRememberMeServices
RememberMeAuthenticationToken
interface Authentication
abstract class AbstractAuthenticationToken
Authentication
class RememberMeAuthenticationToken
AbstractAuthenticationToken
RememberMeAuthenticationFilter.authenticationManager.authenticate(rememberMeAuth)
RememberMeAuthenticationProvider.authenticate(rememberMeAuth)
인증 완료되면 인증 토큰을 스레드 로컬 변수에 저장
참고) isFullyAuthenticated()
http
.authorizeRequests()
.antMatchers("/admin").access("isFullyAuthenticated() and hasRole('ADMIN')")
명시적으로 아이디/패스워드 입력을 한 경우에만 true를 반환한다.
SecurityContextRepository 인터페이스 구현체를 통해 사용자의 SecurityContext를 가져오거나 갱신한다.
http.sessionManagement()
.sessionFixation().changeSessionId()
none()
: 세션을 그대로 유지, 사용할 일 없을 듯newSession()
: 새로운 세션을 만들되 기존 데이터는 복제하지 않는다migrateSession()
: 새로운 세션을 만들고 기존 데이터 모두 복제한다changeSessionId()
: 새로운 세션을 만들지 않지만 session-fixation 공격을 방어한다.(servlet 3.1 이상에서만 지원하며 기본으로 사용하고 있다)http.invalidSessionUrl("/")
http.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
IF_REQUIRED
: 필요시 생성함 (기본값)NEVER
: Spring Security에서는 세션을 생성하지 않지만, 세션이 존재하면 사용함STATELESS
: 세션을 완전히 사용하지 않음 (JWT 인증이 사용되는 REST API 서비스에 적합)ALWAYS
: 항상 세션을 사용함http.maximumSessions(1)
.maxSessionsPreventsLogin(false)
.and()
maximumSessions
: 동일 사용자의 최대 동시 세션 갯수maxSessionsPreventsLogin
: 최대 갯수를 초과하게 될 경우 인증 시도를 차단할지 여부 (기본값 false)UsernamePasswordAuthenticationFilter
AbstractAuthenticationProcessingFilter
AbstractSecurityInterceptor
interface
각각의 AccessDecisionVoter는 접근을 승인할지 거절할지 혹은 보류할지 vote 메서드를 통해 판단한다.
DefaultWebSecurityExpressionHandler.createSecurityExpressionRoot()
메소드에서 WebSecurityExpressionRoot 객체를 생성한다.SecurityExpressionHandler<FilterInvocation> expressionHandler = new DefaultWebSecurityExpressionHandler();