일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- WeNews
- 2 > /dev/null
- 메세지수정
- 추후정리
- foreignkey
- docker명령어
- 외부키
- EC2
- appspec.yml
- 포트
- 테스트
- Query
- ㅔㄴ션
- 커밋메세지수정
- 적용우선순위
- 네이티브쿼리
- querydsl
- 컨테이너실행
- application.yml
- 서브쿼리
- subquery
- 검색
- 메소드명
- 참조키
- appspec
- MySQL
- ubuntu
- 테스트메소드
- AuthenticationEntryPoint
- 예약
Archives
- Today
- Total
제뉴어리의 모든것
[Section4] section4 회고 (Spring Security 의 주요 컴포넌트와 인증과정에 대한 이해) 본문
코드스테이츠/정리 블로깅
[Section4] section4 회고 (Spring Security 의 주요 컴포넌트와 인증과정에 대한 이해)
제뉴어리맨 2022. 10. 19. 22:39Section4 에서 중요하지만 명확하지 않았던 개념을 살펴보도록 하겠다.
전체항목
- Spring Security 기본 개념
- Spring Security의 인증 과정의 흐름
- 주요 컴포넌트
Spring Security 기본 개념
- Authentication
인증 - Authorization
권한부여(인가) - Principal
주체
ex: 인증을 요청하는 주체 => 사용자 - Authority
권한 - Access Control
접근제어
사용자가 서버의 리소스에 접근하려할때 통제하는것
Spring Security의 인증 과정의 흐름
주요 컴포넌트
- AbstractAuthenticationProcessingFilter
인증 처리의 필터링을 담당하는 필터 클래스.
인증 처리의 시작점이라고 생각하면 된다.
Credential을 인증하는 기본 Filter이다.
하위 클래스들은 인증(로그인)하는 각기 방식에 따라 존재한다.
하위 클래스
- UsernamePasswordAuthenticationFilter :
해당 클래스는 AbstractAuthenticationProcessingFilter 의 기본 하위 클래스로써,
따로 Security 설정을 해주지 않는다면 기본적으로 인증과정에 작동하는 필터 클래스이다.
ID와 Password로 검증하는 방식으로 인증을 한다.
- Authentication
인증 요청이 들어온 유저정보 (ID,PWD) 또는 이미 인증이 된 유저 정보(ID,PWD) 를 담는 인터페이스.
공식문서에서는 유저정보를 토큰이라고 표현하기도 한다.
그래서 구현체명도 토큰이 들어가나 보다.
구현체
UsernamePasswordAuthenticationToken
- AuthenticationManager
인증과정을 총괄하는 인터페이스.
총괄한다는것은 직접 뭔가 비밀번호를 검증한다던가 하는 것이 아니라,
필요한 처리들을, 더 책임과 역할이 명확한 클래스에게 위임을 한다는것이다.
구현체
- ProviderManager
AuthenticationManager는 인터페이스이므로 필요한 기능만 정의가 되어있고,
실질적으로 처리를 위임하는 코드가 들어있고, 역할을 하는 클래스이다.
인증된 Authentication을 최종적으로
인증처리를 시작했던 필터 클래스에게 전달한다.
사실 ProviderManager의 명칭에서 가장 헷갈렸던것이
왜 Provider의 Manager(관리자) 라고 할까였다.
그것은 아래 AuthenticationProvider 내용에서 나오지만, Provider가 다양하기 때문이다.
- AuthenticationProvider
인증을 위임받아 실제로 Credential을 검증하는 기능이 정의되어 있는 인터페이스.
ID, PWD 기반의 인증을 기반으로 생각했을때, 요청으로 들어 온 PWD와 실제 유저정보저장소에 저장되어 있는 해당 ID의 PWD 랑 일치하는 검사하는 역할을 하는것이다.
그리고 ID, PWD 방식의 인증 방식 이외의 여러 방식마다 각자의 구현체를 존재한다.
구현체
- DaoAuthenticationProvider
AuthenticationProvider의 가장 스탠다드한 구현체로써
UserDetailsService 및 PasswordEncoder를 활용하여 사용자 이름과 암호를 인증하는 AuthenticationProvider 구현체이다.
쉽게 말해서,
ID, PWD 기반의 인증과정에서 사용되는 AuthenticationProvider의 구현체이다.
만약, ID, PWD 기반의 인증이 아닐 경우 다른 AuthenticationProvider의 구현체가 쓰일것이다.
아래의 그림에서 볼 수 있듯이 AuthenticationProvider는 인증방식 별로 여러개의 구현체가 존재한다.
그래서 AuthenticationProviders라고 한다
아래 처럼 구현체가 다양하다.
- UserDetails
유저 정보가 담기는 인터페이스이다.
Spring Security 내에서 지속적으로 쓰이는, 개념의 인터페이스가 아니라
정말 단순히 유저 정보를 읽어왔을때 담을려고 사용하는 느낌의 인터페이스이다.
온전히 한 인증정보를 의미하는 Authentication의 기반이 된다.
일반적으로 User 클래스가 구현체로 사용된다.
구현체
- User
- InetOrgPerson
- LdapUserDetailsImpl
- Person
- UserDetailsService
유저 정보를 유저정보저장소에서 읽어오는 역할의 의미를 하는 인터페이스이다.
구현체
CachingUserDetailsService, InMemoryUserDetailsManager, JdbcDaoImpl, JdbcUserDetailsManager, LdapUserDetailsManager, LdapUserDetailsService
구현체가 위와 같이 다양하게 있지만, 실제로 Spring Security를 사용할때 쓰일 일은 거의없다.
왜냐하면 유저 정보는 당연히 서비스에서 사용하는 별도의 데이터베이스에서 사용할것이기 때문에,
Spring Security에서 다른 컴포넌트는 상속받아 재구성 하지 않더라도 UserDetailsService 만큼은 구현을 해서 유저의 데이터를 가져오는 부분을 만들어줘야 Spring Security를 제대로 사용하는것이기 때문이다.
- SecurityContext
현재 쓰레드에서 인증된 사용자정보(Authentication)를 담을 틀 역할을 하는 인터페이스이다.
구현체
- SecurityContextImpl
- SecurityContextHolder
SecurityContext에 접근을 가능하게 해주는 헬퍼 클래스.
인증된 SecurityContext를 가지고 있다고 생각하면된다.
참조
- Filter에 대해
- AuthenticationProviders에 대해
https://www.javadevjournal.com/spring-security/spring-security-authentication-providers/
https://www.baeldung.com/spring-security-multiple-auth-providers
- DaoAuthenticationProvider 에 대해
- UserDetails에 대해
- SecurityContext에 대해
https://www.javacodegeeks.com/2018/02/securitycontext-securitycontextholder-spring-security.html
- Authentication에 대해
- 인증 과정에 대해
'코드스테이츠 > 정리 블로깅' 카테고리의 다른 글
[Section4] 기술 면접 (0) | 2022.10.19 |
---|---|
[Section4] [Cloud] 운영전략 (0) | 2022.10.18 |
[Section4] [Cloud] 배포 자동화 - 1 (0) | 2022.10.18 |
[Section3] section3 회고 (0) | 2022.10.18 |
[Section 3] [Spring MVC] API 문서화 (0) | 2022.10.18 |