티스토리 뷰
초기화 과정
SecurityBuilder / SecurityConfigurer
- SecurityBuilder는 빌더 클래스로서 웹 보안을 구성하는 빈 객체와 설정 클래스들을 생성하는 역할을 한다
- ex) WebSecurity, HttpSecurity
- SecurityConfigurer는 Http요청과 관련된 보안처리를 담당하는 필터들을 생성하고 여러 초기화 설정에 관여한다
- SecurityBuilder는 SecurityConfigurer를 포함하고 있으며 인증 및 인가 초기화 작업은 SecurityConfigurer에 의해 진행된다.
- HttpSecurity는 최종적으로 SecurityFilterChain이라는 빈을 만든다
- WebSecurity는 설정클래스에서 정의한 SecurityFilterChain 빈을 SecurityBuilder에 저장한다
- WebSecurity가 build()를 실행하면 SecurityBuilder에서 SecuirtyFilterChain을 꺼내 FilterChainProxy 생성자에게 전달한다
AuthenticationEntryPoint
스프링 시큐리티는 초기화가 진행되면 두 개의 인증방식을 설정한다
FormLogin 인증방식, HttpBasic 인증방식
그런데 인증을 하면서 예외가 발생할 수 있기 때문에
각 인증방식마다 AuthenticationEntryPoint가 존재한다
ExceptionHandlingConfigurer에서는 AuthenticationEntryPoint에 관련된 설정을 다 한다
ExceptionTranslationFilter에는 AuthenticationEntryPoint가 저장이 된다
아무런 인증방식(FormLoginConfigurer, HttpBasicConfigurer)를 사용하지 않으면
Http403ForbiddenEntryPoint가 ExceptionTranslationFilter로 전달된다
시큐리티 인증 및 인가 흐름 요약
Servlet Filter
1. 사용자가 요청을 한다.
2. DelegatingFilterProxy가 받는다
Proxy는 클라이언트와 Web서버 중간에 위치하여 대신 통신을 받아주는 것이다
Proxy는 사실상 Tomcat같은 WAS인데 스프링의 DI나 AOP 등 빈으로 관리하는 기능이 없다
그래서 빈으로 관리할 수 있는
3. 스프링 시큐리티의 FilterChainProxy로 요청을 전달해준다
Authentication
usernamepasswordauthentication을 자주쓴다(formlogin)
1. AuthenticationFilter가 /login으로오면 받는다
2. Authentication 객체를 만든다(id, password)
3. AuthenticationManager호출
보안적으로 뭔갈 하지 않고, 인증처리를 실질적으로 할 수 있는 클래스를 찾아서 위임한다
4. AuthenticationProvider호출
AuthenticationProvider가 ID, PW를 통해 인증처리를 한다
5. AuthenticationProvider가 회원 ID가 DB에 존재하는지 확인할때 UserDetailsService 클래스를 사용한다
6. 회원을 찾았을때 반환하는 타입은 UserDetails이다(이름,주소 등의 정보를 포함한다)
7. UserDetails는 UserDetailsService를 거쳐 AuthenticationProvider로 전달됨
8. 회원 ID와 일치하는 계정이 존재하는것을 확인했으니, PW가 일치하는지
PasswordEncoder를 통해 확인함
9. PW도 일치하면 최종적으로 인증에 성공한 결과(인증객체)를 AuthenticationManager에게 전달한다
10. AuthenticationManager는 AuthenticationFilter에 Authentication객체를 전달한다
11. AuthenticationFilter는 Authentication을 SecurityContext(보관소)에 저장한다
클래스나 메서드 위치에 상관없이 전역적으로 SecurityContext에서 사용자 정보를 꺼내올수 있다
Authorization
1. 인증 또는 인가에서 예외발생시 ExceptionTranslationFilter에서 처리한다
2. FilterSecurityInterceptor 호출
인가에 권한이 있는지 없는지 판단하는 Filter
3. FilterSecurityInterceptor가 가진 AccessDecisionManager 클래스가 있는데
AccessDecisionManager는 접근을 허가할 것인지 판단하는 클래스
4. AccessDecisionVoter는 현재 사용자가 접근을 하고자하는 자원이 궈한이 있는지 없는지 투표하는 클래스
얘가 허가할지 거부할지 보류할지 이런 결과를 투표해서 다시 AccessDecisionManager에게 전달
5. 투표 결과에 따른 후속처리를 FilterSecurityInterceptor에서 해준다
'개념 > 스프링 부트' 카테고리의 다른 글
스프링 핵심 원리 기본편-2 (0) | 2023.01.02 |
---|---|
스프링 핵심 원리 기본편-1 (0) | 2023.01.02 |
자바 ORM 표준 JPA 프로그래밍 (0) | 2022.07.22 |
인텔리제이 깃허브 연동 (0) | 2022.07.18 |
도메인 모델과 테이블 설계 (0) | 2022.07.01 |
- Total
- Today
- Yesterday
- Android Studio
- git commit 수정
- 리눅스
- 프로그래머스
- authorization_code
- 인프콘2024
- bfs
- git
- 오픈소스
- oauth
- DDL
- 우분투
- SpringBoot
- 데이터베이스
- CSS
- git 예전 커밋 수정
- 2024인프콘
- infcon 2024
- html #웹 #웹사이트 #플레이리스트
- 데이터 3법
- oauth2.0
- 데이터3법
- DML
- html
- authorization code
- javascript
- 클로아
- kloa
- 로스트아크 캐릭터
- SQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |