OAuth란?
외부 소셜 계정을 기반으로 간편히 회원가입 및 로그인할 수 있는 웹 어플리케이션을 쉽게 찾아볼 수 있다.
클릭 한 번으로 간편하게 로그인할 수 있을 뿐만 아니라, 연동되는 외부 웹 어플리케션에서 제공하는 기능을 간편하게 사용할 수 있다는 장점이 있다.
이 때 사용되는 프로토콜이 OAuth이다.
OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다. (위키백과)
OAuth 용어 정리
Resource Server: Client가 제어하고자 하는 자원을 보유하고 있는 서버
- Slack, Google, Github 등이 속한다.
Resource Owner: 자원의 소유자
- Client의 서비스에 로그인하려고 하는 유저가 속한다.
Client: Resource Server를 통해 정보를 가져오고자하는 웹 어플리케이션이 속한다.
Scope: Client가 Resource Server로 부터 인가받을 권한의 범위
Access Token: 리소스 서버에서 사용자에 의해 부여된 데이터에 접근하기 위해서 클라이언트가 사용할 수 있는 유일한 키.
OAuth 동작 과정
- Client(웹 어플리케이션) 등록
- Client는 Resource Server를 사용하기 위해 자신의 서비스를 등록하고 승인을 받아야 한다.
- 세 가지 정보를 부여 받는다.
- Client ID, Client Secret, Authorized redirect URL
- Resource Owner의 승인
- Resource Owner는 Clien의 로그인 서비스를 이용하기 위해 소셜 로그인 버튼을 클릭한다.
- Resource Owner는 Resource Server에게 파라미터로 Client ID, Redirect URL, Scope를 포함한 요청을 보낸다.
- Resource Server는 다음 두 가지를 검사한다.
- 파라미터로 전달된 Client와 동일한 ID 값이 존재하는지 확인한다.
- 해당 Client ID에 해당하는 Redirect URL이 파라미터로 전달된 Redirect URL과 같은지 확인한다.
- Resource Server는 Resource Owner에게 Scope에 해당하는 권한을 Client에게 부여할 것인지를 확인한다.
- Resource Owner가 승인하면 Resource Server는 위에 포함된 Redirect URL에 임시 승인 코드(code)를 Client에게 보낸다.
- Resource Server의 승인
- Client는 받은 임시 승인 코드(code)와 함께 Client ID, Client Secret을 Resource Server에게 전송한다.
- Resource Server는 임시 승인 코드(code), Client ID, Client Secret을 확인한 후 Access Token을 발급한다.
- Client의 Access Token 사용
- Client는 해당 Access Token을 이용해 Resource Server의 자원을 사용하기 위한 API 호출 시 해당 토큰을 헤더에 담아 보낸다.
OAuth를 이용한 슬랙 로그인 동작 과정
이번 프로젝트에서는 OAuth 로그인으로 슬랙을 활용하였다.
그럼 이 OAuth 프로토콜을 이용한 슬랙 로그인 동작 과정에 대해 알아보자.
- User는 Slack에게 권한을 요청한다.
- Slack은 임시 승인 코드(code)를 전송한다.
- User는 code를 이용해 WAS에 로그인 요청을 한다.
- WAS는 User로 부터 전달받은 code와 함께 Client ID, Client Secret을 포함해 access token 발급을 요청한다.
- Slakc은 access token을 발급한다.
- WAS는 발급받은 access token을 이용해 slack에 필요한 정보를 요청한다. (예: 사용자의 프로필, 이름, 이메일 등)
- Slack은 해당하는 자원을 전송한다.
- WAS는 6에서 받은 자원을 이용해 자체적인 로그인 로직 실행 후 User에게 자신의 access token을 발급한다.
reference
https://ko.wikipedia.org/wiki/OAuth
https://tecoble.techcourse.co.kr/post/2021-07-10-understanding-oauth/
https://deeplify.dev/back-end/spring/oauth2-social-login
https://velog.io/@jakeseo_me/Oauth-2.0과-OpenID-Connect-프로토콜-정리