웹이나 앱에서 흔히 찾아볼 수 있는 소셜 로그인 인증 방식은 OAuth라는 기술을 바탕으로 구현된다. 전통적으로 직접 작성한 서버에서 인증을 처리해주는 것과는 달리, OAuth는 인증을 중개해주는 메커니즘이다. OAuth2.0이란 인증을 위한 표준 프로토콜의 한 종류로, 보안된 리소스에 액세스하기 위해 클라이언트에게 권한을 제공(Authorization)하는 프로세스를 단순화하는 프로토콜이다.
이미지 출처: codestates urclass
- 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는 토큰의 권한을 정의합니다. 주어진 액세스 토큰을 사용하여 액세스할 수 있는 리소스의 범위입니다.
김코딩이라는 유저가 페이스북으로 소셜 로그인을 해서 유저의 페이스북 프로필 이미지를 받아올 경우(김코딩-App-페이스북), Resource Owner는 김코딩, Client는 App, Resource server는 페이스북, Authorization server는 페이스북, Scope는 이미지가 된다.
Grant type은 Client가 액세스 토큰을 얻는 방법으로, Authorization Code Grant type과 Refresh Token Grant type이 가장 많이 쓰인다.
Grant type 중 가장 일반적으로 사용되는 종류로, 액세스 토큰을 받아오기 위해서 먼저 Authorization Code를 받아 액세스 토큰과 교환하는 방법이다. Authorization Code 절차를 거치는 이유는 보안성 강화에 목적이 있다. Client에서 Client-secret을 공유하고 엑세스 토큰을 가져 오는 것은 탈취될 위험이 있기 때문에 Client에서는 Client ID만 이용해서 받아올 수 있는 Authorization Code를 먼저 받아오고, 서버에서 Client Secret까지 포함해서 Access token 요청을 진행한다.
이미지 출처: codestates urclass
이미지 출처: codestates urclass
일정 기간 유효 기간이 지나서 만료된 액세스 토큰을 편리하게 다시 받아오기 위해 사용하는 방법으로, 보통 액세스 토큰보다 Refresh token의 유효 기간을 좀 더 길게 설정하기 때문에 가능한 방법이다.