일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- softeer
- kotlin
- 시나공
- MYSQL
- python
- programmers
- C++
- CJ UNIT
- 회고
- 백준
- 데이터베이스
- 소프티어
- 백준알고리즘
- 정보처리산업기사
- 백준 알고리즘
- 파이썬
- 공부일지
- 코딩봉사
- 문제풀이
- SQL
- 1과목
- 코틀린
- 자바
- 프로그래머스
- java
- BFS
- 알고리즘
- SW봉사
- 스프링
- 코딩교육봉사
- Today
- Total
JIE0025
[Spring] Spring Security 개념, 특징, 구조 본문
[Spring] Spring Security 개념, 특징, 구조
Kangjieun11 2022. 10. 6. 18:56
스프링 시큐리티 (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
'백엔드 > 스프링, 스프링부트, JPA, Spring Webflux' 카테고리의 다른 글
[JPA] JPQL 개념, 기본 기능 (0) | 2022.10.27 |
---|---|
[JPA] 엔티티(entity) 개념 (0) | 2022.10.27 |
[Spring] JUnit 5 : 자바 테스팅 기반 프레임 (0) | 2022.09.29 |
[Spring] 어노테이션(Annotation)정의, 종류 (0) | 2022.04.23 |
[Spring] 게시판 만들기 - 3) Github 연동하기 (0) | 2021.09.18 |