📌 OAuth 란?
: OAuth2.0은 인증을 위한 표준 프로토콜의 한 종류
보안 된 리소스에 엑세스하기 위해 클라이언트에게 권한을 제공(Authorization)하는 프로세스를 단순화하는 프로토콜 중 한 방법이다.
📌 OAuth 는 언제, 왜 쓸까?
유저 입장에서 생각해 보자면, 우리는 웹상에서 굉장히 많은 서비스를 이용하고 있고 각각의 서비스들을 이요하기 위해서는 회원가입 절차가 필요한 경우가 대부분이다.
그 서비스별로 ID와 Password를 다 기억하는 것은 매우 귀찮은 일이다.
OAuth를 활용한다면 자주 사용하고 중요한 서비스들(예를 들어 google, github, facebook)의 ID와 Password만 기억해 놓고 해당 서비스들을 통해서 소셜 로그인을 할 수 있다.
뿐만 아니라 OAuth는 보안상의 이점도 있다. 검증되지 않은 App에서 OAuth를 사용하여 로그인한다면, 직접 유저의 민감한 정보가 App에 노출될 일이 없고
인증 권한에 대한 허가를 미리 유저에게 구해야 하기 때문에 더 안전하게 사용할 수 있다.
📌 OAuth에서 꼭 알아야할 용어
- Resource Owner : 액세스 중인 리소스의 유저이다. 김코딩의 구글 계정을 이용하여 App에 로그인할 경우, 이때 Resource owner은 김코딩이 된다.
- Client : Resource owner를 대신하여 보호된 리소스에 액세스하는 응용프로그램이다. 클라이언트는 서버, 데스크탑, 모바일 또는 기타 장치에서 호스팅 할 수 있다.
- Resource server : client의 요청을 수락하고 응답할 수 있는 서버이다.
- Authorization server : Resource server가 액세스 토큰을 발급받는 서버이다. 즉 클라이언트 및 리소스 소유자를 성공적으로 인증한 후 액세스 토큰을 발급하는 서버를 말한다.
- Authorization grant : 클라이언트가 액세스 토큰을 얻을 때 사용하는 자격 증명의 유형이다.
- Authorization code : access token을 발급받기 전에 필요한 code이다. client ID로 이 code를 받아온 후, client secret과 code를 이용해 Access token 을 받안온다.
- Access token : 보호된 리소스에 액세스하는 데 사용되는 credentials이다. Authorization code와 client secret을 이용해 받아온 Access token으로 이제 resource server에 접근을 할 수 있다.
- Scope : scope는 토큰의 권한을 정의한다. 주어진 액세스 토큰을 사용하여 액세스할 수 있는 리소스의 범위이다.
🔸 Authorization Code Grant Type
: Grant Type 중에서 가장 일반적으로 사용되는 유형이다.
유저가 승인을 한 후에, 액세스 토큰을 얻기 위해 Authorization Code를 받아 액세스 토큰과 교환을 한다.
보안성 강화를 위해, 클라이언트에서 클라이언트 ID를 공유하여 Authorization Code를 받고, 서버에 이 Authorization Code를 요청하여 Access Token을 응답받는 방식이다.
Authorization Code Grant Type의 흐름은 다음과 같다.
- 먼저, 유저가 서비스 이용을 위해 클라이언트에 접근을 요청
- 클라이언트는 이 유저를 검증하기 위해 권한 관리 서버(Authorization Server)로 리다이렉트
- 권한 관리 서버에서 접근이 승인된다면, Authorization Code를 클라이언트에게 제공
- 클라이언트는 권한 관리 서버에 Authorization Code를 요청에 함께 담아 보내고, Authorization Code를 확인한 권한 관리 서버는 Access Token을 클라이언트에게 교환
- 클라이언트는 받은 Access Token으로 요청한 데이터가 존재하는 Resource Server에 접근할 수 있음.
- 클라이언트는 Access Token을 5번 획득했기 때문에, 이 토근으로 권한 관리 서버를 거치지 않고 직접적으로 Resource Server와 응답 교환
- Resource Server는 클라이언트가 요청한 리소스를 전달.
🔸 Refresh Token Grant Type
액세스 토큰은 유효 기간이 지나면 만료가 된다. 만료가 될 때마다 유저에게 인증을 요구하는 것이 번거롭다. 그래서 다시 액세스 토큰을 편리하게 받기 위해 Refresh Token을 사용한다.
액세스 토큰과 리프레쉬 토큰의 만료 유효 기간이 리프레쉬 토큰이 더 길기 때문에 가능한 방법이다.
- 만일 액세스 토큰이 만료된 유저가 클라이언트에 접근한 경우, 클라이언트는 권한 관리 서버에 리프레쉬 토큰을 요청한다.
- 권한 관리 서버는 새로운 액세스 토큰을 응답한다.
- 클라이언트는 액세스 토큰으로 유저의 Resource Server에 접근을 요청한다.
📌 소셜 로그인 로직 플로우
스프린트에서 OAuth App을 통해 Access token을 받아오는 과정은 다음과 같다.