OAuth


Open Authorization

OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해
웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는,
접근 위임을 위한 개방형 표준이다. - 위키백과

OAuth 등장배경

특정 서비스가 유저의 구글 캘린더에 일정을 등록하려고 한다고 생각해보자. 해당 서비스가 유저의 구글 캘린더에 접근하기 위해서는 1차원적으로 유저의 구글 ID와 PW를 받아 직접 구글에 접속하는 방법이 있을 것이다.

그러나 이 방법은 유저의 입장에서도 신뢰할 수 없는 특정 서비스에 ID와 PW를 노출하는 것이 되어 꺼려지고, 해당 서비스의 입장에서도 유저의 ID와 비밀번호를 갖게 되는 것은 보안 측면에서 부담스러운 일이 된다. 또한, 해당 서비스가 구글 캘린더에 일정을 등록하는 것 뿐 아니라 사용자의 Gmail에도 접근할 수 있는 등 다른 부분에도 접근할 수 있게 된다.

이러한 상황에서 등장한 것이 OAuth이다. OAuth를 사용하면 구글은 accessToken을 발급하게 되고, 이는 구글의 ID, PW가 아니며, 모든 기능이 아닌 해당 서비스가 필요한 기능에만 접근 할 수 있도록 부분적으로 허용할 수 있다. 서비스는 이 accessToken을 이용하여 구글과 커뮤니케이션하면서 필요한 작업들을 수행할 수 있다.

OAuth에서는 방금 예시의 USER는 Resource Owner, Service는 Client, Google에 해당하는 여러 서버는 Resource Server라고 한다. Resource Server는 인증과 관련된 처리를 담당하는 Authorization Server를 따로 구분해서 볼 수도 있다.

OAuth 등록

Client는 Resource Server를 이용하기 위해 사전에 승인을 받아야한다. 이 과정이 등록이다. 구글, 카카오, 네이버 등 모두 Client 측에서 등록을 할 수 있도록 하는 웹사이트를 가지고 있다.

등록은 Resource Server마다 조금씩 다르지만 기본적으로는 다음과 같은 양식을 가진다.

  • Client ID : Client 고유의 ID
  • Client Secret : 외부에 노출돼선 안되는 Client의 secret 코드
  • Authorized redirect URIs : 클라이언트가 Resource Server에 요청할때 해당 주소에서 요청을 보내야 한다. 해당 주소가 아닌 곳에서 요청할 경우 요청이 무시된다.
  • Resource Owner의 승인

    Client는 Google로 로그인, 카카오로 로그인 과 같은 버튼을 만들어 Resource Owner가 클릭할 수 있도록 한다. 해당 버튼을 누르면 Client ID, redirect uri 그리고 scope와 같은 것들이 포함된 특정 주소로 연결된다. 이때 scope에는 Client가 Resource Server로 부터 받아 사용할 기능들이 어떤 것인지 담겨있다. 해당 주소에서 Resource Owner는 Resource Server에 로그인을 하게되고 scope에 담겨있는 기능들을 Client가 수행하기를 승인한다. 승인 정보는 Resource Server로 전송된다.

    Resource Server의 승인

    Resource Server는 Resource Owner의 승인 정보를 받은 후 Resource Owner에게 임시 비밀번호의 역할을 하는 authorization code 를 보내게 되는데, 이는 다시 Client에게 전송되어 Client가 authorization code를 가지게 된다.

    액세스 토큰 발급

    Client는 Resource Server에게 직접 접속하여 authorization code를 비롯한 Client ID, Client Secret, grant type, redirect URI 등을 보내게 된다. 이를 받은 Resource Server는 access_token을 발급한다. 해당 access_token은 Resource Owner가 누군지, 그리고 어떠한 scope에 대해 허용했는지 등을 담고있다.

    이후에는 액세스 토큰을 이용, Resource Server에 메뉴얼을 참조하여 구글 캘린더 목록을 가져오는 등의 API 호출을 할 수 있다. 일반적으로 요청 헤더에 Authorization 부분에 Bearer ${access_token}을 담아 보낸다.

    리프레시 토큰

    access_token은 시간이 지나면 만료된다. 해당 토큰이 만료되었을 때는 refresh_token 을 이용하여 access_token을 재발급할 수 있다. 자세한 내용은 아래 사진을 참고하면 된다.

    RFC 6749 - OAuth 2.0
    RFC 6749 - OAuth 2.0

    여기서는 Resource Server와 Authorization Server를 따로 구분하여 설명하고 있다.