JWT 런타임 오류 디코딩 문제 해결

Apigee Edge 문서입니다.
Apigee X 문서로 이동
정보

FailedToDecode

오류 코드

steps.jwt.FailedToDecode

오류 응답 본문

{
  "fault": {
    "faultstring": "Failed to Decode Token: policy({0})",
    "detail": {
       "errorcode": "steps.jwt.FailedToDecode"
     }
  }
}

원인

이 오류는 JWT 디코딩 정책의 <Source> 요소에 지정된 JSON 웹 토큰(JWT)이 형식이 잘못되었거나 유효하지 않거나 분할할 수 없는 경우에 발생합니다.

올바르게 구조화된 JWT는 헤더, 페이로드, 서명이 header.payload.signature 형식이어야 합니다. DecodeJWT 정책에 전달된 JWT에 누락된 구성요소 부분이 있으면 오류가 발생합니다. 예를 들어 JWT에 payload.signature만 있고 header가 누락된 경우 오류가 발생합니다.

진단

  1. JWT 디코딩 정책의 <Source> 요소에 지정된 변수를 식별합니다. 이 변수에는 JWT가 포함되어 있어야 합니다.

    다음은 JWT 디코딩 정책의 예시입니다.

    <DecodeJWT name="JWT-Decode-HS256">
        <DisplayName>JWT Verify HS256</DisplayName>
        <Source>request.header.authorization</Source>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    </DecodeJWT>
    

    위 예시에서 JWT는 승인 요청 헤더에 포함되어야 합니다.

  2. 1단계에서 식별된 변수를 검토하여 포함된 JWT가 유효한지 확인합니다. 입력 JWT가 유효하지 않으면 오류의 원인이 됩니다.

    다음 API 요청 예시에서는 입력 JWT가 승인 요청 헤더에 전달됩니다.

    curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT" -H "Authorization: Bearer eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"
    

    JWT를 자세히 살펴보면 payload.signature 형식이 잘못되었습니다. JWT의 올바른 형식은 header.payload.signature입니다. 따라서 JWT 디코딩 정책이 다음 오류와 함께 실패합니다.

    "faultstring": "Failed to Decode Token: policy({0})"
    

해결 방법

JWT 디코딩 정책에 전달된 JWT에 세 가지 요소가 모두 포함되었고 올바른 형식을 갖추었으며 디코딩 가능한지 확인합니다.

위 예시를 수정하려면 header.payload.signature 형식의 유효한 JWT를 전달하면 됩니다. 이를 위해서는 다음과 같이 cURL 명령어를 사용하여 API를 호출하세요.

curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"

InvalidToken

오류 코드

steps.jwt.InvalidToken

오류 응답 본문

{
  "fault": {
    "faultstring": "Invalid token: policy({0})",
    "detail": {
      "errorcode": "steps.jwt.InvalidToken"
     }
  }
}

원인

이 오류는 JWT 디코딩 정책의 <Source> 요소에 지정된 흐름 변수가 다음과 같은 경우에 발생합니다.

  • 범위를 벗어난 경우(정책이 실행 중인 특정 흐름에서 사용할 수 없음)
  • 확인할 수 없는 경우(정의되지 않음)

진단

  1. JWT 디코딩 정책의 <Source> 요소에 지정된 변수를 식별합니다. 이 변수에는 JWT가 포함되어 있어야 합니다.

    다음은 JWT 디코딩 정책의 예시입니다.

    <DecodeJWT name="JWT-Decode-HS256">
        <DisplayName>JWT Verify HS256</DisplayName>
        <Source>request.header.authorization</Source>
        <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    </DecodeJWT>
    

    위 예시에서 승인 요청 헤더에 JWT가 포함되어 있어야 합니다.

  2. 1단계에서 식별된 변수가 JWT 디코딩 정책이 실행되는 흐름에서 정의되었으며 사용 가능한지 확인합니다.

  3. 변수가 다음 중 하나인 경우

    • 범위를 벗어난 경우(정책이 실행 중인 특정 흐름에서 사용할 수 없음)
    • 확인할 수 없는 경우(정의되지 않음)

    이는 오류의 원인이 됩니다.

    아래의 API 요청 예에서 JWT는 사용자에 의한 승인 요청 헤더를 통해 전달되지 않습니다.

    curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT"
    

    승인 요청 헤더가 전달되지 않으므로 JWT 디코딩 정책이 다음 오류와 함께 실패합니다.

    "faultstring": "Invalid token: policy({0})"
    

해상도

JWT 디코딩 정책의 <Source> 요소에서 참조되는 변수가 정의되었으며, 유효한(디코딩 가능한) JWT를 포함하고 있으며, JWT 디코딩 정책이 실행되는 특정 흐름에서 사용 가능한지 확인합니다.

위의 예시를 바로잡으려면 요청 승인 헤더에 유효한 JWT를 전달하면 됩니다. 이를 위해서는 다음과 같이 cURL 명령어를 사용하여 API를 호출하세요.

curl -v "http://<org>-<env>.apigee.net/v1/decodeJWT" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM"