📕 스프링 시큐리티란?
스프링 시큐리티는 보안(인증(Authentication), 권한(Authorize), 인가 등) 기능을 제공하는 스프링의 하위 프레임워크이다.
- 접근 주체(Principal) : 보호된 대상에 접근하는 유저
- 인증(Authentication)
- 해당 사용자가 본인이 맞는지를 확인하는 절차. (로그인)
- 어플리케이션의 작업을 수행할 수 있는 주체임을 증명한다.
- 인가(Authorization)
- 인증된 사용자가 요청된 자원에 접근가능한가를 결정하는 절차. (유저의 권한 검사)
- 어떤 페이지, 리소스 등에 접근할 수 있는지를 검사한다.
- 권한(Authorize)
- 인증된 사용자가 어떤 것을 할 수 있도록 허락되었는지 확인하는 절차.
- 권한 승인이 필요한 부분으로 접근하려면 인증 과정을 통해 주체가 증명 되어야 한다.
- 권한 부여 영역 : 웹 요청 권한, 메소드 호출 및 도메인 인스턴스에 대한 접근 권한
📖 스프링 시큐리티 특징과 구조
- 보안과 관련하여 체계적으로 많은 옵션을 제공하여 편리하게 사용할 수 있음
- Filter 기반으로 동작하여 MVC와 분리하여 관리 및 동작
- 어노테이션을 통한 간단한 설정
- Spring Security는 기본적으로 세션 & 쿠키 방식으로 인증
- 인증관리자(Authentication Manager)와 접근 결정 관리자(Access Decision Manager)를 통해 사용자의 리소스 접근을 관리
- 인증 관리자는 UserNamePasswordAuthenticationFilter
- 접근 관리자는 FilterSecurityInterceptor가 수행
📖 스프링 시큐리티 아키텍쳐
1. Http Request 수신 ➡ AuthenticationFilter
사용자가 Form을 통해 로그인 정보와 함께 인증 요청을 한다.
2. AuthenticationFilter ➡ UsernamePasswordAuthentication Token
AuthenticationFilter가 요청을 인터셉트하고, 가로챈 정보를 통해 아이디와 패스워드의 유효성 검사를 위한 UsernamePasswordAuthenticationToken의 인증용 객체를 생성한다.
3. AuthenticationFilter ➡ AuthenticationManager<interface> _implements ProviderManager
AuthenticationFilter에게 인증용 객체(UsernamePasswordAuthenticationToken)을 전달받는다._
4. AuthenticationManager<interface> implements ProviderManager ➡ AuthenticationProvider(s)
실제 인증을 할 AuthenticationProvider에게 Authentication객체(UsernamePasswordAuthenticationToken)을 다시 전달한다.
5. AuthenticationProvider(s) ➡ UserDetailsService
DB에서 사용자 인증 정보를 가져올 UserDetailsService 객체에게 사용자 정보를 넘겨준다.
6. UserDetails<interface> implements User
넘겨 받은 사용자 정보를 통해 DB에서 인증에 사용할 사용자 정보(사용자 아이디, 암호화된 패스워드, 권한 등)를 찾아내서 UserDetails(인증용 객체와 도메인 객체를 분리하지 않기 위해서 실제 사용되는 도메인 객체에 UserDetails를 상속하기도 한다.)라는 객체로 만들고 전달 받는다.
7. UserDetailsService ➡ AuthenticationProvider(s)
AuthenticationProvider는 UserDetails 객체를 전달 받은 이후 실제 사용자의 입력정보와 UserDetails 객체를 가지고 인증을 시도한다.
8. AuthenticationProvider(s) ➡ AuthenticationManager<interface> implements ProviderManager
인증이 완료가되면 권한 등의 사용자 정보를 담은 Authentication 객체를 반환한다.(or AuthenticationException)
9. AuthenticationManager<interface> implements ProviderManager ➡ AuthenticationFilter
인증이 끝났고, 다시 최초의 AuthenticationFilter에 Authentication 객체가 반환된다.
10. AuthenticationFilter ➡ SecurityContext에 인증 객체를 설정
Authentication 객체를 Security Context에 저장한다.
최종적으로 SecurityContextHolder는 세션 영역에 있는 SecurityContext에 Authentication 객체를 저장한다. 사용자 정보를 저장한다는 것은 스프링 시큐리티가 전통적인 세션-쿠키 기반의 인증 방식을 사용한다는 것을 의미한다.
💡 [참고]
https://velog.io/@hope0206/Spring-Security-%EA%B5%AC%EC%A1%B0-%ED%9D%90%EB%A6%84-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%97%AD%ED%95%A0-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0
https://thalals.tistory.com/436
https://devuna.tistory.com/55