인증(Authentication), 권한 (Authorization)
💕구조
HttpRequest
)UsernamePasswordAuthenticationToken
(이하 UPAT) 객체 생성 (= 사용자가 입력한 데이터 기반의 미검증 상태 객체)AuthenticationManager
의 구현체인 ProviderManager
에게 UPAT
전달AuthenticationProvider
에게 토큰 전달UserDetailsService
에 사용자 정보를 넘겨준다.UserDetails
객체 생성AuthenticationProvider
는 6)의 객체를 받아서 사용자 정보를 비교Authentication
객체 반환Authentication
객체를 AuthenticationFilter
에서 반환하여 SecurityContext
에 저장UserDetailsService
UesrDetatils
UserDetailsService
의 메서드가 반환하는 UserDetails
객체를 비교하면서 동작한다.Spring Security에서 동작하는 기본 필터들의 목록 & 순서
❗If, OAuth2 로그인을 이용하면 UserPasswordAuthenticationFilter
대신 OAuth2LoginAuthenticationFilter
가 호출
AbstractAuthenticationProcessingFilter
가 감싸고 있다.구체적인 시큐리티 필터 형태
Access Token
을 발급 받아 해당 토큰을 기반으로 원하는 기능을 구현해야한다.Access Token
을 발급 받기 위한 일련의 과정을 인터페이스로 정의한 것이 바로 OAuth!Resource Owner
: 개인 정보 소유자 (U
)Client
: 제 3의 서비스로부터 인증 받고자 하는 서버 (직접 개발 웹 사이트 X
)Resource Server
: 개인 정보를 저장한 서버 (구글 등 (G
))Client ID
: Resource Servcer
에서 발급해주는 ID (X
에 G
가 할당한 ID를 알려준다.)Client Sercret
: Resource Servcer
에서 발급해주는 PW (X
에 G
가 할당한 PW를 알려준다.)Authorized Redirect URI
: Client
측에서 등록하는 URL (IF, 해당 경로로 인증을 요구하는 것이 아니라면 Resource Server
는 요청 무시)X
가 G
에 등록이 완료되면, Access Token
발급 가능https://accounts.google.com/?client_id=123&scope=profile,email&redirect_uri=http://localhost
의 쿼리 스트링cilent_id
: 123scope
: profile, emailredirect_uri
: http://localhostclient_id=123
인 서버의 redirect_uri
와 동일한지 확인scope=profile,email
기능을 넘겨줄 것인지에 대한 승인 여부를 물어보고 승인하면 authorization_code
라는 임시 PW 발급http://localhost/?authorization_code=2
로 리다이렉트되고 X에서 해당 코드를 갖고 구글 Access Token
에 요청 → 유저의 인증이 필요할때마다 토큰으로 접근서버 기반 인증 방식
Session
이용Access Token
/ Resfresh Token
OAuth 2.0
Resorce Server
에서 발급받은 Access Token
을 이용해 직접 개발한 서버의 API 서비스를 이용 및 호출. 이때, 마이크로 서비스나 서버간 통신이 잦은 경우에는 Access Token
을 자주 주고 받아야 한다.Access Token
이 유효한지 매번 DB에서 조회하고 갱신시 업데이트 해야한다. ⇒ (문제점) 클라이언트 상태를 관리 및 공유할 추가적인 저장 공간이 필요하고 매 요청마다 Access Token
의 유효성을 검증하고 업데이트를 위한 DB 호출이 발생 ⇒ (해결) JWT 기반 인증JWT
JWT : Claim(사용자에 대한 속성 값) 기반의 JSon Web Token
Auth Server에 검증 요청 생략(Why? 의미있는 토큰) ⇒ 비용 절감 & Stateless 아키텍처 구성
JWT는 확장성에 큰 강점이 있다.
JWT의 단점