>  기사  >  백엔드 개발  >  유효한 JWT 클레임 세트 구축

유효한 JWT 클레임 세트 구축

Patricia Arquette
Patricia Arquette원래의
2024-09-29 11:35:301007검색

Building a valid JWT Claims Set

소개

보고된 문제를 샘플로 수정하는 Pull Request를 검토해야 했고, 테스트가 통과되는 동안 샘플에 변경이 필요한 뭔가가 더 있을 것 같은 느낌이 들었습니다.

JSON 웹 토큰(JWT는 "jots"로 발음)에 대해 한동안 알고 있었지만 모릅니다. 이 PR을 보고 더 자세히 알아보고 싶은 이유가 생겼습니다.

JWT란 무엇입니까?

JWT는 당사자 간에 정보를 안전하게 전송하기 위한 개방형 표준 방법입니다. 이는 사용자를 인증하고 리소스에 대한 액세스 권한을 부여하는 데 자주 사용됩니다. 헤더, 페이로드, 서명의 3가지 부분으로 구성됩니다.

JWT가 필요한 이유

IAM 서비스 계정 자격 증명 API는 IAM 서비스 계정을 가장하기 위한 단기 자격 증명을 생성합니다. signJwt 메서드는 서비스 계정의 시스템 관리 비공개 키를 사용하여 JWT에 서명합니다. signJwt 메서드의 요청 본문 내에서 페이로드 필드에는 JWT 클레임 세트가 포함된 직렬화된 JSON 개체가 포함되어야 합니다.

JWT 클레임이란 무엇입니까?

클레임은 JWT가 전송하는 핵심 정보입니다.

다음은 유효한 청구 세트의 예입니다.

{
  "iss": "https://cloud.google.com/iam",
  "sub": "projects/-/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com",
  "aud": "https://my-iap-protected-app.example.com",
  "iat": 1694003600,
  "exp": 1694007200
}

이 소유권 주장 세트에는 다음 필드가 포함됩니다.

  • iss: 인증할 서비스 계정인 JWT 발급자는 이 경우 서비스 계정 이메일이어야 합니다.
  • sub: 서비스 계정 이메일인 JWT의 사용자 제목입니다.
  • aud: IAP로 보호되는 리소스의 URL인 JWT의 대상자입니다.
  • iat: 발행 시간, JWT가 생성된 시간입니다. UTC 정수여야 합니다.
  • exp: JWT가 더 이상 유효하지 않게 되는 만료 시간입니다. Cloud IAM 문서에는 추가 제한 사항이 있습니다. 즉, 과거일 수 없으며 향후 12시간 이내일 수 없습니다.

JWT의 페이로드에 이러한 클레임을 포함하면 해당 클레임이 유효하고 IAP로 보호되는 리소스에 액세스하는 데 사용될 수 있음을 확인할 수 있습니다.

그럼 그 PR에 대해서

원래 코드는 다음과 같았습니다

    iat = datetime.datetime.now(tz=datetime.timezone.utc)
    exp = iat + 3600
    return json.dumps(
        {
            "iss": service_account_email,
            "sub": service_account_email,
            "aud": resource_url,
            "iat": iat,
            "exp": exp,
        }
    )

테스트에 문제가 있다는 것을 알고 있지만 이 코드의 근본적인 문제가 해결되는 것을 막고 싶지 않습니다.

PR 작성자가 변경사항을 제출했습니다

iat = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()

불완전한 수정이 될 것 같았습니다. API에 대한 문서를 기반으로 제출된 수정 사항이 여전히 iat를 int 유형으로 설정하지 않고 계속 실패한다는 것을 깨달았습니다.
PR 문제를 해결하기 위해 약간의 변경을 제안했습니다.

now_utc = datetime.datetime.now(tz=datetime.timezone.utc)  
iat = int(now_utc.timestamp())

생각할수록 이 샘플에는 Datetime이 유용하지 않다는 것을 깨달았습니다. Datetime 모듈은 날짜를 원할 때 유용한 날짜와 시간을 조작하기 위한 클래스를 제공합니다. 문자 그대로 UTC의 정수가 필요하므로 시간 모듈이 더 유용합니다.

인세타드, 우리는 할 수 있어요

  now = int(time.time())

    return json.dumps(
        {
            "iss": service_account_email,
            "sub": service_account_email,
            "aud": resource_url,
            "iat": now,
            "exp": now + 3600,
        }
    )

여기에서 이 샘플의 전체(업데이트된!) 코드를 찾으세요.

위 내용은 유효한 JWT 클레임 세트 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.