OAuth 공식문서에 따르면
The OAuth 2.0 authorization framework enables a third-party
application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849.
라고 정의되어 있다.
이를 번역해보면
" OAuth2란 인증을 위한 개방형 표준 프로토콜의 한 종류로, 웹 서비스로의 접근을 얻기 위해 제 3의 어플리케이션이 사용자 대신 사용자와 웹 서비스 간의 상호작용을 조율하거나 제 3의 어플리케이션이 대신 웹서비스에 접근을 하는것을 의미한다. "
라고 해석을 할 수 있겠다.
평소 웹 서핑을 하다보면 위와 같이 구글, 트위터 등 외부 소셜 계정 기반으로 로그인, 회원가입을 할 수 있는 어플리케이션을 많이 보았을 것이다. 외부 어플리케이션을 통해 로그인 함으로써 비밀번호를 일일히 기억할 필요도 없고 구글이나 트위터 등이 제공하는 기능을 간편히 사용할 수 있다는 장점이 있다. 이 때 사용되는 프로토콜이 OAuth이다.
Resource Owner : 사용자
Client : Resource Server에서 제공하는 자원을 사용하는 애플리케이션(ex : 구글 지도 기능을 통해 근처 카페 정보를 알려주는 어플리케이션)
Resource Server : 자원을 호스팅 하는 서버(페이스북, 구글, 카카오톡 ...)
Authorization Server : 사용자의 동의를 받아서 권한을 부여하는 서버, 일반적으로 Resource Server와 같은 URL 하위에 있는 경우가 많다.
Authorization Grant : Client가 Access Token을 얻는 방법을 의미한다. 네 가지의 타입이 존재한다.
Authorization Code Grant Type
Client Credentials Grant Type
Implicit Grant Type
Resource Owner Credentials Grant Type
Authorization Code : Authorization Grant의 한 타입으로 엑서스 토큰을 발급 받기 위한 코드이다.
Access Token : 보호된 리소스에 엑서스 하는데 사용되는 인증 토큰이다. Access Token을 이용해 Resource Server에 접근할 수 있다.
Scope : 토큰의 권한을 정의한다.주어진 Access Token을 사용하여 접근 할 수 있는 Resouce의 범위이다.
권한 부여 승인을 위해 자체 생성한 Authorization Code를 전달하는 방식으로 가장 많이 쓰이고 기본이 되는 방식이다.
권한 부여 승인 요청시 응답 타입(response_type)을 code로 지정하여 요청한다.
출처 : 페이코 개발자 센터
사용자는 Client로 로그인을 시도한다.
Client는 Authorization Server한테 로그인 요청과 함께 Authorization Code를 요청한다(이때 미리 준비한 ClientId와 Redirect URL을 같이 보낸다)
Authorization Server는 사용자에게 로그인 요청을 보낸다.
사용자가 Authorization Server가 제공한 로그인 서비스에 로그인을 한다.
사용자가 로그인을 하면 Authorization Code를 사용자한테 전달한다.
이후 사용자는 로그인 이후 Redirect URL을 통해 서비스 페이지로 이동하게 된다.
Client는 전달받은 Authorization Code를 통해 Authorization Server에게 엑세스 토큰 발급을 요청합니다.
Authorization Server는 전달받은 데이터를 검증하고 Access Token을 클라이언트에게 발급한다. 이제 Access Token을 이용해서 Resource Server에 데이터를 요청하고 검증이 완료되면 Resource Server는 Client에게 Scope범위의 데이터를 응답한다.