일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ./gr
- 로그인 인증 흐름
- 스프링
- 스프링부트 구조
- JWT
- 로그인/로그아웃
- java I/O
- MSA
- IPC
- 세션기반 인증
- RESTfull API
- Java
- @temproal
- 어노테이션
- 스프링부트
- spring
- 비즈니스 계층
- 작업명중복
- JPA
- 비동기
- 토큰기반 인증
- ORM
- 프레젠테이션 계층
- 스프링부트 계층구조
- 동기
- formmatted
- 스프링 부트 테스트
- 퍼시스턴스 계층
- ./gradlew docker
- http
- Today
- Total
[DEV] J-Jay
스프링 시큐리티(Security) 본문
스프링 시큐리티(Spring Security)
스프링 시큐리티는 스프링 기반 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크이다.
보안 관련 옵션을 제공하며, 어노테이션으로 설정하무로 매우 쉽게 사용할 수 있다.
CSRF(Cross Site Request Forgery 사용자의 권한을 가지고 특정 동작을 수행하도록 유도하는 공격)이나,
세션 공격(Session Fixation 사용자의 인증 정보를 탈취하거나 변조하는 공격)을 방어해 주고 요청 헤더도 보안 처리를 해주므로 개발자가 보안 관련 개발을 해야하는 부담을 크게 줄여준다.
필터 기반으로 동작하는 스프링 시큐리티
스프링 시큐리티는 필터 기반으로 동작한다.
스프링 시큐리티는 위와 같이 다양한 필터들로 나누어져 있으며, 각 필터에서 인증,. 인가와 관련된 작업을 처리한다.
SercurityContextPersistenceFilter부터 시작해서 아래로 내려가며 FilterSecurityInterceptor까지 순서대로 필터를 거친다.
1:UsernamePasswordAuthenticationFilter는 아이디와 패스워드가 넘어오면 인증 요청을 위임하는 인증 관리자 역할을 하며, 2:FilterSecurityInterceptor는 권한 부여 처리를 위임해 접근 제어 결정을 쉽게 하는 접근 결정 관리자 역할을 한다.
Filter | 내용 |
SecurityContextPersistenceFilter | SecurityContext Repository에서 SecurityContext(접근 주체와 인증 정보 객체)를 가져오거나 저장하는 역할 |
Logout Filter | 설정된 로그아웃 URL로 오는 요청을 확인해 해당 사용자를 로그아웃 처리 |
UsernamePasswordAuthenticationFIlter | 인증 관리자이며 폼 기반 로그인을 할 때 사용되는 필터로 아이디, 패스워드 데이터를 파싱해 인증 요청을 위임한다. 인증이 성공하면 AuthenticationSuccessHandler를, 인증이 실패하면 AuthenticationFailureHandler를 실행한다 |
DefaultLoginPageGeneratingFilter | 사용자가 로그인 페이지를 따로 지정하지 않았을 때 기본으로 설정하는 로그인 페이지 관련 필터이다 |
BasicAuthenticationFilter | 요청 헤더가 있는 아이디와 패스워드를 파싱해서 인증 요청을 위임한다. 인증이 성공하면 AuthenticationSuccessHandler를, 인증이 실패하면 AuthenticationFailureHandler를 실행한다 |
RequestCacheAwareFilter | 로그인 성공 후, 관련 있는 캐시 요청이 있는지 확인하고 캐시 요청을 처리해준다. 예를 들어 로그인 하지 않은 상태로 방문했던 페이지를 기억해 두었다가 로그인 이휑 그 페이지로 이동 시켜준다. |
SecurityContextHolderAwareRequestFilter | httpServletRequest정보를 감싼다. 필터 체인 상의 다음 필터들에게 부가 정보를 제공되기 위해 사용한다. |
AnonymousAuthenticationFilter | 필터가 호출되는 시점까지 인증되지 않았다면 익명 사용자 전용 객체인 AnonymousAuthentication을 만들어 SecurityContext에 저장한다. |
ExceptionTranslationFilter | 요청을 처리하는 중에 발생할수 있는 예외를 위임하거나 전달한다. |
FilterSecurityInterceptor | 접근 결정 관리자이다. AccessDecisionManager로 권한 부여 처리를 위임함으로써 접근 제어 결정을 쉽게 해준다. 이 과정에서는 이미 사용자가 인증되어 있으므로 유요한 사용자인지도 확인 가능하다. (인가 관련 설정) |
스프링 시큐리티 로그인 인증 흐름
사용자가 폼에 ID와 PW를 입력하면, HTTPServletRequest에 ID와 PW를 전달한다.
이때 AuthenticationFilter가 넘어온 ID와 PW의 유효성 검사를 하며 유효성 검사가 끝나면 실제 구현체인 UsernamePasswordAuthenticationToken을 만들어 전달한다.
전달받은 내용을 AuthenticationManger → AuthenticationProvider → UserDetailServcie에 전달하며
사용자 ID로 찾은 사용자의 정보를 UserDetails 객체로 만들어 AuthenticationProvider에게 전달한다.
DB에 있는 사용자 정보를 가져오며, 입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 진행한다.
인증이 완료되면, SecurityContextHolder에서에 Authentication을 저장하고 인증 성공 여부에 따라
성공은 AuthenticaitonSuccessHandler, 실패는 AuthenticationFailureHandler 를 실행한다.
'Back-end > Spring' 카테고리의 다른 글
스프링 부트 - JWT (0) | 2023.09.10 |
---|---|
스프링 부트 - 로그인/로그아웃 구현 (0) | 2023.09.10 |
스프링 부트 Blog 만들기 (3) (1) | 2023.09.09 |
스프링 부트 Blog 만들기 (2) - Thymeleaf (0) | 2023.09.05 |
스프링 부트 Blog 만들기 (1) (0) | 2023.09.04 |