웹이나 앱에서 흔히 찾아볼 수 있는 소셜 로그인 인증 방식은 OAuth 2.0라는 기술을 바탕으로 구현된다.
전통적으로 직접 작성한 서버에서 인증을 처리해주는 것과는 달리, OAuth는 인증을 중개해주는 메커니즘이다. 보안된 리소스에 액세스하기 위해 클라이언트에게 권한을 제공하는 프로세스를 단순화하는 프로토콜이다.
즉, 이미 사용자 정보를 가지고 있는 웹 서비스(GitHub, Google, Facebook 등)에서 사용자의 인증을 대신해주고, 접근 권한에 대한 토큰을 발급한 후, 이를 이용해 내 서버에서 인증이 가능해진다.
몇년전만 하더라도 특정 웹 앱의 서비스를 이용하기 위해선 해당 웹 앱에 회원가입을 하는 것이 우선이었지만 소셜 로그인이 보편화된 현재는 대부분의 사람들이 네이버 또는 카카오에 이미 가입된 계정을 이용해 빠르게 서비스에 가입하는 것을 택하고 있다.
뿐만 아니라 서비스를 구현하는 개발자도 신규 회원가입이나 회원 관리를 신경쓰지 않아도 되기 때문에 사용자와 기업 모두 소셜 로그인을 선호하고 있는 추세이다.
유저 입장에서 생각해보자면, 우리는 웹상에서 굉장히 많은 서비스를 이용하고 있고 각각의 서비스들을 이용하기 위해서는 회원가입 절차가 필요한 경우가 대부분이다. 각각의 서비스별로 ID와 Password를 다 기억하는 것은 매우 귀찮은 일이므로..
자주 사용하고 중요한 서비스들(예를 들어 google, github, facebook) 의 ID와 Password만 기억해 놓고 해당 서비스들을 통해서 외부 서비스로 소셜 로그인을 할 수 있다.
뿐만 아니라 OAuth는 보안상의 이점도 있다. 검증되지 않은 App에서 OAuth를 사용하여 로그인한다면, 직접 유저의 민감한 정보가 App에 노출될 일이 없고 인증 권한에 대한 허가를 미리 유저에게 구해야 하기 때문에 더 안전하게 사용할 수 있다.
Resource Owner
: 사용자이며 정보 제공자이기도 하기 때문에 Resource Owner라고 합니다.
Client
: Resource Owner를 대신하여 보호된 리소스에 액세스하는 애플리케이션입니다.
Local Server
: Client의 요청을 수락하고 응답할 수 있는 서버입니다.
Resource Server
: 사용자의 정보를 저장하고 있는 서버입니다.
Authorization Server
: 인증을 담당하고 있는 서버입니다. Access Token을 발급하는 인증 서버입니다.
Authorization Grant
: Client가 Access Token을 얻는 방법을 의미합니다. 다음과 같은 방법들이 주로 사용됩니다.
Authorization Code
: Authorization Grant의 한 타입으로 Access Token을 발급받기 위한 Code를 의미합니다.
Access Token
: 보호된 리소스에 액세스하는 데 사용되는 인증 토큰입니다. 이 Access Token으로 이제 Resource Server에 접근할 수 있습니다.
Refresh Token
: 발급받은 Access Token이 만료될 시 Refresh Token을 통해 새로운 Access Token을 받급받을 수 있습니다.
OAuth 인증은 인증 흐름을 이해하면 매우 쉽다. 아래의 표를 통해 Authorization Code Grant Type, Refresh Token Grant Type의 인증 흐름을 이해하자