스프링 시큐리티 동작 과정
(아래는 id, password를 사용하는 form 기반 인증처리 과정입니다. OAuth2.0이나 JWT를 이용한 인증을 할시에는 다른 필터를 거치게 됩니다. ex) OAuth2ClientAuthenticationProcessingFilter)
(위 숫자와 아래 숫자는 아무 상관 없음)
- 사용자가 아이디와 비밀번호(로그인 정보)를 입력하여 form을 전송
- AuthenticationFilter에서 UsernamePasswordAuthenticationToken(Authentication 인터페이스의 구현체)을 생성해 AuthenticationManager(실질적으로는 구현체인 ProviderManager)에게 전달(UsernamePasswordAuthenticationToken은 해당 요청을 처리할 수 있는 Provider를 찾는데 사용)
- AuthenticationManager가 AuthenticationProviders를 조회하여 인증을 요구함
- UserDetailsService의 loadUserByUsername 메소드를 통해 사용자의 정보를 DB에서 조회하고 UserDetails형으로 가져온다.(사용자가 존재하지 않으면 예외를 던지고, 동일한 사용자라면 Authentication 참조를 리턴)
- 인증이 완료되면 AuthenticationManager는 UsernamePasswordAuthenticationToken을 AuthenticationFilter로 전달
- AuthenticationFilter는 전달받은 UsernamePasswordAuthenticationToken을 LoginSuccessHandler로 전송하고, 사용자 정보를 가진 Authentication 객체를 SecurityContextHolder에 담는다.
1. AuthenticationManager
AuthenticationManger는 공장안에서 작업을 지시하는 매니저라고 생각하면 된다.
인자로 받은 Authentication이 유효한 인증인지 확인하고 Authentication 객체를 리턴한다.
2. AuthenticationProvider
AuthenticationProvider는 매니저가 시켜서 일하는 작업자라고 생각하면 된다.
AuthenticationProvider는 인증의 성공과 실패, 결정 불가를 나타낼수 있다.
3. UserDetails
기존 UserDetatils를 통한 로그인/로그아웃 관리에서 단지 사용자의 아이디와 비밀번호, role(권한)정보등만 담긴다는 문제가 있어 UserDetails를 커스텀하여 확장시키고 진행할 필요가 있다.(이메일, 나이, 주소 등)
메소드 | 리턴 타입 | 설명 |
getAuthorities() | Collection<? extends GrantedAuthority> | 계정의 권한 목록 리턴 |
getPassword() | String | 계정의 비밀번호 리턴 |
getUsername() | String | 계정의 이름 리턴(Primary Key혹은 중복이 없는 이메일 값 등) |
isAccountNonExpired() | boolean | 계정이 만료여부 리턴(true : 만료 안됨 |
isAccountNonLocked() | boolean | 계정이 잠김 여부 리턴(true: 잠기지 않음) |
isCredentialNonexpired() | boolean | 비밀번호가 만료 여부 리턴(true : 만료 안됨) |
isEnabled() | boolean | 계정이 활성화(사용가능)여부 리턴(ture : 활성화 |
UserDetails는 VO역할을 하는 인터페이스라고 보면 된다.
4. UserDetailsService
Spring Security에서 즉, DB에서 유저의 정보를 가져오는 인터페이스이다.
메소드 | 리턴 타입 | 설명 |
loadUserByUsername | UserDetails | 유저의 정보를 불러와서 UserDetails로 리턴 |
아직 스프링 시큐리티를 배운지 얼마 안돼 틀린 내용이 있을 수 있습니다.
'스프링' 카테고리의 다른 글
[스프링] CORS(Cross-Origin Resource Sharing) 해결 방법 (0) | 2023.02.26 |
---|---|
[스프링][자바]Reflection API (0) | 2023.02.15 |
[스프링] DI, IoC, Bean (0) | 2023.02.13 |
[스프링] 즉시로딩과 지연로딩 (0) | 2023.02.10 |
[스프링] 프록시란 (0) | 2023.02.10 |