AuthenticationAuthorization사용자가 올바른 인증을 하면, 서버에서 제공하는 서비스를 이용할 수 있는 권한을 관리한다라는 개념
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에 저장OAuthResource 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에 요청하기 때문에 병목 현상 등이 발생해 서버 부하로 이어질 수 있다.
참고