OAuthV2 정책

이 페이지는 ApigeeApigee Hybrid에 적용됩니다.

Apigee Edge 문서 보기

정책 아이콘

대상

OAuthV2는 OAuth 2.0 부여 작업을 수행하기 위한 다각적인 정책입니다. Apigee에서 OAuth 2.0 엔드포인트를 구성하는 데 사용되는 기본 정책입니다.

이 정책은 확장 가능한 정책이며, 이 정책을 사용하면 Apigee 라이선스에 따라 비용 또는 사용률이 영향을 받을 수 있습니다. 정책 유형 및 사용 영향에 대한 자세한 내용은 정책 유형을 참조하세요.

Apigee의 OAuth에 대한 자세한 내용은 OAuth 홈페이지를 참조하세요. 리소스, 샘플, 동영상 등의 링크를 제공합니다.

샘플

VerifyAccessToken

VerifyAccessToken

이 OAuthV2 정책 구성은 VerifyAccessToken 작업을 통해 Apigee에 제출된 액세스 토큰이 유효한지 확인합니다. 이 정책 작업이 트리거되면 Apigee는 요청에서 유효한 액세스 토큰을 찾습니다. 액세스 토큰이 유효하면 요청은 진행하도록 허용됩니다. 유효하지 않은 경우 모든 처리가 중지되고 응답에서 오류가 반환됩니다.

<OAuthV2 name="OAuthV2-Verify-Access-Token">
    <Operation>VerifyAccessToken</Operation>
</OAuthV2>

클라이언트 애플리케이션은 토큰이 포함된 요청을 보내야 합니다. 예를 들어 curl을 사용하는 경우 다음과 같을 수 있습니다.

$ curl https://API_ENDPOINT/weather/forecastrss?w=12797282 \
  -H "Authorization: Bearer ylSkZIjbdWybfsUQe9BqP0LH5Z"

여기서 API_ENDPOINT는 Apigee 시스템에 구성된 API에 액세스하는 데 사용되는 도메인입니다.

기본적으로 OAuthV2 정책은 Authorization 헤더에서 액세스 토큰을 추출하고 Bearer 프리픽스를 제거합니다. 이 기본 동작은 AccessToken 구성 요소를 사용하여 변경할 수 있습니다.

GenerateAccessToken

액세스 토큰 생성

지원되는 각 부여 유형에 대해 액세스 토큰을 요청하는 방법을 보여주는 예시는 OAuth 2.0 토큰 가져오기를 참조하세요. 이 주제에는 다음 작업의 예시가 포함됩니다.

GenerateAuthorizationCode

승인 코드 생성

승인 코드를 요청하는 방법의 예시는 승인 코드 요청을 참조하세요.

RefreshAccessToken

액세스 토큰 새로고침

갱신 토큰을 사용하여 액세스 토큰을 요청하는 방법을 보여주는 예시는 액세스 토큰 새로고침을 참조하세요.

JWT 액세스 토큰

JWT 액세스 토큰

JWT 액세스 토큰 생성, 확인, 갱신 방법을 보여주는 예시는 JWT 액세스 토큰 사용을 참조하세요.

응답 흐름 토큰

응답 흐름에서 액세스 토큰 생성

응답 흐름에서 액세스 토큰을 생성해야 하는 경우도 있습니다. 예를 들어 백엔드 서비스에서 수행된 몇 가지 커스텀 검증에 대한 응답으로 이 작업을 수행할 수 있습니다. 이 예시의 사용 사례에서는 암시적 부여 유형을 배제하며 액세스 토큰과 갱신 토큰을 모두 필요로 합니다. 이 경우 비밀번호 부여 유형을 사용하여 토큰을 생성합니다. 나중에 볼 수 있듯이 이 작업을 수행하기 위한 비결은 JavaScript 정책과 함께 승인 요청 헤더를 전달하는 것입니다.

먼저 샘플 정책을 살펴보겠습니다.

<OAuthV2 enabled="true" continueOnError="false" async="false" name="generateAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <AppEndUser>Doe</AppEndUser>
    <UserName>jdoe</UserName>
    <PassWord>jdoe</PassWord>
    <GrantType>grant_type</GrantType>
    <ClientId>a_valid_client_id</ClientId>
    <SupportedGrantTypes>
        <GrantType>password</GrantType>
    </SupportedGrantTypes>
</OAuthV2>

응답 흐름에 이 정책을 입력하면 올바른 로그인 매개변수가 정책에 지정되어 있더라도 401 UnAuthorized 오류와 함께 실패합니다. 이 문제를 해결하려면 승인 요청 헤더를 설정해야 합니다.

승인 헤더에는 Base64로 인코딩된 client_id:client_secret이 있는 기본 액세스 스키마가 포함되어야 합니다.

다음과 같이 이 헤더를 OAuthV2 정책 바로 앞에 위치한 JavaScript 정책으로 추가할 수 있습니다. 'local_clientid' 및 'local_secret' 컨텍스트 변수는 이전 단계의 흐름에서 설정되어 사용할 수 있어야 합니다.

var clientId = context.getVariable("local_clientid");
var clientSecret = context.getVariable("local_secret");
context.setVariable("request.header.Authorization","Basic "+ CryptoJS.enc.Base64.stringify(CryptoJS.enc.Latin1
                                      .parse(clientId + ':' + clientSecret)));

기본 사용자 인증 정보 인코딩도 참조하세요.

요소 참조

정책 참조는 OAuthV2 정책의 요소 및 속성을 설명합니다.

아래의 샘플 정책은 여러 가지 가능한 구성 중 하나입니다. 이 샘플은 GenerateAccessToken 작업에 구성된 OAuthV2 정책을 보여줍니다. 필수 요소와 선택적 요소가 포함됩니다. 자세한 내용은 이 섹션의 요소 설명을 참조하세요.

<OAuthV2 name="GenerateAccessToken">
  <!-- This policy generates an OAuth 2.0 access token using the client_credentials grant type -->
  <Operation>GenerateAccessToken</Operation>
  <!-- This is in millseconds, so expire in an hour -->
  <ExpiresIn>3600000</ExpiresIn>
  <SupportedGrantTypes>
    <GrantType>client_credentials</GrantType>
  </SupportedGrantTypes>
  <GrantType>request.queryparam.grant_type</GrantType>
  <GenerateResponse/>
</OAuthV2>

<OAuthV2> 속성

<OAuthV2 async="false" continueOnError="false" enabled="true" name="MyOAuthPolicy">

The following table describes attributes that are common to all policy parent elements:

Attribute Description Default Presence
name

The internal name of the policy. The value of the name attribute can contain letters, numbers, spaces, hyphens, underscores, and periods. This value cannot exceed 255 characters.

Optionally, use the <DisplayName> element to label the policy in the management UI proxy editor with a different, natural-language name.

N/A Required
continueOnError

Set to false to return an error when a policy fails. This is expected behavior for most policies.

Set to true to have flow execution continue even after a policy fails. See also:

false Optional
enabled

Set to true to enforce the policy.

Set to false to turn off the policy. The policy will not be enforced even if it remains attached to a flow.

true Optional
async

This attribute is deprecated.

false Deprecated

<DisplayName> element

Use in addition to the name attribute to label the policy in the management UI proxy editor with a different, natural-language name.

<DisplayName>Policy Display Name</DisplayName>
Default

N/A

If you omit this element, the value of the policy's name attribute is used.

Presence Optional
Type String

<AccessToken> 요소

<AccessToken>request.header.access_token</AccessToken>

기본적으로 OperationVerifyAccessToken이면 정책은 액세스 토큰이 Authorization 헤더에 Bearer 토큰으로 전송될 것으로 예상합니다. 즉, 프리픽스 'Bearer'와 빈 공백 1개가 뒤에 옵니다. 이 요소를 사용하여 확인할 액세스 토큰이 포함된 변수의 이름을 지정하여 기본값을 변경할 수 있습니다. 이 요소를 사용하면 정책은 기본적으로 변수 콘텐츠에서 프리픽스를 찾지 않습니다. 정책이 프리픽스를 찾도록 지정하려면 AccessTokenPrefix 요소도 사용하세요.

예를 들면 다음과 같습니다.

  • 정책 구성 상태가 다음과 같을 때

      <OAuthV2 name="OAuthV2-Verify-Access-Token-in-Header">
          <Operation>VerifyAccessToken</Operation>
          <AccessToken>request.header.access_token</AccessToken>
      </OAuthV2>

    curl을 사용하여 토큰을 전달하려면 다음을 사용할 수 있습니다.

      curl https://API_ENDPOINT/oauth2/validate -H "access_token:Rft3dqrs56Blirls56a"
  • 정책 구성 상태가 다음과 같을 때

      <OAuthV2 name="OAuthV2-Verify-Access-Token-in-QueryParam">
          <Operation>VerifyAccessToken</Operation>
          <AccessToken>request.queryparam.token</AccessToken>
      </OAuthV2>

    curl을 사용하여 토큰을 전달하려면 다음을 사용할 수 있습니다.

      curl "https://API_ENDPOINT/oauth2/validate?token=Rft3dqrs56Blirls56a"

여기서 API_ENDPOINT는 Apigee 시스템에 구성된 API에 액세스하는 데 사용되는 도메인입니다.

기본값

해당 사항 없음

Presence

선택사항

유형 문자열
유효한 값

변수 이름

작업과 함께 사용:
  • VerifyAccessToken

<AccessTokenPrefix> 요소

<AccessTokenPrefix>Prefix</AccessTokenPrefix>

기본적으로 OperationVerifyAccessToken이면 정책은 액세스 토큰이 Authorization 헤더에 Bearer 토큰으로 전송될 것으로 예상합니다. 즉, 프리픽스 'Bearer'와 빈 공백 1개가 뒤에 옵니다. AccessToken 요소를 사용하여 수신 액세스 토큰에 다른 위치를 지정하는 경우 이 요소(AccessTokenPrefix)를 사용하여 다른 비표준 프리픽스를 지정할 수도 있습니다.

예를 들어 다음과 같이 지정하는 경우,

<OAuthV2 name="OAuthV2-Verify-Access-Token-Alternative-Header">
    <Operation>VerifyAccessToken</Operation>
    <AccessToken>request.header.token</AccessToken>
    <AccessTokenPrefix>KEY</AccessTokenPrefix>
</OAuthV2>

정책은 token 요청 헤더에서 인바운드 액세스 토큰을 다음과 같이 추출합니다. 이러한 방식으로 헤더가 단어 'KEY'로 시작하고 그 뒤에 공백이 있는 경우 정책은 해당 프리픽스와 공백을 삭제하고 나머지 값을 액세스 토큰으로 해석합니다. 지정된 프리픽스가 헤더에 없으면 정책에 오류가 발생합니다.

AccessToken 요소는 지정하고 AccessTokenPrefix 요소는 지정하지 않으면 정책은 AccessToken 요소 내에 지정된 변수의 전체 값을 액세스 토큰으로 해석합니다.

이 요소는 AccessToken 요소도 사용되는 경우에만 유효합니다.

기본값

-none-

Presence

선택사항

유형 문자열
유효한 값

모든 문자열

작업과 함께 사용:
  • VerifyAccessToken

<Algorithm>

<Algorithm>algorithm-here</Algorithm>

JWT 액세스 토큰에 서명하는 데 사용되는 암호화 알고리즘을 지정합니다. RSA(RS*) 알고리즘은 공개/보안 비밀 키 쌍을 사용하지만 HMAC(HS*) 알고리즘은 공유 보안 비밀을 사용합니다. 이 요소는 GenerateJWTAccessToken, VerifyJWTAccessToken, RefreshJWTAccessToken 작업에 필요합니다.

기본값 해당 사항 없음
Presence GenerateJWTAccessToken, VerifyJWTAccessToken, RefreshJWTAccessToken 작업을 사용할 때 필요합니다.
유형 문자열
유효한 값 HS256, HS384, HS512, RS256, RS384, RS512

<AppEndUser> 요소

<AppEndUser>request.queryparam.app_enduser</AppEndUser>

앱 최종 사용자 ID를 승인 서버로 전송해야 하는 경우 이 요소를 사용하면 Apigee에서 최종 사용자 ID를 찾을 위치를 지정할 수 있습니다. 예를 들어 쿼리 매개변수 또는 HTTP 헤더로 전송될 수 있습니다.

예를 들어 request.queryparam.app_enduser는 AppEndUser가 쿼리 매개변수(예: ?app_enduser=ntesla@theramin.com)로 존재해야 함을 나타냅니다. 예를 들어 HTTP 헤더의 AppEndUser를 요구하려면 이 값을 request.header.app_enduser으로 설정합니다.

이 설정을 제공하면 액세스 토큰에 앱 최종 사용자 ID를 포함할 수 있습니다. 이 기능은 최종 사용자 ID로 OAuth 2.0 액세스 토큰을 검색하거나 취소할 수 있는 경우에 유용합니다. 자세한 내용은 최종 사용자 ID, 앱 ID 또는 둘 다로 OAuth 2.0 액세스 토큰의 검색 및 취소 사용 설정을 참조하세요.

기본값

해당 사항 없음

Presence

선택사항

유형 문자열
유효한 값

런타임 시 정책에 액세스할 수 있는 모든 흐름 변수

부여 유형과 함께 사용
  • authorization_code
  • implicit
  • password
  • client_credentials

<Attributes/Attribute>

<Attributes>
    <Attribute name="attr_name1" ref="flow.variable" display="true|false">value1</Attribute>
    <Attribute name="attr_name2" ref="flow.variable" display="true|false">value2</Attribute>
</Attributes>

이 요소를 사용하여 액세스 토큰 또는 승인 코드에 맞춤 속성을 추가합니다. 예를 들어 런타임 시 추출하고 확인할 수 있는 사용자 ID 또는 세션 식별자를 액세스 토큰에 삽입할 수 있습니다.

이 요소를 사용하면 흐름 변수 또는 리터럴 문자열에서 값을 지정할 수 있습니다. 변수와 문자열을 모두 지정하면 흐름 변수에 지정된 값이 사용됩니다. 변수를 확인할 수 없는 경우 문자열이 기본값입니다.

이 요소 사용에 대한 자세한 내용은 토큰 및 승인 코드 맞춤설정을 참조하세요.

응답에 커스텀 속성 표시 또는 숨기기

이 정책의 GenerateResponse 요소를 true로 설정하면 설정한 모든 맞춤 속성을 포함하여 토큰의 전체 JSON 표현이 반환됩니다. 경우에 따라 맞춤 속성 중 일부 또는 전체를 숨겨 클라이언트 앱에 표시되지 않도록 할 수 있습니다.

기본적으로 커스텀 속성이 응답에 표시됩니다. 이를 숨기려면 display 매개변수를 false로 설정하면 됩니다. 예를 들면 다음과 같습니다.

<Attributes>
    <Attribute name="employee_id" ref="employee.id" display="false"/>
    <Attribute name="employee_name" ref="employee.name" display="false"/>
</Attributes>

display 속성의 값은 유지되지 않습니다. 생성된 응답에서 숨기려는 커스텀 속성이 포함된 액세스 토큰을 생성한다고 가정해 보겠습니다. display=false를 설정하면 이 목표를 달성할 수 있습니다. 하지만 나중에 갱신 토큰을 사용하여 새 액세스 토큰을 생성하면 액세스 토큰의 원래 커스텀 속성이 갱신 토큰 응답에 표시됩니다. 이는 Apigee가 액세스 토큰 생성 정책에서 원래 display 속성이 false로 설정되었음을 기억하지 않기 때문입니다. 커스텀 속성은 단순히 액세스 토큰 메타데이터의 일부입니다.

승인 코드에 맞춤 속성을 추가하면 동일한 동작이 표시됩니다. 해당 코드를 사용하여 액세스 토큰이 생성되면 해당 맞춤 속성이 액세스 토큰 응답에 표시됩니다. 다시 한번 말씀드리지만, 이는 의도한 동작이 아닐 수도 있습니다.

이러한 경우 맞춤 속성을 숨기는 방법은 다음과 같습니다.

  • 갱신 토큰 정책의 맞춤 속성을 명시적으로 재설정하고 display를 false로 설정합니다. 이 경우에는 GetOAuthV2Info 정책을 사용하여 원래 액세스 토큰에서 원래 맞춤 값을 검색해야 할 수 있습니다.
  • JavaScript 후처리 정책을 사용하여 응답에서 보고 싶지 않은 맞춤 속성을 수동으로 추출합니다.

토큰 및 승인 코드 맞춤설정도 참조하세요.

기본값

N/A

Presence

선택사항

유효한 값
  • name -속성 이름
  • ref - 속성의 값. 흐름 변수에서 가져올 수 있습니다.
  • display - (선택사항) 응답에 맞춤 속성이 표시되는지 여부를 지정할 수 있습니다. true인 경우 맞춤 속성이 응답에 표시됩니다(GenerateResponse도 사용 설정된 경우). false이면 맞춤 속성이 응답에 포함되지 않습니다. 기본값은 true입니다. 응답에서 맞춤 속성 표시 또는 숨기기를 참조하세요.
부여 유형과 함께 사용
  • authorization_code
  • implicit
  • password
  • client_credentials
  • refresh_token
  • GenerateAuthorizationCode 작업에도 사용할 수 있습니다.

<CacheExpiryInSeconds> 요소

<CacheExpiryInSeconds ref="propertyset.settings.token-ttl">60</CacheExpiryInSeconds>

이 요소는 VerifyAccessToken 작업에만 사용할 수 있습니다. 특정 정책 실행의 액세스 토큰 캐시에 대한 TTL(수명)을 지정합니다. Apigee가 OAuth 2 액세스 토큰을 처음으로 확인하는 경우 영구 저장소에서 액세스 토큰을 가져와야 합니다. 비교적 비용이 많이 드는 작업이므로 Apigee는 토큰 상태, 토큰이 유효한 제품 목록, 토큰에 연결된 모든 커스텀 속성을 비롯한 토큰 조회 결과를 캐시합니다. TTL이 만료될 때까지 OAuthV2/VerifyAccessToken을 연속으로 호출하면 메모리 내 캐시된 결과가 읽히므로 토큰 확인이 훨씬 빨라집니다.

액세스 토큰 캐시의 기본 TTL은 180초입니다. 이 요소를 사용하면 TTL을 줄일 수 있으므로 정확성과 성능을 우선시할 수 있습니다. 이 방법이 유용한 시나리오 중 하나는 토큰을 취소하는 경우가 있으며 Apigee에서 취소된 토큰을 유효한 것으로 계속 처리하는 시간 범위를 줄이려는 경우입니다.

지원되는 범위는 1~180초입니다. 흐름 변수와 기본값을 제공할 수 있습니다. 흐름 변수를 제공하고 숫자 값을 포함하는 경우 흐름 변수가 지정된 기본값보다 우선 적용됩니다.

기본값

해당 사항 없음

이 요소를 생략할 경우 캐시된 액세스 토큰의 기본 만료 기간은 180초입니다.

Presence

선택사항

유형

정수

유효한 값

0이 아닌 양의 정수. 만료 시간을 초 단위로 지정합니다.
작업과 함께 사용:
  • VerifyAccessToken

속성

다음 표에서는 <CacheExpiryInSeconds> 요소의 속성을 설명합니다.

속성 설명 기본값 Presence
ref

캐시 만료 값을 포함하는 흐름 변수에 대한 참조(초 단위).

제공되는 경우 흐름 변수 값이 지정된 기본값보다 우선합니다.

해당 사항 없음 선택사항

<ClientId> 요소

<ClientId>request.formparam.client_id</ClientId>

경우에 따라 클라이언트 앱은 클라이언트 ID를 승인 서버로 전송해야 합니다. 이 요소는 Apigee가 흐름 변수 request.formparam.client_id에서 클라이언트 ID를 찾아야 한다고 지정합니다. ClientId를 다른 변수로 설정하면 지원되지 않습니다. OAuth 2.0 토큰 가져오기도 참조하세요.

기본값

request.formparam.client_id (x-www-form-urlencoded 및 요청 본문에 지정됨)

Presence

선택사항

유형 문자열
유효한 값 흐름 변수: request.formparam.client_id
부여 유형과 함께 사용
  • authorization_code
  • password
  • implicit
  • client_credentials

GenerateAuthorizationCode 작업에도 사용할 수 있습니다.

<Code> 요소

<Code>request.queryparam.code</Code>

승인 부여 유형 흐름에서 클라이언트는 승인 코드를 승인 서버(Apigee 서버)에 제출해야 합니다. 이 요소를 사용하면 Apigee가 승인 코드를 찾을 위치를 지정할 수 있습니다. 예를 들어 쿼리 매개변수, HTTP 헤더 또는 양식 매개변수(기본값)로 전송될 수 있습니다.

변수 request.queryparam.auth_code는 승인 코드가 쿼리 매개변수(예: ?auth_code=AfGlvs9)로 존재해야 함을 나타냅니다. 예를 들어 HTTP 헤더의 승인 코드를 요구하려면 이 값을 request.header.auth_code으로 설정합니다. OAuth 2.0 토큰 가져오기도 참조하세요.

기본값

request.formparam.code (x-www-form-urlencoded 및 요청 본문에 지정됨)

Presence

선택사항

유형 문자열
유효한 값 런타임 시 정책에 액세스할 수 있는 모든 흐름 변수
부여 유형과 함께 사용 authorization_code

<ExpiresIn> 요소

<ExpiresIn>10000</ExpiresIn>

액세스 토큰 및 승인 코드의 만료 시간을 밀리초 단위로 적용합니다. (갱신 토큰의 경우 <RefreshTokenExpiresIn> 사용) 만료 시간 값은 시스템에서 생성된 값에 <ExpiresIn> 값을 더한 값입니다. <ExpiresIn>을 지정하지 않으면 시스템은 시스템 수준에서 구성된 기본값을 적용합니다.

만료 시간은 하드 코딩된 기본값을 사용하거나 흐름 변수를 참조하여 런타임 시 설정할 수도 있습니다. 예를 들어 키 값 맵에 토큰 만료 값을 저장하고 검색하여 변수에 할당하고 정책에서 참조할 수 있습니다. 예: kvm.oauth.expires_in.

Apigee는 항목이 액세스된 후 180초 이상 다음 항목을 캐시에 보관합니다.

  • OAuth 액세스 토큰. 즉, OAuth v2 정책의 ExpiresIn 요소는 180초 이내에 액세스 토큰을 만료시킬 수 없습니다.
  • 키 관리 서비스(KMS) 항목(앱, 개발자, API 제품)
  • OAuth 토큰 및 KMS 항목의 맞춤 속성입니다.

다음 스탠자는 흐름 변수와 기본값을 지정합니다. 흐름 변수 값은 지정된 기본값보다 우선 적용됩니다.

<ExpiresIn ref="kvm.oauth.expires_in">
    3600000 <!--default value in milliseconds-->
</ExpiresIn>

Apigee는 토큰이 생성된 후 강제로 만료시키는 방법을 지원하지 않습니다. 강제로 토큰을 만료시켜야 하는 경우(예: 조건에 따라) 이 Apigee 커뮤니티 게시물에서 가능한 해결책을 확인할 수 있습니다.

기본적으로 만료된 액세스 토큰은 만료 3일 후에 Apigee 시스템에서 자동으로 삭제됩니다. 액세스 토큰 삭제도 참조하세요.

기본값

지정되지 않은 경우 시스템은 시스템 수준에서 구성된 기본값을 적용합니다.

Presence

선택사항

유형 정수
유효한 값

0이 아닌 양의 정수입니다. 만료 시간을 밀리초로 지정합니다. 이 요소의 값은 밀리초 단위이지만 토큰의 expires_in 속성과 expires_in 흐름 변수에 설정된 값은 초 단위로 표현됩니다.

부여 유형과 함께 사용
  • authorization_code
  • implicit
  • password
  • client_credentials
  • refresh_token

GenerateAuthorizationCode 작업에도 사용됩니다.

<ExternalAccessToken> 요소

<ExternalAccessToken>request.queryparam.external_access_token</ExternalAccessToken>

외부 액세스 토큰(Apigee에서 생성되지 않은 액세스 토큰)을 찾을 위치를 Apigee에 알려줍니다.

변수 request.queryparam.external_access_token은 외부 액세스 토큰이 쿼리 매개변수(예: ?external_access_token=12345678)로 존재해야 함을 나타냅니다. 예를 들어 HTTP 헤더의 외부 액세스 토큰을 요구하려면 이 값을 request.header.external_access_token으로 설정합니다. 타사 OAuth 토큰 사용도 참조하세요.

<ExternalAuthorization> 요소

<ExternalAuthorization>true</ExternalAuthorization>

이 요소가 false이거나 존재하지 않는 경우 Apigee는 일반적으로 Apigee 승인 저장소에 대해 client_id 및 client_secret을 확인합니다. 타사 OAuth 토큰으로 작업하려는 경우 이 요소를 사용합니다. 이 요소 사용에 대한 자세한 내용은 타사 OAuth 토큰 사용을 참조하세요.

기본값

false

Presence

선택사항

유형 불리언
유효한 값 true 또는 false
부여 유형과 함께 사용
  • authorization_code
  • password
  • client_credentials

<ExternalAuthorizationCode> 요소

<ExternalAuthorizationCode>request.queryparam.external_auth_code</ExternalAuthorizationCode>

Apigee에 외부 승인 코드(Apigee에서 생성되지 않은 승인 코드)를 찾을 위치를 알려줍니다.

변수 request.queryparam.external_auth_code는 외부 인증 코드가 쿼리 매개변수(예: ?external_auth_code=12345678)로 존재해야 함을 나타냅니다. 예를 들어 HTTP 헤더의 외부 인증 코드를 요구하려면 이 값을 request.header.external_auth_code로 설정합니다. 타사 OAuth 토큰 사용도 참조하세요.

<ExternalRefreshToken> 요소

<ExternalRefreshToken>request.queryparam.external_refresh_token</ExternalRefreshToken>

Apigee에 외부 갱신 토큰(Apigee에서 생성되지 않은 갱신 토큰)을 찾을 위치를 알립니다.

request.queryparam.external_refresh_token 변수는 외부 갱신 토큰이 쿼리 매개변수(예: ?external_refresh_token=12345678)로 존재해야 함을 나타냅니다. 예를 들어 HTTP 헤더의 외부 갱신 토큰을 요구하려면 이 값을 request.header.external_refresh_token으로 설정합니다. 타사 OAuth 토큰 사용도 참조하세요.

<GenerateResponse> 요소

<GenerateResponse enabled='true'/>

true로 설정하거나 enabled 속성을 생략하면 정책이 응답을 생성하고 반환합니다. 예를 들어 GenerateAccessToken의 경우 응답은 다음과 같습니다.

{
  "issued_at" : "1467841035013",
  "scope" : "read",
  "application_name" : "e31b8d06-d538-4f6b-9fe3-8796c11dc930",
  "refresh_token_issued_at" : "1467841035013",
  "status" : "approved",
  "refresh_token_status" : "approved",
  "api_product_list" : "[Product1, nhl_product]",
  "expires_in" : "1799",
  "developer.email" : "edward@slalom.org",
  "token_type" : "BearerToken",
  "refresh_token" : "rVSmm3QaNa0xBVFbUISz1NZI15akvgLJ",
  "client_id" : "Adfsdvoc7KX5Gezz9le745UEql5dDmj",
  "access_token" : "AnoHsh2oZ6EFWF4h0KrA0gC5og3a",
  "organization_name" : "cerruti",
  "refresh_token_expires_in" : "0",
  "refresh_count" : "0"
}

false로 설정하거나 <GenerateResponse> 요소를 생략하면 응답이 전송되지 않습니다. 대신 흐름 변수 집합이 정책 함수와 관련된 값으로 채워집니다. 예를 들어 oauthv2authcode.OAuthV2-GenerateAuthorizationCode.code라는 흐름 변수는 새로 발급된 인증 코드로 채워집니다. expires_in은 응답에서 초 단위로 표현됩니다.

기본값

true

Presence

선택사항

유형 문자열
유효한 값 true 또는 false
부여 유형과 함께 사용
  • implicit
  • password
  • client_credentials
  • refresh_token
  • GenerateAuthorizationCode 작업에도 사용할 수 있습니다.

<GenerateErrorResponse> 요소

<GenerateErrorResponse enabled='true'/>

true로 설정하면 ContinueOnError 속성이 true로 설정된 경우 정책이 응답을 생성하고 반환합니다. false(기본값)이면 응답이 전송되지 않습니다. 대신 흐름 변수 집합이 정책 함수와 관련된 값으로 채워집니다.

기본값

false

Presence

선택사항

유형 문자열
유효한 값 true 또는 false
부여 유형과 함께 사용
  • implicit
  • password
  • client_credentials
  • refresh_token
  • GenerateAuthorizationCode 작업에도 사용할 수 있습니다.

<GrantType>

<GrantType>request.queryparam.grant_type</GrantType>

요청에 전달되는 권한 부여 매개변수를 찾을 위치를 정책에 알립니다. OAuth 2.0 사양에 따라 부여 유형에는 액세스 토큰 및 승인 코드에 대한 요청이 제공되어야 합니다. 변수는 헤더, 쿼리 매개변수, 양식 매개변수(기본값)일 수 있습니다.

예를 들어 request.queryparam.grant_type은 비밀번호가 쿼리 매개변수(예: ?grant_type=password)로 존재해야 함을 나타냅니다. 예를 들어 HTTP 헤더의 부여 유형을 요청하려면 이 값을 request.header.grant_type로 설정합니다. OAuth 2.0 토큰 가져오기도 참조하세요.

기본값

request.formparam.grant_type (x-www-form-urlencoded 및 요청 본문에 지정됨)

Presence

선택사항

유형 문자열
유효한 값 위에 설명된 대로 변수
부여 유형과 함께 사용
  • authorization_code
  • password
  • implicit
  • client_credentials
  • refresh_token

<Operation> 요소

<Operation>GenerateAuthorizationCode</Operation>

정책에 의해 실행되는 OAuth 2.0 작업입니다.

기본값

<Operation>을 지정하지 않으면 Apigee에서 <SupportedGrantTypes> 목록을 확인합니다. 이러한 부여 유형에 대한 작업만 성공합니다. 즉, <SupportedGrantTypes> 목록에서 <GrantType>을 지정하면 <Operation>을 생략할 수 있습니다. <Operation> 또는 <SupportedGrantTypes>도 지정되지 않은 경우 기본 부여 유형은 authorization_code입니다. 즉, 승인 코드 부여 유형 요청은 성공하지만 나머지는 실패합니다.

Presence

선택사항

유형 문자열
유효한 값
  • GenerateAccessToken - 액세스 토큰을 생성합니다. OAuth 2.0 토큰 가져오기도 참조하세요.
  • GenerateAccessTokenImplicitGrant - 암시적 부여 유형의 액세스 토큰을 생성합니다. OAuth 2.0 토큰 가져오기도 참조하세요.
  • GenerateAuthorizationCode - 인증 코드를 생성합니다. 승인 코드 부여 유형과 함께 사용됩니다. OAuth 2.0 토큰 가져오기도 참조하세요.
  • RefreshAccessToken - 갱신 토큰을 새 액세스 토큰으로 교환합니다. OAuth 2.0 토큰 가져오기도 참조하세요.
  • VerifyAccessToken - 요청에서 전송된 액세스 토큰이 유효한지 확인합니다. 위의 VerifyAccessToken 샘플 및 액세스 토큰 확인을 참조하세요.
  • InvalidateToken - 액세스 토큰을 취소합니다. 토큰이 취소된 후에는 클라이언트가 해당 토큰을 사용하여 보호되는 API를 호출할 수 없습니다. 액세스 토큰 승인 및 취소도 참조하세요.
  • ValidateToken - 이전에 취소된 액세스 토큰을 복원하거나 '승인'합니다. 액세스 토큰 승인 및 취소도 참조하세요.

추가 JWT 액세스 토큰 작업

비공개 문자열 토큰 대신 JWT 액세스 토큰을 사용하려는 경우 다음 작업을 사용하여 JWT 토큰을 생성하고 검증할 수도 있습니다. 자세한 내용은 JWT OAuth 토큰 작업 사용을 참조하세요.

  • GenerateJWTAccessToken - 서명된 JWT가 포함된 액세스 토큰을 생성합니다. JWT 액세스 토큰 생성을 참조하세요.
  • GenerateJWTAccessTokenImplicitGrant - 암시적 부여 유형에 대해 서명된 JWT가 포함된 액세스 토큰을 생성합니다. JWT 액세스 토큰 생성을 참조하세요.
  • VerifyJWTAccessToken - 서명된 JWT 액세스 토큰을 확인합니다. JWT 액세스 토큰 확인도 참조하세요.
  • RefreshJWTAccessToken - 갱신 토큰을 새 JWT 액세스 토큰으로 교환합니다. JWT 액세스 토큰 갱신도 참조하세요.

<PassWord> 요소

<PassWord>request.queryparam.password</PassWord>

이 요소는 비밀번호 부여 유형에서만 사용됩니다. 비밀번호 부여 유형을 사용하면 사용자 인증 정보(비밀번호 및 사용자 이름)를 OAuthV2 정책에서 사용할 수 있어야 합니다. <PassWord><UserName> 요소는 Apigee가 이러한 값을 찾을 수 있는 변수를 지정하는 데 사용됩니다. 이러한 요소가 지정되지 않으면 정책은 기본적으로 usernamepassword라는 형식 매개변수에서 값을 찾으려고 합니다. 값을 찾을 수 없으면 정책에서 오류가 발생합니다. <PassWord><UserName> 요소를 사용하여 사용자 인증 정보가 포함된 모든 흐름 변수를 참조할 수 있습니다.

예를 들어 쿼리 매개변수를 사용하여 토큰 요청에 비밀번호를 전달하고 다음과 같은 요소를 설정할 수 있습니다. <PassWord>request.queryparam.password</PassWord>. HTTP 헤더에서 비밀번호를 요구하려면 이 값을 request.header.password로 설정합니다.

OAuthV2 정책은 이러한 사용자 인증 정보 값으로 어떠한 조치도 취하지 않습니다. Apigee는 단순히 해당 값이 존재하는지 확인만 합니다. 토큰 생성 정책을 실행하기 전에 값 요청을 검색하여 ID 공급업체로 전송하는 것은 API 개발자의 책임입니다.

OAuth 2.0 토큰 가져오기도 참조하세요.

기본값

request.formparam.password (x-www-form-urlencoded 및 요청 본문에 지정됨)

Presence

선택사항

유형 문자열
유효한 값 런타임에 정책에 사용할 수 있는 흐름 변수입니다.
부여 유형과 함께 사용 password

<PrivateKey>/<Value>

<PrivateKey>
  <Value ref="variable-name-here"/>
</PrivateKey>

RSA 알고리즘으로 JWT 형식의 액세스 토큰을 확인하거나 서명하는 데 사용되는 비공개 키를 제공합니다. ref 속성을 사용하여 흐름 변수의 키를 전달합니다. Algorithm 요소 값이 RS256, RS384, RS512 중 하나인 경우에만 사용합니다. 자세한 내용은 JWT OAuth 토큰 작업 사용을 참조하세요.

기본값 해당 사항 없음
Presence Algorithm 요소 값이 HS256, HS384 또는 HS512 중 하나인 경우 필요합니다.
유형 문자열
유효한 값 PEM 인코딩 RSA 비공개 키 값을 나타내는 문자열을 포함하는 흐름 변수입니다.

<PublicKey>/<Value>

<PublicKey>
   <Value ref="variable-name-here"/>
</PublicKey>

RSA 알고리즘으로 서명된 JWT 형식 액세스 토큰에서 서명을 확인하는 데 사용되는 공개 키 또는 공개 인증서를 지정합니다. ref 속성을 사용하여 흐름 변수의 키/인증서를 전달합니다. Algorithm 요소 값이 RS256, RS384, RS512 중 하나인 경우에만 사용합니다.

기본값 해당 사항 없음
Presence RSA 알고리즘으로 서명된 JWT를 확인하려면 인증서, JWKS 또는 값 요소를 사용해야 합니다.
유형 문자열
유효한 값 흐름 변수 또는 문자열입니다.

<RedirectUri> 요소

<RedirectUri>request.queryparam.redirect_uri</RedirectUri>

Apigee가 요청에서 redirect_uri 매개변수를 찾아야 하는 위치를 지정합니다.

리디렉션 URI 정보

리디렉션 URI는 승인 코드 및 암시적 부여 유형과 함께 사용됩니다. 리디렉션 URI는 승인 코드(승인 코드 부여 유형의 경우) 또는 액세스 토큰(암시적 부여 유형의 경우)을 보내는 위치를 승인 서버(Apigee)에 알립니다. 이 매개변수가 필요한 경우 언제 선택적인지 및 사용 방법을 이해하는 것이 중요합니다.

  • (필수사항) 콜백 URL이 요청의 클라이언트 키와 연결된 개발자 앱에 등록되어 있으며 redirect_uri가 요청에 있는 경우 URL과 URI는 정확히 일치해야 합니다. 일치하지 않으면 오류가 반환됩니다. Apigee에 개발자 앱을 등록하고 콜백 URL을 지정하는 방법은 앱 등록 및 API 키 관리를 참조하세요.

  • (선택사항) 콜백 URL이 등록되었고 요청에서 redirect_uri가 누락된 경우 Apigee는 등록된 콜백 URL로 리디렉션됩니다.
  • (필수사항) 콜백 URL이 등록되지 않은 경우 redirect_uri는 필수입니다. 이 경우 Apigee는 모든 URL을 허용합니다. 이 경우 보안 문제가 발생할 수 있으므로 신뢰할 수 있는 클라이언트 앱에서만 사용해야 합니다. 클라이언트 앱을 신뢰할 수 없는 경우 항상 콜백 URL 등록을 요구하는 것이 좋습니다.

이 매개변수는 쿼리 매개변수 또는 헤더로 전송할 수 있습니다. 변수 request.queryparam.redirect_uri는 RedirectUri가 쿼리 매개변수(예: ?redirect_uri=login.myapp.com)로 존재해야 함을 나타냅니다. 예를 들어 HTTP 헤더의 RedirectUri를 요구하려면 이 값을 request.header.redirect_uri로 설정합니다. OAuth 2.0 토큰 가져오기도 참조하세요.

기본값

request.formparam.redirect_uri (x-www-form-urlencoded 및 요청 본문에 지정됨)

Presence

선택사항

유형 문자열
유효한 값 런타임 시 정책에 액세스할 수 있는 모든 흐름 변수
부여 유형과 함께 사용
  • authorization_code
  • implicit

GenerateAuthorizationCode 작업에도 사용됩니다.

<RefreshToken> 요소

<RefreshToken>request.queryparam.refreshtoken</RefreshToken>

갱신 토큰을 사용하여 액세스 토큰을 요청할 때는 요청에 갱신 토큰을 제공해야 합니다. 이 요소를 사용하면 Apigee가 갱신 토큰을 찾을 위치를 지정할 수 있습니다. 예를 들어 쿼리 매개변수, HTTP 헤더 또는 양식 매개변수(기본값)로 전송될 수 있습니다.

request.queryparam.refreshtoken 변수는 갱신 토큰이 쿼리 매개변수(예: ?refresh_token=login.myapp.com)로 존재해야 함을 나타냅니다. 예를 들어 HTTP 헤더의 RefreshToken을 요구하려면 이 값을 request.header.refresh_token로 설정합니다. OAuth 2.0 토큰 가져오기도 참조하세요.

기본값

request.formparam.refresh_token (x-www-form-urlencoded 및 요청 본문에 지정됨)

Presence

선택사항

유형 문자열
유효한 값 런타임 시 정책에 액세스할 수 있는 모든 흐름 변수
부여 유형과 함께 사용
  • refresh_token

<RefreshTokenExpiresIn> 요소

<RefreshTokenExpiresIn>1000</RefreshTokenExpiresIn>

갱신 토큰 만료 시간을 밀리초 단위로 적용합니다. 만료 시간 값은 시스템에서 생성된 값에 <RefreshTokenExpiresIn> 값을 더한 값입니다. <RefreshTokenExpiresIn>을 지정하지 않으면 시스템은 기본값을 적용합니다.

만료 시간은 하드 코딩된 기본값을 사용하거나 흐름 변수를 참조하여 런타임 시 설정할 수도 있습니다. 예를 들어 키 값 맵에 토큰 만료 값을 저장하고 검색하여 변수에 할당하고 정책에서 참조할 수 있습니다. 예: kvm.oauth.expires_in.

다음 스탠자는 흐름 변수와 기본값을 지정합니다. 흐름 변수 값은 지정된 기본값보다 우선 적용됩니다.

<RefreshTokenExpiresIn ref="kvm.oauth.expires_in">
    86400000 <!--value in milliseconds-->
</RefreshTokenExpiresIn>

기본값

2592000000ms(30일)(2023년 5월 31일부터 적용)

Presence

선택사항

유형 정수
유효한 값

0이 아닌 양의 정수입니다. 만료 시간을 밀리초 단위로 지정합니다.

부여 유형과 함께 사용
  • authorization_code
  • password
  • refresh_token

<ResponseType> 요소

<ResponseType>request.queryparam.response_type</ResponseType>

이 요소는 클라이언트 앱이 요청하는 부여 유형을 Apigee에 알리며, 승인 코드 및 암시적 부여 유형 흐름에만 사용됩니다.

기본적으로 Apigee는 response_type 쿼리 매개변수에서 응답 유형 값을 찾습니다. 이 기본 동작을 재정의하려면 <ResponseType> 요소를 사용하여 응답 유형 값이 포함된 흐름 변수를 구성합니다. 예를 들어 이 요소를 request.header.response_type으로 설정하면 Apigee가 요청 헤더에서 전달할 응답 유형을 찾습니다. OAuth 2.0 토큰 가져오기도 참조하세요.

기본값

request.formparam.response_type(x-www-form-url로 인코딩되어 요청 본문에 지정됨)

Presence

(선택사항) 기본 동작을 재정의하려면 이 요소를 사용합니다.

유형 문자열
유효한 값 code(승인 코드 부여 유형의 경우) 또는 token(암시적 부여 유형의 경우)
부여 유형과 함께 사용
  • implicit
  • GenerateAuthorizationCode 작업에도 사용됩니다.

<ReuseRefreshToken> 요소

<ReuseRefreshToken>true</ReuseRefreshToken>

true로 설정하면 기존의 갱신 토큰은 만료될 때까지 재사용됩니다. false인 경우 유효한 갱신 토큰이 제공되면 Apigee에서 새 갱신 토큰을 발급합니다.

기본값

false

Presence

선택사항

유형 boolean
유효한 값

true 또는 false

부여 유형과 함께 사용
  • refresh_token

<RFCCompliantRequestResponse> 요소

<RFCCompliantRequestResponse>[true | false]</RFCCompliantRequestResponse>

true일 경우 정책이 RFC6749 표준을 준수하며 다음과 같은 규정 준수 동작을 사용 설정합니다.

  • 오류 및 오류가 아닌 응답에는 RFC2616(Hypertext Transfer Protocol -- HTTP/1.1) 준수를 위해 토큰, 사용자 인증 정보 또는 기타 민감한 정보를 포함하는 응답에서 값이 no-store인 HTTP Cache-Control 응답 헤더 필드와 값이 no-cachePragma 응답 헤더 필드가 포함됩니다.
  • expires_in 속성은 영숫자 형식입니다. 일관성을 위해 refresh_token_expires_in도 영숫자입니다.
  • 토큰 생성을 위한 OAuthV2 응답에는 BearerToken 대신 RFC를 준수하는 Bearer 헤더 필드가 포함됩니다.
  • 응답 페이로드의 오류 메시지는 갱신 토큰 오류의 경우 {"error" : "xxx", "error_description" :"yyy"} 형식입니다.

기본값

false: 기본적으로 이 정책은 RFC를 준수하지 않는 특정 동작을 허용합니다. 자세한 내용은 RFC를 준수하지 않는 동작을 참조하세요. RFC 규정 준수를 사용 설정하려면 이 요소를 true로 설정합니다.

Presence

선택사항

유형 불리언
유효한 값 true 또는 false
부여 유형과 함께 사용 전체

<SecretKey>/<Value>

<SecretKey>
  <Value ref="your-variable-name"/>
</SecretKey>

HMAC 알고리즘으로 JWT 형식의 액세스 토큰을 확인하거나 서명하는 데 사용되는 보안 비밀 키를 제공합니다. 알고리즘이 HS256, HS384, HS512 중 하나인 경우에만 사용합니다. ref 속성을 사용하여 흐름 변수의 키를 전달합니다. 자세한 내용은 JWT OAuth 토큰 작업 사용을 참조하세요.

Apigee는 HS256/HS384/HS512 알고리즘에 최소한의 키 안전성을 적용합니다. 최소 키 길이는 HS256의 경우 32바이트, HS384의 경우 48바이트, HS512의 경우 64바이트입니다. 낮은 안정성의 키를 사용하면 런타임 오류가 발생합니다.

기본값 해당 사항 없음
Presence HMAC 알고리즘에 필요합니다.
유형 문자열
유효한 값 흐름 변수

<Scope> 요소

<Scope>request.queryparam.scope</Scope>

이 요소가 GenerateAccessToken 또는 GenerateAuthorizationCode 정책 중 하나에 있는 경우 이 요소는 토큰 또는 코드를 부여할 범위를 지정하는 데 사용됩니다. 이러한 값은 일반적으로 클라이언트 앱의 요청에 있는 정책에 전달되며, 흐름 변수를 가져오도록 요소를 구성하여 요청에서 범위가 전달되는 방식을 선택할 수 있습니다. 다음 예시에서 request.queryparam.scope는 범위가 쿼리 매개변수(예: ?scope=READ)로 존재해야 함을 나타냅니다. 예를 들어 HTTP 헤더의 범위을 요구하려면 이 값을 request.header.scope로 설정합니다.

이 요소가 'VerifyAccessToken' 정책에 표시되면 정책이 적용할 범위를 지정하는 데 사용됩니다. 이 유형의 정책에서는 값은 '하드 코딩된' 범위 이름이어야 합니다. 변수는 사용할 수 없습니다. 예를 들면 다음과 같습니다.

<Scope>A B</Scope>

OAuth2 범위 작업OAuth 2.0 토큰 가져오기도 참조하세요.

기본값

범위 없음

Presence

선택사항

유형 문자열
유효한 값

Generate* 정책과 함께 사용되는 경우 흐름 변수입니다.

VerifyAccessToken과 함께 사용되는 경우 공백으로 구분된 범위 이름(문자열) 목록입니다.

부여 유형과 함께 사용
  • authorization_code
  • implicit
  • password
  • client_credentials
  • GenerateAuthorizationCode 및 VerifyAccessToken 작업에도 사용할 수 있습니다.

<State> 요소

<State>request.queryparam.state</State>

클라이언트 앱이 승인 서버로 상태 정보를 전송해야 하는 경우 이 요소를 사용하면 Apigee가 상태 값을 찾아야 할 위치를 지정할 수 있습니다. 예를 들어 쿼리 매개변수 또는 HTTP 헤더로 전송될 수 있습니다. 상태 값은 일반적으로 CSRF 공격을 방지하기 위한 보안 절차로 사용됩니다.

예를 들어 request.queryparam.state는 상태가 쿼리 매개변수(예: ?state=HjoiuKJH32)로 존재해야 함을 나타냅니다. 예를 들어 HTTP 헤더의 상태를 요구하려면 이 값을 request.header.state로 설정합니다. OAuth 2.0 토큰 가져오기도 참조하세요.

기본값

상태 없음

Presence

선택사항

유형 문자열
유효한 값 런타임 시 정책에 액세스할 수 있는 모든 흐름 변수
부여 유형과 함께 사용
  • 전체
  • GenerateAuthorizationCode 작업에도 사용할 수 있습니다.

<StoreToken> 요소

 <StoreToken>true</StoreToken>

<ExternalAuthorization> 요소가 true인 경우 이 요소를 true로 설정합니다. <StoreToken> 요소는 Apigee에 외부 액세스 토큰을 저장하도록 지시합니다. 그렇지 않으면 유지되지 않습니다.

기본값

false

Presence

선택사항

유형 불리언
유효한 값 true 또는 false
부여 유형과 함께 사용
  • authorization_code
  • password
  • client_credentials

<SupportedGrantTypes>/<GrantType> 요소

<SupportedGrantTypes>
    <GrantType>authorization_code</GrantType>
    <GrantType>client_credentials</GrantType>
    <GrantType>implicit</GrantType>
    <GrantType>password</GrantType>
</SupportedGrantTypes>

Apigee에서 OAuth 토큰 엔드포인트가 지원하는 부여 유형을 지정합니다. 엔드포인트는 여러 부여 유형을 지원할 수 있습니다. 즉, 단일 엔드포인트를 구성하여 여러 부여 유형에 대한 액세스 토큰을 배포할 수 있습니다. 엔드포인트에 대한 자세한 내용은 OAuth 엔드포인트 이해를 참조하세요. 부여 유형은 grant_type 매개변수로 토큰 요청에 전달됩니다.

지원되는 부여 유형을 지정하지 않으면 허용되는 유일한 부여 유형은 authorization_codeimplicit입니다. <GrantType> 요소도 참조하세요. 이 요소는 Apigee가 클라이언트 요청에서 전달된 grant_type 매개변수를 찾아야 하는 위치를 지정하는 데 사용되는 상위 수준 요소입니다. Apigee는 grant_type 매개변수의 값이 지원되는 부여 유형 중 하나와 일치하는지 확인합니다.

기본값

authorization _code 및 암시적

Presence

필수

유형 문자열
유효한 값
  • client_credentials
  • authorization_code
  • password
  • implicit

<Tokens>/<Token> 요소

ValidateToken 및 InvalidateToken 작업에 사용됩니다. 액세스 토큰 승인 및 취소도 참조하세요. <Token> 요소는 취소할 토큰의 소스를 정의하는 흐름 변수를 식별합니다. 예를 들어 개발자가 액세스 토큰을 access_token이라는 쿼리 매개변수로 제출해야 하는 경우 request.queryparam.access_token을 사용합니다.

<UserName> 요소

<UserName>request.queryparam.user_name</UserName>

이 요소는 비밀번호 부여 유형에서만 사용됩니다. 비밀번호 부여 유형을 사용하면 사용자 인증 정보(비밀번호 및 사용자 이름)를 OAuthV2 정책에서 사용할 수 있어야 합니다. <PassWord><UserName> 요소는 Apigee가 이러한 값을 찾을 수 있는 변수를 지정하는 데 사용됩니다. 이러한 요소가 지정되지 않으면 정책은 기본적으로 usernamepassword라는 형식 매개변수에서 값을 찾으려고 합니다. 값을 찾을 수 없으면 정책에서 오류가 발생합니다. <PassWord><UserName> 요소를 사용하여 사용자 인증 정보가 포함된 모든 흐름 변수를 참조할 수 있습니다.

예를 들어 쿼리 매개변수에 사용자 이름을 전달하고 다음과 같이 <UserName> 요소를 설정할 수 있습니다. <UserName>request.queryparam.username</UserName>.HTTP 헤더에 사용자 이름을 요구하려면 이 값을 request.header.username으로 설정합니다.

OAuthV2 정책은 이러한 사용자 인증 정보 값으로 어떠한 조치도 취하지 않습니다. Apigee는 단순히 해당 값이 존재하는지 확인만 합니다. 토큰 생성 정책을 실행하기 전에 값 요청을 검색하여 ID 공급업체로 전송하는 것은 API 개발자의 책임입니다.

OAuth 2.0 토큰 가져오기도 참조하세요.

기본값

request.formparam.username (x-www-form-urlencoded 및 요청 본문에 지정됨)

Presence

선택사항

유형 문자열
유효한 값 모든 변수 설정.
부여 유형과 함께 사용 password

액세스 토큰 확인

API 프록시에 대해 토큰 엔드포인트가 설정되면 VerifyAccessToken 작업을 지정하는 해당 OAuthV2 정책은 보호된 리소스를 노출하는 흐름에 연결됩니다.

예를 들어 API에 대한 모든 요청이 승인되도록 다음 정책이 액세스 토큰 확인을 적용합니다.

<OAuthV2 name="VerifyOAuthAccessToken">
  <Operation>VerifyAccessToken</Operation>
</OAuthV2>

보호할 API 리소스에 정책이 연결됩니다. API에 대한 모든 요청이 인증되었는지 확인하려면 다음과 같이 정책을 ProxyEndpoint 요청 PreFlow에 연결합니다.

<PreFlow>
  <Request>
    <Step><Name>VerifyOAuthAccessToken</Name></Step>
  </Request>
</PreFlow>

다음 선택적 요소를 사용하여 VerifyAccessToken 작업의 기본 설정을 재정의할 수 있습니다.

이름 설명
범위

공백으로 구분된 범위 목록입니다. 나열된 범위 중 하나 이상이 액세스 토큰 안에 있으면 인증이 성공합니다. 예를 들어 다음 정책은 액세스 토큰을 검사하여 토큰에 나열된 범위가 하나 이상 포함되어 있는지 확인합니다. READ 또는 WRITE가 있으면 인증이 성공합니다.

<OAuthV2 name="ValidateOauthScopePolicy">
  <Operation>VerifyAccessToken</Operation>
  <Scope>READ WRITE</Scope>
</OAuthV2>
AccessToken 액세스 토큰이 위치할 것으로 예상되는 변수입니다. 예를 들어 request.queryparam.accesstoken입니다. 기본적으로 액세스 토큰은 OAuth 2.0 사양에 따라 앱에서 Authorization HTTP 헤더로 제공되어야 합니다. 액세스 토큰이 비표준 위치(쿼리 매개변수 또는 이름이 Authorization이 아닌 HTTP 헤더의 경우)에 제공될 것으로 예상되면 이 설정을 사용합니다.

액세스 토큰 확인OAuth 2.0 토큰 가져오기도 참조하세요.

요청 변수 위치 지정

이 정책은 각 권한 유형에 대해 요청 메시지의 위치 또는 필수 정보에 대한 가정을 합니다. 이러한 가정은 OAuth 2.0 사양을 기반으로 합니다. 앱이 OAuth 2.0 사양에서 벗어나야 하는 경우 각 매개변수의 예상 위치를 지정할 수 있습니다. 예를 들어 승인 코드를 처리할 때 승인 코드, 클라이언트 ID, 리디렉션 URI, 범위의 위치를 지정할 수 있습니다. HTTP 헤더, 쿼리 매개변수 또는 양식 매개변수로 지정할 수 있습니다.

아래 예시에서는 필요한 승인 코드 매개변수의 위치를 HTTP 헤더로 지정하는 방법을 보여줍니다.

  ...
  <GrantType>request.header.grant_type</GrantType>
  <Code>request.header.code</Code>
  <ClientId>request.header.client_id</ClientId>
  <RedirectUri>request.header.redirect_uri</RedirectUri>
  <Scope>request.header.scope</Scope>
  ...

또는 클라이언트 앱 기반을 지원하는 데 필요한 경우 헤더와 쿼리 매개변수를 조합하여 사용할 수 있습니다.

  ...
  <GrantType>request.header.grant_type</GrantType>
  <Code>request.header.code</Code>
  <ClientId>request.queryparam.client_id</ClientId>
  <RedirectUri>request.queryparam.redirect_uri</RedirectUri>
  <Scope>request.queryparam.scope</Scope>
  ...

매개변수당 하나의 위치만 구성할 수 있습니다.

흐름 변수

이 표에 정의된 흐름 변수는 각 OAuth 정책이 실행될 때 채워지며 API 프록시 흐름에서 실행되는 다른 정책 또는 애플리케이션에서 사용할 수 있습니다.

VerifyAccessToken 작업

VerifyAccessToken 작업이 실행되면 프록시의 실행 컨텍스트에서 대량의 흐름 변수가 채워집니다. 이러한 변수는 액세스 토큰, 개발자 앱, 개발자와 관련된 속성을 제공합니다. 예를 들어 AssignMessage 또는 JavaScript 정책을 사용하여 이러한 변수를 읽고 나중에 흐름에서 필요에 따라 사용할 수 있습니다. 이러한 변수는 디버깅하는 데도 유용할 수 있습니다.

토큰별 변수

변수 설명
organization_name 프록시가 실행 중인 조직의 이름입니다.
developer.id 등록된 클라이언트 앱과 연결된 개발자 또는 AppGroup의 ID입니다.
developer.app.name 등록된 클라이언트 앱과 연결된 개발자 또는 AppGroup 앱의 이름입니다.
client_id 등록된 클라이언트 앱의 클라이언트 ID입니다.
grant_type 요청과 연결된 권한 유형입니다. VerifyJWTAccessToken 작업에는 지원되지 않습니다.
token_type 요청과 연결된 토큰 유형입니다.
access_token 확인되는 액세스 토큰입니다.
accesstoken.{custom_attribute} 액세스 토큰에서 이름이 지정된 맞춤 속성입니다.
issued_at Unix 기준시간(밀리초)으로 표현되는 액세스 토큰 발급 날짜입니다.
expires_in 액세스 토큰의 만료 시간이며, 로 표현됩니다. ExpiresIn 요소는 만료 시간을 밀리초로 설정하지만 토큰 응답 및 흐름 변수에서는 이 값이 초 단위로 표현됩니다.
status 액세스 토큰의 상태(예: 승인됨 또는 취소됨)입니다.
scope 액세스 토큰과 연결된 범위입니다(있는 경우).
apiproduct.<custom_attribute_name> 등록된 클라이언트 앱과 연결된 API 제품에 대해 이름이 지정된 맞춤 속성입니다.
apiproduct.name 등록된 클라이언트 앱과 연결된 API 제품의 이름입니다.
revoke_reason

(Apigee Hybrid만 해당) 액세스 토큰이 취소된 이유를 나타냅니다. VerifyJWTAccessToken 작업에는 지원되지 않습니다.

값은 REVOKED_BY_APP, REVOKED_BY_ENDUSER, REVOKED_BY_APP_ENDUSER, TOKEN_REVOKED일 수 있습니다.

앱별 변수

이러한 변수는 토큰과 관련된 개발자 앱과 연관됩니다.

변수 설명
app.name
app.id
app.accessType
app.callbackUrl
app.status 승인됨 또는 취소됨
app.scopes
app.appFamily
app.apiproducts
app.appParentStatus
app.appType 예: 개발자
app.appParentId
app.created_by
app.created_at
app.last_modified_at
app.last_modified_by
app.{custom_attributes} 등록된 클라이언트 앱에 대해 이름이 지정된 커스텀 속성입니다.

AppGroup 관련 변수

토큰의 AppGroup에 대한 정보가 포함된 다음 흐름 변수는 정책으로 채워집니다. 이러한 AppGroup 속성은 verifyapikey.{policy_name}.app.appType이 'AppGroup'인 경우에만 채워집니다.

변수 설명
appgroup.displayName AppGroup 표시 이름입니다.
appgroup.name AppGroup의 이름입니다.
appgroup.id AppGroup ID입니다.
appOwnerStatus 앱 소유자의 상태: '활성', '비활성' 또는 'login_lock'
created_at AppGroup이 생성된 날짜/시간 스탬프입니다.
created_by AppGroup을 만든 개발자의 이메일 주소입니다.
last_modified_at AppGroup이 마지막으로 수정된 날짜/시간 스탬프입니다.
last_modified_by AppGroup을 마지막으로 수정한 개발자의 이메일 주소입니다.
{appgroup_custom_attributes} 모든 커스텀 AppGroup 속성입니다. 커스텀 속성의 이름을 지정합니다.

개발자별 변수

app.appType이 'Developer'이면 개발자 속성이 채워집니다.

변수 설명
개발자별 변수
developer.id
developer.userName
developer.firstName
developer.lastName
developer.email
developer.status 활성 또는 비활성
developer.apps
developer.created_by
developer.created_at
developer.last_modified_at
developer.last_modified_by
developer.{custom_attributes} 개발자에 대해 이름이 지정된 맞춤 속성입니다.

GenerateAuthorizationCode 작업

이러한 변수는 GenerateAuthorizationCode 작업이 성공적으로 실행될 때 설정됩니다.

프리픽스: oauthv2authcode.{policy_name}.{variable_name}

예: oauthv2authcode.GenerateCodePolicy.code

변수 설명
code 정책이 실행될 때 생성되는 승인 코드입니다.
redirect_uri 등록된 클라이언트 앱과 연결된 리디렉션 URI입니다.
scope 클라이언트 요청에 전달되는 선택적 OAuth 범위입니다.
client_id 클라이언트 요청에 전달되는 클라이언트 ID입니다.

GenerateAccessToken 및 RefreshAccessToken 작업

이러한 변수는 GenerateAccessToken 및 RefreshAccessToken 작업이 성공적으로 실행될 때 설정됩니다. 클라이언트 사용자 인증 정보 부여 유형 흐름에는 갱신 토큰 변수가 적용되지 않습니다.

프리픽스: oauthv2accesstoken.{policy_name}.{variable_name}

예: oauthv2accesstoken.GenerateTokenPolicy.access_token

변수 이름 설명
access_token 생성된 액세스 토큰입니다.
client_id 이 토큰과 연결된 개발자 앱의 클라이언트 ID입니다.
expires_in 토큰의 만료 값입니다. 자세한 내용은 <ExpiresIn> 요소를 참조하세요. 응답에서 expires_in로 표현됩니다.
scope 토큰에 대해 구성된 사용 가능한 범위의 목록입니다. OAuth2 범위 작업을 참조하세요.
status approved 또는 revoked.
token_type BearerToken으로 설정됩니다.
developer.email 토큰과 연결된 개발자 앱을 소유한 등록된 개발자의 이메일 주소입니다.
organization_name 프록시가 실행되는 조직입니다.
api_product_list 토큰에 해당하는 개발자 앱과 연결된 제품의 목록입니다.
refresh_count
refresh_token 생성된 갱신 토큰입니다. 클라이언트 사용자 인증 정보 부여 유형에는 갱신 토큰이 생성되지 않습니다.
refresh_token_expires_in 새로고침 토큰의 수명(초)입니다.
refresh_token_issued_at 이 시간 값은 해당 32비트 타임스탬프 수량의 문자열 표현입니다. 예를 들어 'Wed, 21 Aug 2013 19:16:47 UTC'는 타임스탬프 값 1377112607413에 해당합니다.
refresh_token_status approved 또는 revoked.

GenerateAccessTokenImplicitGrant

이러한 변수는 암시적 부여 유형 흐름에서 GenerateAccessTokenImplicit 작업이 성공적으로 실행될 때 설정됩니다.

프리픽스: oauthv2accesstoken.{policy_name}.{variable_name}

예: oauthv2accesstoken.RefreshTokenPolicy.access_token

변수 설명
oauthv2accesstoken.access_token 정책이 실행될 때 생성되는 액세스 토큰입니다.
oauthv2accesstoken.{policy_name}.expires_in 토큰의 만료 값(초)입니다. 자세한 내용은 <ExpiresIn> 요소를 참조하세요.

오류 참조

This section describes the fault codes and error messages that are returned and fault variables that are set by Apigee when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Cause Thrown by operations
steps.oauth.v2.access_token_expired 401 The access token is expired.

VerifyAccessToken
InvalidateToken

steps.oauth.v2.access_token_not_approved 401 The access token was revoked. VerifyAccessToken
steps.oauth.v2.apiproduct_doesnot_exist 401 The requested API product does not exist in any of the API products associated with the access token. VerifyAccessToken
steps.oauth.v2.FailedToResolveAccessToken 500 The policy expected to find an access token in a variable specified in the <AccessToken> element, but the variable could not be resolved. GenerateAccessToken
steps.oauth.v2.FailedToResolveAuthorizationCode 500 The policy expected to find an authorization code in a variable specified in the <Code> element, but the variable could not be resolved. GenerateAuthorizationCode
steps.oauth.v2.FailedToResolveClientId 500 The policy expected to find the Client ID in a variable specified in the <ClientId> element, but the variable could not be resolved. GenerateAccessToken
GenerateAuthorizationCode
GenerateAccessTokenImplicitGrant
RefreshAccessToken
steps.oauth.v2.FailedToResolveRefreshToken 500 The policy expected to find a refresh token in a variable specified in the <RefreshToken> element, but the variable could not be resolved. RefreshAccessToken
steps.oauth.v2.FailedToResolveToken 500 The policy expected to find a token in a variable specified in the <Tokens> element, but the variable could not be resolved.

ValidateToken
InvalidateToken

steps.oauth.v2.InsufficientScope 403 The access token presented in the request has a scope that does not match the scope specified in the verify access token policy. To learn about scope, see Working with OAuth2 scopes. VerifyAccessToken
steps.oauth.v2.invalid_client 401

This error name is returned when the <GenerateResponse> property of the policy is set to true and the client ID sent in the request is invalid. Check to be sure you are using the correct client key and secret values for the Developer App associated with your proxy. Typically, these values are sent as a Base64 encoded Basic Authorization header.

GenerateAccessToken
RefreshAccessToken
steps.oauth.v2.InvalidRequest 400 This error name is used for multiple different kinds of errors, typically for missing or incorrect parameters sent in the request. If <GenerateResponse> is set to false, use fault variables (described below) to retrieve details about the error, such as the fault name and cause. GenerateAccessToken
GenerateAuthorizationCode
GenerateAccessTokenImplicitGrant
RefreshAccessToken
steps.oauth.v2.InvalidAccessToken 401 The authorization header does not have the word Bearer, which is required. For example: Authorization: Bearer your_access_token VerifyAccessToken
steps.oauth.v2.InvalidAPICallAsNoApiProductMatchFound 401

The currently executing API proxy or operation is not in the Product associated with the access token.

Tips: Be sure that the product associated with the access token is configured correctly. For example, if you use wildcards in resource paths, be sure the wildcards are being used correctly. See Managing API products for details.

See also Oauth2.0 Access Token Verification throws "Invalid API call as no apiproduct match found" error for more guidance on causes for this error.

VerifyAccessToken
steps.oauth.v2.InvalidClientIdentifier 500

This error name is returned when the <GenerateResponse> property of the policy is set to false and the client ID sent in the request is invalid. Check to be sure you are using the correct client key and secret values for the Developer App associated with your proxy. Typically, these values are sent as a Base64 encoded Basic Authorization header.

GenerateAccessToken
RefreshAccessToken

steps.oauth.v2.InvalidParameter 500 The policy must specify either an access token or an authorization code, but not both. GenerateAuthorizationCode
GenerateAccessTokenImplicitGrant
steps.oauth.v2.InvalidTokenType 500 The <Tokens>/<Token> element requires you to specify the token type (for example, refreshtoken). If the client passes the wrong type, this error is thrown. ValidateToken
InvalidateToken
steps.oauth.v2.MissingParameter 500 The response type is token, but no grant types are specified. GenerateAuthorizationCode
GenerateAccessTokenImplicitGrant
steps.oauth.v2.UnSupportedGrantType 500

The client specified a grant type that is unsupported by the policy (not listed in the <SupportedGrantTypes> element).

GenerateAccessToken
GenerateAuthorizationCode
GenerateAccessTokenImplicitGrant
RefreshAccessToken

JWT token-specific runtime errors

Runtime error codes and descriptions for JWT auth token flows depend on the OAuth2 flow context:

Error codes for JWT token generation and refresh flows

For OAuth2 flows that generate or refresh JWT tokens, error responses adhere to the error responses specified in RFC6749. For details, see Section 5.2 Error Response.

Error codes for the token verification flow

The error codes listed in the following table apply to VerifyAccessToken operation only.

Fault code HTTP status Cause Thrown by operations
oauth.v2.JWTSigningFailed 401 The policy was unable to sign the JWT.

GenerateJWTAccessToken

oauth.v2.InvalidValueForJWTAlgorithm 401 This occurs when the algorithm is not present in the JWT access token or when the value is not supported.

GenerateJWTAccessToken
VerifyJWTAccessToken

oauth.v2.InsufficientKeyLength 401 In Generation of JWT, for a key less than the minimum size for the HS384 or HS512 algorithms

GenerateJWTAccessToken
VerifyJWTAccessToken

oauth.v2.JWTAlgorithmMismatch 401 The algorithm specified in the Generate policy did not match the one expected in the Verify policy. The algorithms specified must match.

VerifyJWTAccessToken

oauth.v2.JWTDecodingFailed 401 The policy was unable to decode the JWT. The JWT is possibly corrupted.

VerifyJWTAccessToken

oauth.v2.MissingMandatoryClaimsInJWT 401 Occurs when the required claims are not present in the Jwt Access token

VerifyJWTAccessToken

oauth.v2.InvalidJWTSignature 401 This occurs when the signature of JWT access token could not be verified or when the signature is invalid.

VerifyJWTAccessToken

oauth.v2.InvalidTypeInJWTHeader 401 Occurs when the JWT's type is not at+Jwt

VerifyJWTAccessToken

Deployment errors

These errors can occur when you deploy a proxy containing this policy.

Error name Cause
InvalidValueForExpiresIn

For the <ExpiresIn> element, valid values are positive integers.

InvalidValueForRefreshTokenExpiresIn For the <RefreshTokenExpiresIn> element, valid values are positive integers.
InvalidGrantType An invalid grant type is specified in the <SupportedGrantTypes> element. See the policy reference for a list of valid types.
ExpiresInNotApplicableForOperation Be sure that the operations specified in the <Operations> element support expiration. For example, the VerifyToken operation does not.
RefreshTokenExpiresInNotApplicableForOperation Be sure that the operations specified in the <Operations> element support refresh token expiration. For example, the VerifyToken operation does not.
GrantTypesNotApplicableForOperation Be sure that the grant types specified in <SupportedGrantTypes> are supported for the specified operation.
OperationRequired

You must specify an operation in this policy using the <Operation> element.

InvalidOperation

You must specify a valid operation in this policy using the <Operation> element.

TokenValueRequired You must specify a token <Token> value in the <Tokens> element.

JWT token-specific deployment errors

These deployment errors are specific to policies that use JWT token operations.

Error name Cause
InvalidValueForAlgorithm The algorithm specified in the <Algorithm> element is not among the list of available algorithms or is not present.
MissingKeyConfiguration The required <SecretKey>, <PrivateKey>, or <PublicKey> elements are missing, depending on which algorithm is used.
EmptyValueElementForKeyConfiguration The required child element <Value> is not defined in the <PrivateKey>, <PublicKey>, or <SecretKey> elements
InvalidKeyConfiguration The <PrivateKey> element is not used with RSA family algorithms or the <SecretKey> element is not used with HS Family algorithms.
EmptyRefAttributeForKeyconfiguration The ref attribute of the child element <Value> of the <PrivateKey>, <PublicKey> or <SecretKey> elements is empty.
InvalidVariableNameForKey The flow variable name specified in the ref attribute of the child element <Value> of the <PrivateKey>, <PublicKey> or <SecretKey> elements does not contain the private prefix.

Fault variables

These variables are set when this policy triggers an error at runtime.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name = "InvalidRequest"
oauthV2.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. oauthV2.GenerateAccesstoken.failed = true
oauthV2.policy_name.fault.name policy_name is the user-specified name of the policy that threw the fault. oauthV2.GenerateAccesstoken.fault.name = InvalidRequest
oauthV2.policy_name.fault.cause policy_name is the user-specified name of the policy that threw the fault. oauthV2.GenerateAccesstoken.cause = Required param : grant_type

Example error response

These responses are sent back to the client if the <GenerateResponse> element is true.

If <GenerateResponse> is true, the policy returns errors in this format for operations that generate tokens and codes. For a complete list, see see OAuth HTTP error response reference.

{"ErrorCode" : "invalid_client", "Error" :"ClientId is Invalid"}

If <GenerateResponse> is true, the policy returns errors in this format for verify and validate operations. For a complete list, see see OAuth HTTP error response reference.

{  
   {  
      "fault":{  
         "faultstring":"Invalid Access Token",
         "detail":{  
            "errorcode":"keymanagement.service.invalid_access_token"
         }
      }
   }

Example fault rule

<FaultRule name="OAuthV2 Faults">
    <Step>
        <Name>AM-InvalidClientResponse</Name>
        <Condition>(fault.name = "invalid_client") OR (fault.name = "InvalidClientIdentifier")</Condition>
    </Step>
    <Step>
        <Name>AM-InvalidTokenResponse</Name>
        <Condition>(fault.name = "invalid_access_token")</Condition>
    </Step>
    <Condition>(oauthV2.failed = true) </Condition>
</FaultRule>

스토리지의 토큰이 해싱됨

Apigee Hybrid 또는 Apigee를 사용하는 경우 OAuthV2 액세스 토큰 및 갱신 토큰은 런타임 Cassandra 데이터베이스에 저장될 때 기본적으로 해싱됩니다. 해싱은 데이터베이스가 손상된 경우 토큰이 사용되지 못하도록 합니다.

기본 OAuth 구성 작업

Apigee의 각 조직(무료 체험판 조직 포함)은 OAuth 토큰 엔드포인트로 프로비저닝됩니다. 엔드포인트는 oauth라는 API 프록시의 정책으로 사전 구성됩니다. 토큰 엔드포인트는 Apigee에서 계정을 만드는 즉시 사용할 수 있습니다. 자세한 내용은 OAuth 엔드포인트 이해를 참조하세요.

액세스 토큰 삭제

기본적으로 OAuth2 토큰은 액세스 토큰과 갱신 토큰(존재하는 경우)이 모두 만료되고 3일(259,200초) 후에 Apigee 시스템에서 삭제됩니다.

RFC를 준수하지 않는 동작

기본적으로 GenerateAccessToken 작업과 함께 OAuthV2 정책은 RFC를 준수하지 않는 특정 속성이 포함된 토큰 응답을 반환합니다. 다음 표는 OAuthV2 정책에서 반환하는 비준수 속성과 해당 준수 속성을 보여줍니다.

OAuthV2는 다음을 반환합니다. RFC를 준수하는 속성은 다음과 같습니다.
"token_type":"BearerToken" "token_type":"Bearer"
"expires_in":"3600" "expires_in":3600

(규정 준수 값은 문자열이 아닌 숫자입니다.)

또한 grant_type = refresh_token인 경우 만료된 갱신 토큰에 대한 오류 응답은 다음과 같습니다.

{"ErrorCode" : "InvalidRequest", "Error" :"Refresh Token expired"}

하지만 RFC를 준수하는 응답은 다음과 같습니다.

{"error" : "invalid_grant", "error_description" :"refresh token expired"}

관련 주제