OAuth2는 일종의 인증 프로토콜입니다. 소셜 인증을 통한 로그인 및 권한 제어를 위해 사용됩니다. 그래서 구글, 트위터, 깃허브, 페이스북, 네이버 등 대부분 소셜 인증 기능을 가진 provider는 표준 인증 방식으로 OAuth2를 채택하여 인증 관련 API를 제공합니다.
OAuth2의 구현체를 활용하면, 유저들의 정보를 대량으로 가지고 있는 소셜 회사(구글, 네이버 등)로부터 유저의 데이터를 애플리케이션 서버에 가져와 활용할 수 있습니다. 유저가 서비스를 사용하면서 소셜 로그인을 원할 경우, 해당 요청은 브라우저, 즉 클라이언트로부터 받아옵니다. OAuth2의 핵심 구성 요소를 뽑아보자면 소셜 로그인을 요청하는 유저(리소스 주인), 유저의 요청을 받아 애플리케이션 서버에 로그인 요청을 날리는 클라이언트, 데이터를 제공하는 리소스 서버, 데이터를 받아와 활용하는 애플리케이션 서버, 애플리케이션 서버가 리소스 서버로부터 데이터를 받아오기 위한 인증을 처리하는 권한 서버로 정리할 수 있습니다.
그림에는 나와있지 않지만, 1번 이전에 유저가 애플리케이션에게 로그인을 요청합니다. 유저로부터 로그인 요청을 받은 애플리케이션이 유저에게 내가 너의 어떤 정보에 접근해도 되겠니? (이메일, 이름, 프로필 사진 등) 승인을 요청합니다. 유저가 해당 요청을 승인하면 리소스를 받아올 준비를 합니다.
그런데, 그림을 보면 리소스 서버로부터 데이터를 받아오기 전, 두 가지 정보를 주고 받는 것을 볼 수 있습니다. Authorization Grant와 Access Token인데요. 어떠한 목적으로 사용되길래 정보가 두개 필요한걸까요?
Authorization Grant, 그중 표준이 되는 방식인 Authorization Code는 권한 서버로부터 인증을 받고 권한을 허가 받습니다. 이 코드를 받은 클라이언트는 코드를 권한 서버에 전송하여 Access Token을 받습니다. 받은 토큰으로 리소스 서버에 유저 데이터를 요청하여 받아옵니다. 정리하자면 Authorization Code는 권한 서버로부터 인증을 받기 위함이고, Access Token은 리소스 서버로부터 데이터를 가져오기 위해 사용되는 키입니다. 이 방법은 access token을 바로 Client(클라이언트)로 곧바로 전달하지 않기 때문에 전달과정에서 생길 수 있는 유출 위험을 줄일 수 있습니다.
제가 위의 단락에서 Code가 Grant 중 하나이다라는 표현을 캐치하셨나요? OAuth2 프로토콜은 다양한 클라이언트 환경에 적용할 수 있도록, 권한 부여 방식에 따른 프로토콜을 4가지 종류로 분류했습니다. 저희가 알아본 인증 코드를 사용하는 방식이 가장 기본이 됩니다. 그외에도 Implicit Grant, Resource Owner Password Credentials Grant, Client Credentials Grant 방식 등이 있습니다.
OAuth2는 소셜 로그인을 구현하려면 필수적으로 알아야하는 프로토콜이라, 관련 강의나 자료가 많습니다. 개인적으로 추천하는 자료 위주로 링크에 남길테니, 제 설명만으로 이해가 충분히 되지 않으신 분들은 참고해주세요!