Spring
Spring Security의 인증 과정과 주요 모듈
yes_truly
2024. 4. 8. 00:00
728x90
1. Spring Security 인증 과정
1) 로그인 요청
- 사용자가 폼에 아이디, 패스워드를 입력하면 HttpServletRequest에 아이디, 비밀번호가 전달된다.
- AuthenticationFilter가 넘어온 아이디, 비밀번호의 유효성 검사를 실시한다.
2) Authentication 생성
- 유효성 검사 후 실제 구현체인 UsernamePasswordAuthenticationToken을 만들어 넘겨준다.
3) Authentication 전달
- 인증용 객체인 UsernamePasswordAuthenticationToken을 AuthenticationManager에 전달한다.
4) UsernamePasswordAuthenticaionToken을 AuthenticationProvider에 전달
5) 유효성 검증
- 사용자 아이디를 UserDetailsService로 보낸다.
- UserDetailsService는 사용자 아이디로 찾은 사용자의 정보를 UserDetails 객체로 만들어 AuthenticationProvider에게 전달한다.
6) 사용자 조회
- 데이터베이스에 있는 사용자 정보를 가져온다.
7) UserDetails 생성
- 입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 진행한다.
8) UserDetails를 Authentication Provider로 전달
9) UserDetails를 Authentication Manager로 전달
10) AuthenticationFilter로 UserDetails를 넘김
11) Authentication 저장
- 8~10까지 인증이 완료되면 SecurityContextHolder에 Authentication을 저장한다.
- 인증 성공 여부에 따라 성공 시 AuthenticationSuccessHandler, 실패 시는 AuthenticationFailuerHandler를 실행한다.
2. SpringSecurity의 주요 모듈
1) SecurityContextHolder, SecurityContext, Authentication
- 유저의 아이디와 패스워드 사용쟈 정보를 넣고 실제 가입된 사용자인지를 체크한다.
- 인증에 성공하면 사용자의 principal과 credential정보를 authentication 안에 담는다.
- Authenticaion 클래스는 현재 접근하는 주체의 정보와 권한을 담는 인터페이스로 SecurityContext의 Authenticatino에 저장된다.
- SecurityContextHolder를 통해 SecurityContext에 접근하고 SecurityContext를 통해 Authenticatino에 접근할 수 있다.
2) UsernamePasswordAuthenticationToken
- Authentication을 구현한 AbstracAuthenticationToken의 하위의 하위 클래스이다.
- 유저의 ID가 Principal, PW는 Credential 역할을 하는데, UsernamePasswordAuthenticationToken의 첫 번째 생성자는 인증 전제 객체를 생성하고 두 번째는 인증이 완료된 객체를 생성한다.
3)AuthenticationManager
- 인증에 대한 부분을 처리하는 클래스로 실질직으로는 AuthenticatinoManager에 등록된 AuthenticationProvider에 의해서 처리된다.
- 인증에 성공하면 두 번째 생성자를 이용해 생성한 객체를 SecurityContext에 저장한다.
4) AuthenticationProvider
- 실제 인증에 대한 부분을 처리하는 작업을 치룬다.
- 인증 전 Authenticatino객체를 받아 인증이 완료된 객체를 반환하는 역할을 하고 AuthenticatinoProvider인터페이스를 구현해 custom AuthenticationProvider를 작성하고 AuthenticationManager에 등록하면 된다.
5) ProviderManager
- AuthenticationManager를 구현한 것으로 AuthenticationProvider를 구성하는 목록을 가진다.
6) UserDetailService
- UserDetails객체를 반환하는 하나의 메소드만을 가진다.
- 일반적으로 이를 구현한 클래스에서 UserRepository를 주입받아 데이터베이스와 연결해 처리한다.
7) UserDetails
- 인증에 성공해 생성된 UserDetails클래스는 Authenticatino객체를 구현한 UsernamePasswordAuthenticatinoToken을 생성하기 위해 사용되는데, UserDetails를 구현해 처리 가능하다.
8) SecurityContextHolder
- 보안 주체의 세부 정보를 포함해 응용프로그램의 현재 보안 컨텍스트에 대한 세부 정보가 저장된다.
9) SecurityContext
- Authentication을 보관하는 역할을 하고 SecurityContext를 통해 Authentication을 저장하거나 꺼내올 수 있다.
10) GrantedAuthority
- 현재 사용자(Principal)가 갖고 있는 권한을 의미하고 ROLE_*의 형태로 사용한다.
- UserDetailsService에 의해 불러올 수 있고 특정 자원에 대한 권한이 있는지 없는지를 검사해 접근 허용 여부를 결정한다.
[참고 자료]
728x90