[OAuth2.0] 액세스 토큰 얻기

반응형

이번 글에서는 서버 사이드 플로우를 이용해 액세스 토큰을 획득해보도록 하겠습니다.

0. OAuth2.0 클라이언트

OAuth2.0 클라이언트를 만드는 과정은 다음의 4단계로 나눌 수 있습니다.

  1. 클라이언트 애플리케이션 등록하기
  2. 액세스 토큰 얻기
  3. 액세스 토큰을 이용해서 보호된 리소스에 접근하기
  4. 엑세스 토큰 갱신하기

image.png

여기에서 액세스 토큰을 갱신하는 것은 신뢰 클라이언트(서버 사이드 워크플로우)일 경우에만 가능합니다. 액세스 토큰을 갱신하려면 리프레시 토큰(Refresh Token)을 안전하게 저장할 수 있어야 합니다.

이번 글에서는 2단계인 '엑세스 토큰 얻기'를 살펴보겠습니다. 그 중 신뢰클라이언트의 서버 사이드 워크플로우를 다뤄보겠습니다.

image.png

1. 엑세스 토큰

앞서 애플리케이션을 등록했으면 엑세스 토큰을 요청할 준비가 되었습니다. 먼저, 엑세스 토큰의 주요 개념을 살펴보겠습니다.

엑세스 토큰은 하나의 보호된 리소스나 다수의 보호된 리소스에 대해 일정 기간 동안 접근할 수 잇는 권한을 캡슐화 한 것입니다. 이러한 엑세스 토큰은 일반적으로 의미를 알 수 없는 임의의 문자열 형태로 클라이언트에게 발급됩니다.

이와 같은 엑세스 토큰의 속성을 각각 '범위(Scope)''접근 기간(Duration of Access)'이라고 합니다.

범위(Scope) : 토큰 보유자가 접근할 수 있는 보호된 리소스 셋을 의미합니다. 토큰이 접근할 수 있는 범위는 특정 사용자의 계정으로 어떤 데이터든 읽거나 변경시킬 수 있는 것과 같이 광범위하거나, 특정 사용자의 이름만을 가져올 수 있도록 그 범위가 세밀하게 지정 될 수 있습니다. 만약 발급된 토큰의 범위를 벗어난 새로운 리소스에 접근하고자 한다면, 새로운 범위에 대한 새로운 엑세스 토큰을 발급받아야 합니다.

접근 기간(Duration of Access) : 서비스 제공자가 발급하는 대부분의 토큰은 해당 토큰이 가지고 있는 접근 권한이 더 이상 유효하지 않게 되는 만료 시간을 가집니다. 하지만 만료시간을 가지지 않는 토큰도 있습니다. 이러한 토큰은 영구 토큰(Perpetual Token) 이라고하며, 영구 토큰을 발급하는 경우는 매우 드뭅니다.

토큰 폐기(Token rovocation) : 경우에 따라서는 토큰의 접근 기간이 만료되기 전에 토큰의 접근 권한을 종료시켜야 합니다. 이를 토큰폐기라고 합니다.

리프레시 토큰(Refresh Token) : 만약 인가 코드 그랜트 플로우를 사용하고 서비스 제공자가 리프레시 토큰 플로우를 지원한다면, 엑세스 토큰을 발급받을 때 리프레시 토큰도 응답으로 전달받게 됩니다. 이러한 리프레시 토큰은 현재의 엑세스 토큰의 접근 기간이 만료돼 새로운 엑세스 토큰을 요청해서 세션을 갱신하고자 할 때 사용됩니다. 이러한 리프레시 토큰은 신뢰 클라이언트에서만 사용할 수 있습니다.

2. 인가 코드(Authorization Code) 얻기

자 이제 엑세스 토큰을 획득하기 위해 먼저 인가코드를 얻어보겠습니다. 전체 흐름은 아래 그림과 같습니다.

✔ 아래 흐름에서 엑세스 토큰을 획득하기 위해 태그(인가 코드)를 교환하는 것은 인가 코드 그랜트 플로우가 암시적 그랜트 플로우와 다른 점입니다. 서버에서 위와 같은 작업을 수행하려면 클라이언트 자격증명토큰을 안전하게 관리하고 전송해야 합니다.

image.png

먼저 인가 엔드포인트로 태그(인가 코드)를 요청해보도록 하겠습니다. 일반적인 인가요청 URL은 아래와 같습니다.

GET /authorize?
    response_type=[RESPONSE_TYPE]&
    client_id=[CLINET_ID]&
    redirect_uri=[REDIRECT_URI]&
    scope=[SCORE]&
    state=[STATE] HTTP/1.1

제가 입력할 파라미터 값은 아래와 같습니다.

• 페이스북 인가 엔드포인트 : www.facebook.com/v5.0/dialog/oauth?
• response_type = code
• client_id = 551209078794587 (본인 애플리케이션의 클라이언트 ID)
• redirect_uri = https://daily-mission.com
• scope = public_profile

이를 이용해서 인가 요청 URL을 구성하면 다음과 같습니다. 여기서 redirect_rui와 scope는 URL-encode 포맷으로 변경해야합니다. state는 생략하겠습니다.

🔑 주의 사항으로는 최근 대부분의 서비스 제공자는 리다이렉션 URI로 HTTPS만 허용하고 있습니다. Facebook도 마찬가지로 HTTPS가 아닌 리다이렉션 URI는 허용하지 않습니다.

www.facebook.com/v5.0/dialog/oauth?
    response_type=code&
    client_id=551209078794587&
    redirect_uri=https%3A%2F%2Fdaily-mission.com&
    scope=public_profile

실제 URL를 호출할 떄는 한줄로 아래와 같이 변경합니다.

www.facebook.com/v5.0/dialog/oauth?response_type=code&client_id=551209078794587&redirect_uri=https%3A%2F%2Fdaily-mission.com&scope=public_profile

브라우저를 열고 위의 URL을 입력하면 아래와 같이 Facebook 인가 엔드포인트로 이동하게 됩니다.

image.png

위에서 계속 버튼을 클릭하면, 사용자 동의가 이루어지게 되며 리다이렉트 엔드포인트로 이동하게 됩니다. 이동한 리다이렉트 엔드포인트에는 인가코드가 함께 전달됩니다. 리다이렉트된 URL을 자세히보면 code= 뒷부분으로 인가코드가 함께 전달되었습니다. 개발자는 이부분을 파싱해서 엑세스 토큰을 발급받는데 사용하면 됩니다.

이러한 과정은 실제로는 서버 사이드에서 서비스 제공자가 제공하는 SDK를 활용해 이루어져야합니다. URL을 사용해 정보를 주고 받을 경우 정보 탈취의 위험이 있습니다. SDK를 사용한 방법은 향후 다시한번 다뤄보겠습니다.

image.png

3. 엑세스 토큰 얻기

이제 위에서 획득한 인가 코드를 사용해 엑세스 토큰을 발급받아 보겠습니다.

제가 획득한 인가코드는 아래와 같습니다.

AQA8EgaNIWAGZjyb4eJP0kQEZSnkaXElkUPcHz7gosO54nynKI7VGi3L0ji1EcfFy_MvTKw-n1uithNcHIuEak9lD43wJ9-m87Vf5JH1y6BmO2NIKgrPZdcFhD_DQs6V0DjWW_1fSP3jcOnh6Zxwwg19mnM1VmJxi_FSWFHhuhdAwvbDWOpwOspFFBOmr6dbsinkQJOncfENq3z5-F2xEP4eVoQzkb1leA43BgCFAvNG64t90sQMQtIxOM__2QdeFEzUmnHsUuXcZ0apCL-VikxF0RbZvjdnDEkJAL60OcWnUf8NIhAbbIUzFGOB3ZvsgqCz0XAyolWlaD0v0zPGMoGZ#_=_

인가 코드를 액세스 토큰과 교환하려면, 서비스 제공자의 토큰 엔드포인트로 필요한 파라미터와 함께 POST 요청을 보내야합니다.

Facebook의 토큰 엔포인트는 https://graph.facebook.com/v5.0/oauth/access_token 입니다.

일반적으로 엑세스 토큰 요청은 다음과 같은 형식으로 이뤄집니다.

> POST /v5.0/oauth/access_token HTTP/1.1
> Host: graph.facebook.com
> Authorization: Basic [ENCODED_CLIENT_CREDENTIALS]
> Content-Type: application/x-www-form-urlencoded

grant_type = authorization_code&
      code = [AUTHORIZATION_CODE]&
  redirect_uri = [REDIRECT_URI]&
  client_id = [CLIENT_ID]

여기서 [ENCODED_CLIDENT_CREDENTIALS]는 [CLIENT_ID] : [CLIENT_SECRET] 를 base64로 인코딩한 값입니다.

위와 같은 내용을 바탕으로 POST 요청을 하기 위해선 실제 서버에서 해당 POST 요청을 수행 할 수 있도록 작업이 필요합니다.


참고자료

 

OAuth 2.0 마스터:OAuth 2.0 애플리케이션 개발을 위한 모든 것

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

댓글

Designed by JB FACTORY