Skip to main content
설명서에 자주 업데이트를 게시하며 이 페이지의 번역이 계속 진행 중일 수 있습니다. 최신 정보는 영어 설명서를 참조하세요.
GitHub AE는 현재 제한된 릴리스에 있습니다.

GitHub 앱 대한 JWT(JSON 웹 토큰) 생성

JWT(JSON Web Token)를 만들어 GitHub App을(를) 사용하여 특정 REST API 엔드포인트에 인증하는 방법을 알아봅니다.

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://HOSTNAME/api/v3/app" \
--header "Accept: application/vnd.github+json" \
--header "Authorization: Bearer YOUR_JWT"

대부분의 경우 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 해야 합니다.

python
#!/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를 묻는 메시지를 표시합니다. 또는 스크립트를 실행할 때 이러한 값을 인라인 인수로 전달할 수 있습니다.