스프링 시큐리티 OAuth2
개념
- SecurityBuilder
- 웹 보안 구성하는 Bean 객체와 설정 클래스 생성
- 종류
- WebSecurity
- 우선 동작
- FilterChainProxy 반환(SecurityFilterChain을 포함함)
- HttpSecurity
- SecurityFilterChain 반환
- SecurityFilterChain: 인증 인가하는 Filter 클래스
- SpringConfigurer
- HTTP 요청 관련 보안처리 필터 생성 및 초기화 설정에 관여
- 인증 및 인가 초기화(SecurityBuilder에 포함됨)
- 작동 순서
- 빌더 클래스 생성
AutoConfiguration -> SecurityBuilder.build()
- 설정클래스 생성
- 초기화 작업 진행
SpringConfigurer.init() & SpringConfigurer.configure()
- SecurityContextHolder
- SecurityContext
- 접근 주체와 인증 정*(Authentication)를 담고 있다.
- Authentication
- Principal과 GrantAuthority 제공. 인증 성공 시 Athentication 생성 및 저장됨.
- Principal
- 유저 정보로 대부분의 경우 Principal로 UserDetails를 반환.
- GrantAuthority
- ROLE_ADMIN, ROLE_USER 등 Principal이 가지고 있는 권한이며 prefix(ROLE_) 설정 표준이 있음.
커스텀 설정 클래스
- SecurityConfig
- 커스텀하지 않을 경우 기본 설정 클래스 구동 위치
SpringBootWebSecurityConfiguration.defaultSecurityFilterChain()
- 설정 방식
- SecurityFilterChain
- WebSecurityConfigurerAdapter -> deprecated
Client Type 및 권한부여 유형
- 기밀형 Client VS 공개형 Client
- SPA와 같이 백엔드와 분리된 프론트엔드로 구성된 클라이언트는 노출되며 이 경우 access-token을 클라이언트에 직접 제공하면 보안에 취약하다.
권한부여 유형
- Authorization Code Grant
- 클라이언트 프론트가 코드를 발급받아 클라이언트 백엔드로 전달
- 클라이언트 백엔드가 해당 코드로 access-token을 발급받음
- Authorization Code Grant with PKCE
- 공개형 Client의 경우 코드 탈취로 인한 악용도 가능하므로 코드값도 PKCE로 암호화하는 고도화된 방식
- 이외 공개형 클라이언트에서는 사용이 지양되는 권한부여 유형들이 추가로 더 존재한다.
프로토콜
- OIDC(OpenID Connect) 1.0
- 인증(Authentification) 수단으로써의 OAuth 2.0 최상위 레이어
- ID 토큰(JWT) 반환
- 토큰 관련 엔드포인트 및 공개 키 정보 제공(/.well-known/openid-configuration)
- OAuth 2.0
ID Token VS Access Token
- ID Token
- 사용방식
- 사용자 신원확인에 사용
- API 요청에 사용 불가
- 발급방식
- ID Provider에서 발급
- ID Token(JWT) 디코딩하면 사용자 정보를 얻을 수 있음
- 의문점
- access_token 디코딩 시에도 신원정보 유사하게 제공하지만 인증 목적이 아닌 토큰?
- id token은 리소스 요청 시 신원정보를 응답값에 담아보내는 위험성을 최소화하기 위함?
- Access Token
Scope
- Resource Owner가 허가한 자원 정보의 범위를 의미
- OIDC Scope
- openid, profile, email, address, phone, …