스프링 시큐리티란?
스프링 시큐리티는 스프링 기반의 애플리케이션의 보안(인증과 권한)을 담당하는 프레임워크이다.
만약 시큐리티를 사용하지 않으면 자체적으로 세션을 체크하고 redirect 등을 해야 한다.
스프링 시큐리티는 보안과 관련해서 체계적으로 많은 옵션들로 이를 지원해준다.
스프링 시큐리티는 Filter 기반으로 동작하기 때문에 Spring MVC와 분리되어 관리 및 동작한다.
보안 관련 용어
- 접근 주체(Principal) : 보호된 대상에 접근하는 유저
- 인증(Authenticate) : 현재 유저가 누구인지 확인(ex. 로그인)
- 애플리케이션의 작업을 수행할 수 있는 주체임을 증명
- 인가(Authorize) : 현재 유저가 어떤 서비스, 페이지에 접근할 수 있는 권한이 있는지 검사
- 권한 : 인증된 주체가 애플리케이션의 동작을 수행할 수 있도록 허락되있는지를 결정
- 권한 승인이 필요한 부분으로 접근하려면 인증 과정을 통해 주체가 증명 되어야만 한다
- 권한 부여에도 두가지 영역이 존재하는데 웹 요청 권한, 메소드 호출 및 도메인 인스턴스에 대한 접근 권한 부여
1. 스프링 시큐리티 모듈
스프링 시큐리티 모듈에 대해 잘 설명되어 있는 블로그가 있어 참고하면 좋을 것 같다.
https://mangkyu.tistory.com/76
2. 인증관련 architecture
스프링 시큐리티는 세션-쿠키 방식으로 인증한다.
1. 클라이언트(유저)가 로그인을 시도.
2. AuthenticationFilter는 AuthenticationManager, AuthenticationProvider(s), UserDetailsService를 통해
DB에서 사용자 정보를 읽어옴.
3. UserDetailsService는 로그인한 ID에 해당하는 정보를 DB에서 읽어들여 UserDetails를 구현한 객체로 반환.
4. 스프링 시큐리티는 인메모리 세션저장소인 SecurityContextHolder 에 UserDetails정보를 저장.
5. 클라이언트(유저)에게 session ID(JSESSION ID)와 함께 응답
6. 이후 요청에서는 요청 쿠키에서 JSESSION ID정보를 통해 이미 로그인 정보가 저장되어 있는 지 확인.
이미 저장되어 있고 유효하면 인증 처리
3. 시큐리티의 Filter
시큐리티 필터가 하는 역할은 클라이언트와 자원 사이에서 요청과 응답 정보를 이용해 다양한 처리를 하는데 목적이 있다.
스프링 시큐리티는 다양한 기능을 가진 필터들을 10개 이상 제공한다.
이렇게 제공되는 필터들을 Security Filter Chain이라고 한다.
- SecurityContextPersistenceFilter : SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할을 한다.
- LogoutFilter : 설정된 로그아웃 URL로 오는 요청을 감시하며, 해당 유저를 로그아웃 처리
- (UsernamePassword)AuthenticationFilter : (아이디와 비밀번호를 사용하는 form 기반 인증) 설정된 로그인 URL로 오는 요청을 감시하며, 유저 인증 처리
- AuthenticationManager를 통한 인증 실행
- 인증 성공 시, 얻은 Authentication 객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행
- 인증 실패 시, AuthenticationFailureHandler 실행
- DefaultLoginPageGeneratingFilter : 인증을 위한 로그인폼 URL을 감시한다.
- BasicAuthenticationFilter : HTTP 기본 인증 헤더를 감시하여 처리한다.
- RequestCacheAwareFilter : 로그인 성공 후, 원래 요청 정보를 재구성하기 위해 사용된다.
- SecurityContextHolderAwareRequestFilter : HttpServletRequestWrapper를 상속한 SecurityContextHolderAwareRequestWapper 클래스로 HttpServletRequest 정보를 감싼다. SecurityContextHolderAwareRequestWrapper 클래스는 필터 체인상의 다음 필터들에게 부가정보를 제공한다.
- AnonymousAuthenticationFilter : 이 필터가 호출되는 시점까지 사용자 정보가 인증되지 않았다면 인증토큰에 사용자가 익명 사용자로 나타난다.
- SessionManagementFilter : 이 필터는 인증된 사용자와 관련된 모든 세션을 추적한다.
- ExceptionTranslationFilter : 이 필터는 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달하는 역할을 한다.
- FilterSecurityInterceptor : 이 필터는 AccessDecisionManager 로 권한부여 처리를 위임함으로써 접근 제어 결정을 쉽게해준다.
4. Authentication
모든 접근 주체(User)는 Authentication을 생성한다.
이것은 SecurityContext에 보관되고 사용한다.
즉, Security의 세션들은 내부 메모리(SecurityContextHolder)에 쌓고 꺼내쓰는 것이다.
참고로 Authentication 인터페이스는 자주 쓰이니 알아둬야한다.
public interface Authentication extends Principal, Serializable {
Collection<? extends GrantedAuthority> getAuthorities(); // Authentication 저장소에 의해 인증된 사용자의 권한 목록
Object getCredentials(); // 주로 비밀번호
Object getDetails(); // 사용자 상세정보
Object getPrincipal(); // 주로 ID
boolean isAuthenticated(); //인증 여부
void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}
5. AuthenticationManager
유저의 요청 내에 담긴 Authentication를 AuthenticationManager 에 넘겨주고,
AuthenticationManager 를 구현한 ProviderManager가 처리한다.
정확히는 ProviderManager 는 private List<AuthenticationProvider> providers; 로
여러 AuthenticationProvider를 가질 수 있는데,
이 친구들이 처리를 해서 Authentication 를 반환해준다. (실패하면 예외던짐)
- AuthenticationManager : 인증요청을 받고 Authentication를 채운다.
- AuthenticationProvider : 실제 인증이 일어나며, 성공하면 Authentication.isAuthenticated = true 를 한다.
'Web developer > Spring' 카테고리의 다른 글
[Spring] Spring Security ACL Tutorial (1) | 2022.11.27 |
---|---|
[Spring] 스프링 시큐리티 로그인 기능 구현해보기 (0) | 2021.08.24 |
[Spring] 기본 설정 + Spring Security 설정 (0) | 2021.08.20 |
[Spring] MockMVC Test (0) | 2021.08.02 |
[Spring] Swagger를 사용하여 Web API 문서화 해보기 (0) | 2021.08.02 |
댓글