이미지 출처: naver developer
위같은 로그인 서비스들은 별도로 application에 회원가입하지 않아도 로그인을 할 수 있게 한다. 해당하는 플랫폼에 계정만 있다면 application의 서비스를 이용할 수 있다. 이렇게 외부 서비스에서도 인증을 가능하게 하고 그 서비스의 API들을 이용하게 해주는 것이 **OAuth**(Open Authorization)이다.현재 OAuth 2.0의 정확한 개념은 다양한 플랫폼 환경에서 권한 부여를 위한 산업 표준 프로토콜이다.
기존 비밀번호 인증 방식에서는 여러 문제가 있었는데, 다음과 같다.
예를 들어, 내가 사용하려는 app A가 있고, 여기서 facebook에 글을 올린다고 가정해보자.
최초 OAuth(1.0a)에서는 구현이 복잡했고, access token이 만료되지 않았으며 HMAC을 통해 암호화하였다. 반면 OAuth 2.0에서는 기능을 단순화하였고, 암호화를 https에 맡기며 다양한 인증 방식을 지원한다.
OAuth에서 사용하는 주요 용어를 몇 가지 살펴 보자.
인증 방식 종류에는 다음 네 가지가 있는데, 주로 authorization code grant가 많이 사용된다고 한다.
Client가 resource server를 이용하기 위해서는, resource server에 승인을 받아야 하는데 이 과정을 register라고 한다. 네 가지 인증 방식에서 공통적으로 아래 세 가지를 이용한다.
이미지 출처: https://cheese10yun.github.io/oauth2/
먼저 Client가 파라미터로 Client ID, Redirect URL, Response_type을 code로 지정하여 Authorization Server에 전달한다. 여기서 Response_type을 token으로 줄 수도 있는데, 이렇게 하면 Implicit Grant 방식이 된다고 한다.정상적으로 인증이 되면, 권한 부여 코드를 Client에게 보낸다.
성공적으로 권한 부여 코드를 받은 Client는 이 코드를 이용하여 Access Token을 Authorization Server에 추가로 요청한다. 이 때 Client ID, Client Secret, Redirect URL, Grant type(인증 타입)을 보낸다.
마지막으로 Access token을 응답 받으면 Access token을 사용하여 Resource Server에 API를 호출할 수 있다.
이미지 출처: Kakao developers
Request URL을 보면, GET방식으로 요청하며 oauth로 시작하는 것을 알 수 있다.위에서 register에는 client id와 client secret, redirect uri를 요구한다고 언급했는데,
실제로 request parameter에 필수 요소에 client id와 redirect uri가 들어가있는 것을 확인할 수 있다.
여기서 client secret이 없는 것은, client secret 개념이 client_id로 이용되며 client id 개념은 내 애플리케이션 정보에 들어가면 확인할 수는 있지만 굳이 사용하지 않는 것 같다.
그리고 Authorization Code Grant 방식에서는 response_type을 code로 고정하여 이용한다고 했는데, 카카오에서도 code로 고정하여 이용하는 것을 보면 authorization code grant 방식을 이용하는 것 같다.
이렇게 하면 인가 코드, 즉 아까 살펴본 개념에서의 용어로 권한 부여 코드를 받을 수 있다.
python으로 간단히 구현한 코드를 돌려보면 응답으로 access token과 refresh token, access token과 refresh token의 유효기간, scope이 나오는 것을 알 수 있다.
scope라고 하는 것은 application에서 권한을 제어할 때 이용하는 기능이다. 여기서는 message 기능을 이용했기 때문에 이렇게 scope가 나온다.