Authentication
Authorization
사용자가 올바른 인증을 하면, 서버에서 제공하는 서비스를 이용할 수 있는 권한을 관리한다라는 개념
Servlet filter
와 이들로 구성된 filter chain
을 사용한다.Http Request
: 사용자가 로그인 정보와 함께 인증 요청AuthenticationFilter
가 요청을 가로챈다. 이때 가로챈 정보를 통해 UsernamePasswordAuthenticationToken
객체 생성UsernamePasswordAuthenticationToken
: 사용자가 입력한 데이터를 기반으로 생성, 즉 현상태는 미검증 AuthenticationAuthenticationManager
의 구현체인ProciderManager
에게 UsernamePasswordAuthenticationToken
객체를 전달AuthenticationProvider
에 UsernamePasswordAuthenticationToken
객체를 전달 UserDetailService
에 사용자 정보를 넘겨준다.UserDetailService
의 loadUserByUsername()
메서드가 반환하는 UserDetails
객체를 비교하면서 동작한다.UserDetailService
와 UserDetails
구현을 어떻게 하느냐에 따라서 인증의 세부 과정이 달라진다.UserDetails
객체를 생성AuthenticationProvider
는 UserDetails
를 넘겨받고 사용자 정보를 비교Authentication
객체를 반환AuthenticationFilter
에 Authentication
객체를 반환Authentication
객체를 SecurityContext
에 저장OAuth
Resource Owner
: 개인 정보의 소유자 (e.g. 회원)Client
: 제 3의 서비스로부터 인증을 받고자 하는 서버 (e.g. 개발 서비스)Resource Server
: 개인 정보를 저장하고 있는 서버 (e.g. Google)Client ID
: Resource Server
에서 발급해주는 IDClient Secret
: Resource Server
에서 발급해주는 PWAuthorized Redirect URI
: Client
에서 등록하는 URI. 만약 이 URI로부터 인증을 요구하는 것이 아니라면, Resource Server
는 해당 요청을 무시한다. Client
가 Resource Server
에 등록이 완료되었다면 Access Token을 발급받을 수 있다.
//예시 링크
https://accounts.google.com/
?client_id=123
&scope=profile,email
&redirect_uri=http://localhost
사용자가 정상적으로 로그인 했다면, Google은 이전에 등록되었던 Client ID인 서버의 Redirect URI
가 동일한지 확인한다.
일치한다면 유저에게 scope
기능을 넘겨줄 것인지에 대한 승인 여부를 물어보고 동의한다면 이에 해당하는 authorization_code
라는 임시 PW를 발급한다.
이후 http://localhost/?authorization_code=2
로 리다이렉트 되며, 개발 서비스의 서버는 이 authorization_code
를 가지고 Google에게 Access Token을 요청한다. 사용자의 인증이 필요할 때마다 Access Token을 이용하여 접근한다.
Session ID
를 사용자에게 응답한다. Header
에 Session ID
가 담긴 Cookie를 넣어 통신하고, 서버에서는 Cookie를 검증하여 데이터를 응답한다.Claim
기반 방식을 사용한다.Claim
: 사용자에 대한 속성 값Access Token
- 리소스(사용자의 정보)에 직접 접근할 수 있도록 하는 정보만을 가지고 있다.
Refresh Token
- 새로운 Access Token을 발급 받기 위한 정보를 담고 있다.
마이크로 서비스이거나 서버 간의 통신이 잦은 경우, Access Token을 자주 주고받을 수 밖에 없다.
각 서버는 API 호출 요청에 대해서 전달 받은 Access Token이 유효한 지를 확인해야 한다. 이는 서버에서 클라이언트의 상태(= Access Token 유효성)를 관리하게끔 한다.
API를 호출할 때마다 Access Token이 유효한지 매번 DB에서 조회하고 새로 갱신 시 업데이트 작업을 해주어야 한다.
클라이언트 상태를 관리 및 공유할 추가적인 저장 공간과 매 요청마다 Access Token의 검증 및 업데이트를 위한 DB 호출이 발생하는 구조
마이크로 서비스 개발처럼 서버의 수가 많은 경우, 각각의 서버가 Access Token의 유효성 및 권한 확인을 Auth Server에 요청하기 때문에 병목 현상 등이 발생해 서버 부하로 이어질 수 있다.
참고