Coding History/project

스포티파이 for Developers 튜토리얼 번역 ( 5 )

BlackBirdIT 2024. 8. 29. 09:32

토큰 새로 고침

리프레시 토큰은 클라이언트 애플리케이션이 사용자가 애플리케이션을 재승인할 필요 없이 새로운 액세스 토큰을 얻을 수 있도록 하는 보안 자격 증명입니다.

액세스 토큰은 의도적으로 제한된 수명을 가지도록 설정되며(1시간), 이 시간이 끝나면, 인증 토큰 요청 응답 중에 획득한 원래의 리프레시 토큰을 제공하여 새로운 토큰을 얻을 수 있습니다:

{
   "access_token": "NgCXRK...MzYjw",
   "token_type": "Bearer",
   "scope": "user-read-private user-read-email",
   "expires_in": 3600,
   "refresh_token": "NgAagA...Um_SHo"
}

요청

액세스 토큰을 새로 고치려면, 다음 매개변수를 포함한 POST 요청을 보내야 합니다:

본문 매개변수 필수 여부
grant_type 필수 refresh_token으로 설정
refresh_token 필수 인증 토큰 요청 시 반환된 리프레시 토큰
client_id PKCE 확장에서만 필수 개발자 대시보드에서 제공되는 애플리케이션의 클라이언트 ID

그리고 다음 헤더를 포함해야 합니다:

헤더 매개변수 필수 여부
Content-Type 필수 항상 application/x-www-form-urlencoded로 설정
Authorization 인증 코드 플로우에서만 필수 클라이언트 ID와 클라이언트 시크릿 키를 포함한 Base 64 인코딩된 문자열. 형식은 다음과 같아야 합니다: Authorization: Basic <base64 encoded client_id:client_secret>

예시

다음 코드 스니펫은 두 가지 예제를 나타냅니다:

  1. Authorization Code with PKCE 확장 플로우에 따라 발급된 토큰을 새로 고치는 클라이언트 측(브라우저) JavaScript 함수.
  2. Authorization Code 플로우에서 발급된 토큰을 새로 고치는 서버 측(nodeJS와 express 사용) JavaScript 메서드.

브라우저 측 JavaScript 코드 예시:

코드 예시: JavaScript

const getRefreshToken = async () => {

   // 이전에 저장된 리프레시 토큰
   const refreshToken = localStorage.getItem('refresh_token');
   const url = "https://accounts.spotify.com/api/token";

   const payload = {
      method: 'POST',
      headers: {
         'Content-Type': 'application/x-www-form-urlencoded'
      },
      body: new URLSearchParams({
         grant_type: 'refresh_token',
         refresh_token: refreshToken,
         client_id: clientId
      }),
   }
   const body = await fetch(url, payload);
   const response = await body.json();

   localStorage.setItem('access_token', response.access_token);
   if (response.refresh_token) {
      localStorage.setItem('refresh_token', response.refresh_token);
   }
}

응답

모든 것이 정상적으로 처리되면, 액세스 토큰 발급 시와 매우 유사한 200 OK 응답을 받게 됩니다:

코드 예시: JSON

{
  "access_token": "BQBLuPRYBQ...BP8stIv5xr-Iwaf4l8eg",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "AQAQfyEFmJJuCvAFh...cG_m-2KTgNDaDMQqjrOa3",
  "scope": "user-read-email user-read-private"
}

응답에 포함된 리프레시 토큰은 새 토큰을 요청하는 데 사용할 수 있습니다. 초기 리프레시 토큰을 얻는 데 사용된 인증 방식에 따라, 모든 응답에 리프레시 토큰이 포함되지 않을 수 있습니다. 리프레시 토큰이 반환되지 않는 경우, 기존 토큰을 계속 사용하십시오.

원문