Spring Security
스프링 시큐리티는 자바 애플리케이션의 인증과 권한 부여를 제공하는 데 중점을 둔 프레임워크이다.
- Spring Security는 스프링 기반 앱의 보안 표준이다.
- 권한 부여(Authorization)는 반드시 인증(Authentication) 후에 수행된다.
- 서블릿 필터는 요청을 가로채 처리하는 자바 API이다.
- Spring Security 필터는 보안 관련 작업을 하며 Spring Security Filter Chain은 그 모음이다.
- DelegatingFilterProxy는 기존 필터와 Spring Security 필터를 연결하는 역할을 한다.
- FilterChainProxy는 Spring Security Filter Chain을 사용하기 위한 진입점이다.
장점
기존 서블릿 필터에서 인증처리를 한 것보다 Custom requirements(맞춤형 요구사항) 을 충족시키기 위해 쉽게 확장시킬 수 있다.
- 다양한 유형(폼 로그인, 토큰 기반, OAuth 2 기반)의 인증
- 사용자의 역할에 따른 권한 레벨 및 리소스에 대한 접근 제어
- TLS 적용 및 민감한 정보 암호화
- 알려진 보안 공격 차단
- 다양한 커스터마이징 및 유연한 확장
개발자가 직접 보안 기능을 구현할 수 있음에도 스프링 시큐리티를 사용하는 것이 안전한 선택이 된다.
1.Filter
필터는 체인처럼 엮어 있기 때문에 , 필터체인이라고도 불린다.
모든 request 는 이 필터 체인을 반드시 거쳐야 한다.
Spring Security는 filter 기반으로 동작하기 때문에 ,
Spring MVC와 분리되어 관리 및 동작한다.
2. Security 용어
- 접근 주체(Principal) 인증을 시도하는 주체를 User, 주체의 구체적인 정보(Username ID)를 Principal이라고 한다.
실제로는 혼용돼서 사용되는 듯하며, 보통 Entity 클래스에 그 정보가 담긴다.
- 인증(Authentication) 인증은 User, 혹은 Principal이 본인이 맞음을 증명하는 절차를 말한다.
정상적인 인증을 위해 제출하는 식별 정보를 Credential(신원 증명 정보)라고 하며, 일종의 신분증 역할을 한다. 공인인증서, OTP, 사이트 비밀번호 등이 그 예가 된다.
- 인가(Authorization) 권한 부여, 혹은 인가는 인증을 통과한 사용자에게 역할(Role)에 따라 특정 권한(Authority)을 부여하는 절차이다.
여기서 권한이란 사용하는 앱의 특정 리소스에 접근할 수 있는 권한을 말하며, 사용자에 따라 권한을 제어하는 행위를 따로 접근 제어(Access Control)라 부르기도 한다. 권한 부여는 당연하게도 반드시 인증과정 이후에 수행되어야 한다.
Spring Security 처리 과정
![](https://velog.velcdn.com/images/kth121211/post/ee71cf40-a04f-4e6e-89e7-3dc6e56ee3bf/image.png)
- 요청이 들어오면 AuthenticationFilter(UsernamePassAuthenticationFilter)에 접근
- 요청에 따른 UsernamePasswordAuthenticationToken == 'Token'
(Authentication interface Impl) 을 생성한다.
- Token을 AuthenticationManager 에게 해당 Token이 유효한지 확인
- AuthenticationManager는 1개 이상의 AuthenticationProvider 를 갖고 있는데 ,
AuthenticationProvider 는 Token 객체를 판단하여 인증처리를 시도한다.
- AuthenticationProvider가 직접 구현한 서비스(UserDetailService)에 해당유저에게 인증요청을 보내어 사용자 정보를 가져온다.
- UserDetailService 구현 클래스는 SecurityContextHolder 의 Context(세션의 사용자 정보가 있는 DB) 에서 사용자 정보를 가져와 UserDetails를 반환한다.
- ~ 10. Provider는 UserDetailService 에서 반환된 UserDetails와 클라이언트가 제공한인증정보(Token)을 대조하여 사용자가 유효한 사용권한을 가지고 있는지 확인한다.