이번 사이드 프로젝트에서 로그인 파트를 담당하면서 OAuth 구현이 필요해 학습해보려고 한다.
용어 정리
Resource Server: 사용자의 데이터를 가진 서버(Google, Facebook, Twitter)
Client: 사용자가 접근하는 서비스
Resource Owner: 사용자, 자신의 리소스에 대한 접근 권한을 가지는 주체
Authorization Server 인증 및 권한과 관련된 처리를 전담하는 서버
우선 클라이언트가 리소스 서버를 이용하기 위해서는 리소스 서버의 승인을 사전에 받아야한다. 이는 기능을 사용할 각 사이트(구글, 카카오 등)에서 승인받을 수 있다.
승인되면 아래와 같은 정보를 받을 수 있다. 이는 Client와 Resource Server 모두가 가지게 된다.
Client ID: 우리의 서비스를 식별하는 ID (노출 가능)
Client Secret: ID에 대한 비밀번호(노출되면 안됨)
Authorized redirect URLs: Authorized 코드를 전달해줄 URL
리소스 오너가 리소스 서버에 접근하여 로그인을 하게되면 클라이언트 아이디와 요청한 리다이렉트 URL가 같은지 확인하여 다르면 작업을 끝내고, 같다면 리소스 오너에게 권한 확인 메세지를 전송한다.
허용 한다면 리소스 오너의 user id 와 기능 scope 사용한다는 권한을 동의하였다는 정보를 서버에 저장.
리소스 서버가 승인을 하기 위한 엑세스 토큰을 발급하기 전에 authorization code라고 하는 임시 비밀번호를 리소스 오너에게 전송하고 Location 헤더값에 의해 authorization code가 클라이언트에 전송된다.
이후 클라이언트는 리소스 서버에 직접 접근하여 redirect_url, client_id, client_secret를 전송한다. 리소스 서버는 이 정보들이 일치하는지 확인하고 AccessToken을 발급한다.
발급받은 AccessToken을 클라이언트에게 응답해준다. 이를 클라이언트가 저장하여 관리하게 된다.
AccessToken은 일반적으로 1시간, 2시간, 길게는 60일 정도의 수명이 있다. 이 수명이 끝나면 API에 접근해도 데이터를 보내주지 않기 때문에 사용자는 AccessToken 토큰을 재발급 받아야 하고 이러한 과정은 사용자의 경험상 불편할 수 있는데 손쉽게 AccessToken을 재발급받기 위해 필요한 것이 Refresh token이다.

Refresh token을 Authorization Server에 전달하여 Access Token을 다시 재발급 받을 수 있다.
OAuth 2.0 메커니즘은 아래와 같은 권한 부여 유형들을 지원하고 있으며 최신 버전인 2.1버전에선 일부는 Deprecated 되었다.
Authorization Code Grant Type
권한 코드 부여 타입, 백에서 동작하는 보안에 가장 안전한 유형


Implicit Grant Type
암시적 부여 타입으로 프런트 채널에서 동작, 스크립트와 토큰이 노출되며 보안에 취약하다, refersh token을 사용하지 못해서 매번 access token을 발급받아야 한다.

Resoucre Owner Password Credentials Grant Type
리소스 사용자 비밀번호 자격증명 부여 타입으로 사용자의 id, password를 이용하여 검증받는 방식이며 id, password가 노출되며 보안에 취약하다.

Client Credentials Grant Type
클라이언트 자격 증명 권한 부여 타입으로 앱이 리소스 소유자인 동시에 클라이언트의 역할을 한다. 서버대 서버간의 통신에 사용하며 Client Id 와 Client Secret 을 통해 액세스 토큰을 바로 발급 받기 떄문에 Refresh Token을 제공하지 않는다. UI, 화면이 없는 서버 애플리케이션에 사용

Refresh Token Grant Type
새로고침 토큰 부여 타입으로 access token이 발급될때 refresh token이 함께 제공되어 활용가능



Reference
https://www.youtube.com/@coohde
https://www.inflearn.com/course/%EC%A0%95%EC%88%98%EC%9B%90-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0/