백엔드/스프링, 스프링부트, JPA, Spring Webflux

[Spring] Spring Security 개념, 특징, 구조

Kangjieun11 2022. 10. 6. 18:56
728x90


스프링 시큐리티 (Spring Security)

스프링 기반 애플리케이션의 보안 - (인증, 인가)를 제공하는, 스프링 하위 프레임워크

인증 : 누구?
인가 : 뭘 할 수 있는가?
권한 :

스프링 시큐리티에서는 서블릿 필터(filter)와 이들로 구성된 필터 체인으로 구성된 위임 모델 사용

보안 관련 체계적인 옵션을 제공해주어, 개발자 입장에서 보안 관련 로직을 작성하지 않아도 되는 것이 장점!


특징

- Servlet API 통합
- Spring web MVC와의 선택적 통합
- 인증, 인가(권한 부여)에 대해 포괄적이고, 확장 가능한 지원
- session fixation(세션 고정 공격) clickjacking(클릭재킹) csrf(cross site request forgery 사이트간 요청 위조) 등 공격으로부터 보호


- 세션, 쿠키 방식으로 인증
- Filter 기반 동작, MVC와 분리해 관리 및 동작
- 어노테이션을 통한 간단한 설정

스프링 시큐리티의 요청 처리

- 서블릿 필터 체인을 자동으로 구성함 (기본적으로 사용하는 필터 多)
- 스프링 시큐리티는 필터를 거쳐 서블릿 서비스에 도달함.
- 모든 요청은 필터 체인을 반드시 거쳐야 서블릿에 도달 가능

로그인 인증 구조

1. 유저가 로그인을 하기 위해 아이디 비밀번호입력, 로그인 요청을 함 (http 요청이 들어옴)
-- AuthenticationFilter가 http servlet request에서 사용자가 보낸 정보를 intercept

2. 이 정보(아이디 비밀번호)를 기반으로 인증용 객체(UsernamePasswordAuthentication Token)를 만들어줌.
-- 프론트 단에서 유효성 검사를 하지만, 안전을 위해 다시한번 유효성 검사를 이 쪽에서 해주는 것 같음 (아이디나 비밀번호의 null 여부 등을 filter로 구현해주는 ...?)

3. UsernamePasswordAuthentication Token을 AuthenticationManager 인터페이스에게 전달/위임
( AuthenticationManager는 실제 인증을 처리할 Authentication Provider를 가지고 있음.)

4. 토큰을 Authentication Provider에게 전달
Provider에게 전달해 실제 인증 과정을 수행, 실제 인증 과정은 authenticate 함수에 작성하면 됨.
Spring Security에선 username으로 DB 데이터 조회 후 비밀번호의 일치 여부를 검사하는 방식으로 작동하므로
토큰으로부터 아이디를 먼저 조회하는 코드를 사용

5. UserDetailService로 조회할 아이디 전달
UserDetailService 인터페이스라 이를 implements할 클래스를 작성해야 함.

6.아이디 기반 DB 데이터 조회
구현체는 userVO 일 것이고, UserDetailService의 반환값이 UserDetails interface임

7. 아이디 기반 조회 결과 반환
사용자 아이디 기반 데이터 조회 실패 exception클래스도 추가

8. 인증 처리후 인증된 토큰을 Authentication Manager에게 반환 함.
DB에서 저장된 사용자 비밀번호는 암호화 되어 있으므로, 들어온 비밀번호를 PasswordEncoder를 통해 암호화 해, 조회된 비밀번호와 매칭되는지 확인해줘야함.
매칭 실패시 BadCredentialsException발생시켜 처리해줌

9. 인증된 토큰을 AuthenticationFilter에게 전달

10 인증된 토큰을 Security Context Holder에 저장 시 인증 과정 끝

요약

스프링 시큐리티 필터

간단한 이미지
인증관리자 (Authentication Manager)와 접근결정관리자 (Access Decision Manager)를 통한 사용자 리소스를 관리함

인증관리자 수행 : UsernamePasswordAuthentication Filter
접근 결정 관리자 수행 : Filter Security Interceptor

굉장히 많은 필터...

필터 종류 & 설명

Filter Description
HeaderWriterFilter HTTP 헤더를 검사하는 필터
CorsFilter 허가된 사이트나 클라이언트의 요청 여부 체크
CsrfFilter 내보낸 리소스에서 올라온 요청 여부 체크
LogoutFilter 로그아웃 여부 체크
UsernamePasswordAuthenticationFilter 로그인 시도 체크 : 로그인 시도시, 처리하고 이동될 페이지 설정
ConcurrentSessionFilter 매 요청마다 현재 사용자의 세션 만료 여부 체크
BearerTokenAuthenticationFilter Authorization 헤더에 Bearer 토큰 존재시 인증 처리
BasicAuthenticationFilter Authorization 헤더에 Basic 토큰 존재시 인증 처리
RequestCacheAwareFilter request 이력 캐시에 저장
SecurityContextHolderAwareRequestFilter 보안 관련 Servlet3 스펙 지원을 위한 필터
RememberMeAuthenticationFilter 아직 Authentication 인증이 안된 경우, RemeberMe 쿠키 검사를 통한 인증 처리
AnonymousAuthenticationFilter 인증이 안되었을시 Anonymous 사용자
SessionManagementFilter 서버에서 지정한 세션 정책 체크
ExcpetionTranslationFilter 인증 및 권한의 예외 발생시 캐치하여 처리
FilterSecurityInterceptor 대부분 가장 마지막에 사용되어, 인증이 존재한다는 상태로, 들어온 request에 대한 자격 체크와 리턴한 결과를 보내도될지 점검









참고 자료
https://mangkyu.tistory.com/77
https://youtu.be/aEk-7RjBKwQ
https://github.com/MangKyu/SpringSecurity-Example/tree/formbased
https://devuna.tistory.com/55
https://devfunny.tistory.com/615