0. OAuth2.0란
- 웹 서비스를 사용하다 보면 직접 웹 서비스에 회원가입 하지 않고, 구글, 네이버등 이미 회원가입된 정보를 가지고 간편히 로그인 및 회원가입을 할 수 있는 기능을 볼 수 있습니다. 이때 사용되는 프로토콜이 OAuth입니다.
- OAuth의 정확한 정의는 다음과 같습니다.
OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다. (위키백과)
- 이를 풀어서 설명하면 이미 인증된 서비스(네이버, 구글등)에 저장된 유저의 정보를 현재 사용중인 서비스가 접근할 수 있도록 허락해주는 방식을 말합니다.
- 이를 활용하여 간접적으로 로그인 및 회원가입과 유사한 효과로 구현할 수 있는 것입니다.(OAuth자체가 회원가입 로그인을 위한 것은 아닙니다.)
1. OAuth참여자
- Resource Server : Client가 제어하고자 하는 자원을 보유하고 있는 서버입니다.
- Facebook, Google, Twitter 등이 이에 속합니다.
- Resource Owner : 자원의 소유자입니다.
- Client가 제공하는 서비스를 통해 로그인하는 실제 유저가 이에 속합니다.
- Client : Resourece Server에 접속해서 정보를 가져오고자 하는 클라이언트(웹 어플리케이션)입니다.
- 어떤 유저가 Facebook에 로그인 한 상태로 새로운 웹 서비스에 OAuth를 통해 회원가입 및 로그인을 하고자 할 때 어떤 유저는 ResourceOwner, Facebook은 Resource Server, 새로운 웹 서비스는 Client에 해당합니다.
2. OAuth 과정및 개념
2.1 Resource Server에 Client등록
Client ID : 클라이언트 웹 어플리케이션을 구별할 수 있는 식별자이며, 노출이 무방합니다.
Client Secret : Client ID에 대한 비밀키로서, 절대 노출해서는 안 됩니다.
Authorized redirect URL : Authorization Code를 전달받을 리다이렉트 주소입니다.
2.2 Resource Owner의 승인.
- 2.1에서 얻은 정보를 Resource Owner가 다음과 같은 uri로 요청하면 해당 client의 자원 접근을 허용함을 확인하는 창을 받게 됩니다.
- 자원 허용 scope가 표시되고 authorize버튼이 있는 식으로 화면이 구성되는 경우가 일반적이며 해당 버튼을 누르게 되면 Resource Owner가 Client의 자원 접근을 허용하게 되고 Resource Server는 redirect_uri로 Authorization code를 가지고 redirection합니다.
2.3 Redirect_uri(callback)에 code로 Access token발급 요청
- Client는 Callback api를 구성하여 이를 redirect_uri로 2.1과정에서 Resource Server에 등록해 둡니다.
- 2.2과정에서 Resource Owner의 승인이 이루어지면 Authorization code를 가지고 redirect_uri로 리다이렉션 합니다.
- Client는 이 callback api에 Resource Server로 accesstoken 발급을 요청을합니다.
2.4 Access Token발급과 Resource Server에 Access Token을 이용하여 Resource Owner 정보 요청.
- Access Token을 발급 받으면 이를 가지고 Resource Owner의 정보를 알 수 있는 API를 호출하여 회원정보를 받아온다.
2.5 Resource Server로 부터의 회원정보로 로그인 혹은 회원가입 진행.
2.6 SessionId 혹은 JWT token등을 발행하여 로그인한 유저에게 발급.
- 이는 사실은 OAuth와는 무관하며 2.5까지 진행되고 나면 로그인 인증상태라고 판단하고 SessionId나 JWT token을 발급한다.
3.구현
3.1 Resource Server에 Client등록
- Resource Server마다 다르지만 기본적으로 동일한 것은
- Resource Server에서 client를 식별할 수 있게 Client Id, Client Secret을 발급 받는 부분
- Redirect_uri 명시: redirect uri는 code 인증 방식에서 code를 리다이렉션을 통해 발급받는 uri를 말함
- scope지정: 승인할 자원의 scope지정.
3.2 redirect_uri에서 code로부터 Access Token발급과 user-info api 요청.
- Spring Security에서는 redirect-uri를 yml에 설정하는 것으로 access token발급과 유저의 정보와 관련된 api요청을 자동화 할 수 있음.
spring:
security:
oauth2:
client:
registration:
authclient:
provider: authclient
client-id:
client-secret:
authorization-grant-type: authorization_code
redirect-uri: https://{client 도메인}/login/oauth2/code/authclient
scope:
- public
- profile
provider:
authclient:
authorization-uri: https://{resource_server_domain}/oauth/authorize
token-uri: https://{resource_server_domain}/oauth/token
user-info-uri: https://{resource_server_domain}/v2/me
user-name-attribute: login
3.3 SessionId 혹은 JWT token등을 발행하여 로그인한 유저에게 발급.