티스토리 뷰
[면접 준비 - Spring]Authentication, Authorization
Vagabund.Gni 2022. 12. 12. 00:20목차
Authentication
인증이란 사용자가 식별정보(Cridential)를 이용해 본인이 맞음을 증명하는 절차이다.
스프링 시큐리티 내부에서는 이를 위해 제법 길고 촘촘한 과정이 이어지는데, 요약에 도전해보자.
당연하게도 사용자가 크리덴셜을 담아 보낸 요청이 필터에 도달하면서 과정이 시작된다.
UsernamePasswordAuthenticationFilter
제출된 크리덴셜을 통한 인증을 처리하는 필터이다.
가장 앞에서 크리덴셜만 담은, 인증이 완료되지 않은 토큰을 생성(UsernamePasswordAuthenticationToken) 후
AuthenticationManager 호출.
AuthenticationManager
인증을 총괄하는 관리자 인터페이스. 실질적인 인증관리는 해당 클래스를 구현한 ProviderManager에 의해 이루어지며
ProviderManager는 AuthenticationProvider에게 인증에 대한 처리 위임을 한다.
인증 여부를 확인하는 authenticate() 메서드를 정의하고 있다.
AuthenticationProvider
인증 처리를 위임받아 실제적인 인증을 수행하는 인터페이스.
UserDetails와 크리덴셜 저장소를 조회해 비교하여 인증을 수행한다.
UserDetails
UserDetailsService에 의해 생성되며 크리덴셜과 권한 정보 등을 담는 인터페이스이다.
이후의 자격증명에 이용된다.
SecurityContextHolder and SecurityContext
다시 AuthenticationProvider로 돌아와서, 해당 인터페이스는 UserDetails의 크리덴셜과
앞서 받은 토큰에 포함된 크리덴셜이 일치하는지 확인하며,
검증에 성공하면 인증이 완료된 토큰을 생성해 리턴한다.
이 토큰은 다시 UsernamePasswordAuthenticationFilter까지 전달되며,
필터는 SecurityContextHolder를 이용해 SecurityContext에 토큰을 저장한다.
이때 사용되는 SecurityContext는 인증된 Authentication 객체를 저장하는 역할을 하는 인터페이스이고
SecurityContextHolder는 이런 SecurityContext를 관리하는 역할을 하는 클래스이다.
참고로 스프링 시큐리티에서는 아래 그림과 같이 SecurityContextHolder에 의해 SecurityContext가 채워져 있다면
인증이 완료된 사용자로 간주한다.
추가로 토큰에 접근하려면 반드시 SecurityContextHolder를 거쳐야 한다.
Authorization
인증이 끝나면 다음은 권한 부여이다. 권한부여 과정은 인증보단 한결 가볍다.
계속 가보자.
AuthorizationFilter
이름 그대로 권한 부여를 담당하는 클래스이다. URL을 통한 사용자의 접근을 제한한다.
먼저 앞서 알아본 SecurityContextHolder로부터 인증을 획득한다.
이어서 권한 부여 처리 후 HttpServletRequest와 함께 인증을 전송하는 역할을 하는데,
이 역할은 다음 컴포넌트인 AuthorizationManager 인터페이스를 DI 받음으로써 가능해진다.
참고로 check() 메서드는 AuthorizationManager의 구현 클래스에 따라 로직이 다른데,
URL을 기반으로 한 권한 부여 처리는 그림에 있는 RequestMatcherDelegatingAuthorizationManager를 사용한다.
AuthorizationManager
권한부여 처리를 총괄하는 인터페이스이다. 권한부여 여부를 확인하는 check() 메서드를 정의하고 있다.
RequestMatcherDelegatingAuthorizationManager
AuthorizationManager의 구현체 중 하나이며, 직접 권한 부여 처리를 하지 않고
RequestMatcher를 통해 매치되는 AuthorizationManager에게 권한 부여 처리를 위임한다.
계속해서 매치되는 Authorization 구현 클래스가 있다면 그 구현 클래스가 사용자의 권한을 체크하며,
적절한 권한이라면 다음 단계를, 그렇지 않다면 예외를 표시한다.
추가로 여기서 RequestMatcher 객체는 SecurityConfiguration에서 메서드 체인 정보를 기반으로 생성된다.
이상의 글에 대한 풀버전(?)은 아래 글에 있다.
2022.09.22 - [Development/Spring] - [Spring]Spring Security - 인증(Authentication) 구조
2022.09.22 - [Development/Spring] - [Spring]Spring Security - 권한 부여(Authorization) 구조
'Development > Technical Interview' 카테고리의 다른 글
[면접 준비 - Cloud]CI/CD 그리고 배포 자동화의 개념과 차이점 (0) | 2022.12.13 |
---|---|
[면접 준비 - Java+Spring]자바와 스프링을 사용하는 이유 (4) | 2022.12.13 |
[면접 준비 - Java]Java 8 vs. Java 11 (8) | 2022.12.12 |
[면접 준비 - Spring]Spring Security (2) | 2022.12.11 |
[면접 준비 - Java?]Primary Memory (2) | 2022.12.11 |
[면접 준비 - Java]JVM 구조(2), Runtime Data Area (0) | 2022.12.11 |
- Total
- Today
- Yesterday
- 세모
- 유럽
- Backjoon
- 파이썬
- 백준
- 면접 준비
- spring
- 맛집
- Python
- BOJ
- 지지
- 세계여행
- 유럽여행
- java
- 스프링
- 중남미
- 리스트
- RX100M5
- 여행
- a6000
- 기술면접
- 스트림
- 남미
- 동적계획법
- Algorithm
- 자바
- 알고리즘
- 세계일주
- 야경
- 칼이사
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |