JSON 웹 토큰 정보(JWT)
앱으로 인증하거나 설치 액세스 토큰을 생성하려면 JWT(JSON 웹 토큰)를 생성해야 합니다. REST API 엔드포인트에 JWT가 필요한 경우 해당 엔드포인트에 대한 설명서는 JWT를 사용하여 엔드포인트에 액세스해야 함을 나타냅니다.
JWT는 알고리즘을 RS256
사용하여 서명되어야 하며 다음 클레임을 포함해야 합니다.
클레임 | 의미 | 세부 정보 |
---|---|---|
iat | 발급 시간 | JWT를 만든 시간입니다. 클록 드리프트로부터 보호하려면 과거에 이 60초를 설정하고 서버의 날짜와 시간을 정확하게 설정하는 것이 좋습니다(예: 네트워크 시간 프로토콜 사용). |
exp | 만료 날짜 | JWT의 만료 시간이며, 그 후에는 설치 토큰을 요청하는 데 사용할 수 없습니다. 시간은 앞으로 10분 이내여야 합니다. |
iss | 발급자 | GitHub App의 ID입니다. 이 값은 JWT의 서명을 확인하는 데 적합한 공개 키를 찾는 데 사용됩니다. REST API 엔드포인트를 사용하여 앱의 ID를 GET /app 찾을 수 있습니다. 자세한 내용은 REST API 설명서의 "앱"을 참조하세요. |
alg | 메시지 인증 코드 알고리즘 | 알고리즘을 RS256 사용하여 JWT에 서명해야 하므로 이 작업을 RS256 수행해야 합니다. |
JWT를 사용하려면 API 요청의 Authorization
헤더에 전달합니다. 다음은 그 예입니다.
curl --request GET \
--url "https://api.github.com/app" \
--header "Accept: application/vnd.github+json" \
--header "Authorization: Bearer YOUR_JWT" \
--header "X-GitHub-Api-Version: 2022-11-28"
대부분의 경우 Authorization: Bearer
또는 Authorization: token
을 사용하여 전달할 수 있습니다. 그러나 JWT(JSON 웹 토큰)를 전달하는 경우 Authorization: Bearer
를 사용해야 합니다.
JWT(JSON 웹 토큰) 생성
대부분의 프로그래밍 언어에는 JWT를 생성할 수 있는 패키지가 있습니다. 모든 경우에 프라이빗 키와 GitHub App의 ID가 있어야 합니다. 프라이빗 키를 생성하는 방법에 대한 자세한 내용은 "GitHub 앱에 대한 프라이빗 키 관리"을 참조하세요. REST API 엔드포인트를 사용하여 앱의 ID를 GET /app
찾을 수 있습니다. 자세한 내용은 REST API 설명서의 "앱"을 참조하세요.
참고: JWT를 만드는 대신 GitHub의 Octokit SDK를 사용하여 앱으로 인증할 수 있습니다. SDK는 JWT 생성을 처리하고 토큰이 만료되면 JWT를 다시 생성합니다. 자세한 내용은 "REST API 및 JavaScript를 사용한 스크립팅"을 참조하세요.
예: Ruby를 사용하여 JWT 생성
참고: 이 스크립트를 사용하려면 를 실행 gem install jwt
하여 패키지를 설치 jwt
해야 합니다.
다음 예제에서는 를 프라이빗 키가 저장되는 파일 경로로 바꿉 YOUR_PATH_TO_PEM
니다. 를 앱의 ID로 바꿉니다 YOUR_APP_ID
. 및 YOUR_APP_ID
의 값을 YOUR_PATH_TO_PEM
큰따옴표로 묶습니다.
require 'openssl'
require 'jwt' # https://rubygems.org/gems/jwt
# Private key contents
private_pem = File.read("YOUR_PATH_TO_PEM")
private_key = OpenSSL::PKey::RSA.new(private_pem)
# Generate the JWT
payload = {
# issued at time, 60 seconds in the past to allow for clock drift
iat: Time.now.to_i - 60,
# JWT expiration time (10 minute maximum)
exp: Time.now.to_i + (10 * 60),
# GitHub App's identifier
iss: "YOUR_APP_ID"
}
jwt = JWT.encode(payload, private_key, "RS256")
puts jwt
예: Python을 사용하여 JWT 생성
참고: 이 스크립트를 사용하려면 를 실행 pip install jwt
하여 패키지를 설치 jwt
해야 합니다.
#!/usr/bin/env python3
import jwt
import time
import sys
# Get PEM file path
if len(sys.argv) > 1:
pem = sys.argv[1]
else:
pem = input("Enter path of private PEM file: ")
# Get the App ID
if len(sys.argv) > 2:
app_id = sys.argv[2]
else:
app_id = input("Enter your APP ID: ")
# Open PEM
with open(pem, 'rb') as pem_file:
signing_key = jwt.jwk_from_pem(pem_file.read())
payload = {
# Issued at time
'iat': int(time.time()),
# JWT expiration time (10 minutes maximum)
'exp': int(time.time()) + 600,
# GitHub App's identifier
'iss': app_id
}
# Create JWT
jwt_instance = jwt.JWT()
encoded_jwt = jwt_instance.encode(payload, signing_key, alg='RS256')
print(f"JWT: {encoded_jwt}")
이 스크립트는 프라이빗 키가 저장된 파일 경로와 앱의 ID를 묻는 메시지를 표시합니다. 또는 스크립트를 실행할 때 이러한 값을 인라인 인수로 전달할 수 있습니다.