지원되는 액세스 토큰 식별

완료됨

여기서는 다양한 GitHub 액세스 토큰, 해당 애플리케이션, 제한 사항 및 속도 제한에 대해 알아봅니다.

회사 내에서 사용자에게 액세스 권한을 부여하는 경우 인증이 매우 중요합니다. 사용자 액세스는 범위가 엄격하게 지정되어야 하며, 사용자가 작업을 완료하는 데 필요한 것만 포함해야 합니다. 회사 내의 사용자가 사용 사례에 가장 적합한 옵션을 사용하도록 안내하는 데 도움이 되므로 다양한 액세스 토큰을 이해하는 것이 중요합니다.

GitHub는 사용자가 수행해야 하는 다양한 작업을 인증할 수 있도록 하는 다양한 토큰을 사용합니다. 대부분의 경우 이렇게 다양한 토큰은 직관적이며 사용할 토큰을 쉽게 알 수 있습니다. 하지만 경우에 따라 동일한 결과를 얻기 위해 여러 토큰을 사용할 수 있으므로, 토큰을 선택하는 것은 좋은 것, 더 좋은 것, 최선의 선택지 중에서 결정하는 일로 귀결될 수 있습니다. 이러한 상황에서는 GitHub의 토큰 특성을 식별하고 토큰 액세스의 범위를 올바르게 지정하는 것이 중요합니다. 다음은 사용할 수 있는 다양한 액세스 토큰 목록입니다.

  • GitHub 개인용 액세스 토큰
  • GitHub 사용자-서버 토큰
  • GitHub 서버 간 토큰
  • OAuth 액세스 토큰
  • 새로 고침 토큰

보안 취약성이 검색되면 위험을 신속하게 완화할 수 있도록 개발 팀에서 범위가 적절한 토큰을 사용하도록 권장하는 것이 중요합니다. 이러한 각 액세스 토큰에 대해 좀 더 자세히 살펴보겠습니다.

개인용 액세스 토큰

PAT(개인용 액세스 토큰)는 GitHub를 인증하는 데 암호 대신 사용할 수 있습니다. 리포지토리를 푸시 및 풀(pull)하려면 GitHub에서 사용자 액세스를 확인해야 합니다. 확인은 사용자의 확인된 메일 주소를 통해 수행됩니다. 워크플로 요구 사항에 따라 개인용 액세스 토큰을 여러 개 만들 수 있으며, 이러한 토큰은 암호를 이용해 최대한 안전하게 처리해야 합니다. 보안을 위해 애플리케이션마다 다른 토큰을 사용하는 것이 좋습니다. GitHub에서 개인 액세스 토큰을 만들려면 설정으로 이동하고 개발자 설정에서 개인 액세스 토큰을 선택합니다.

GitHub 개인용 액세스 토큰의 예제가 있는 스크린샷

할당한 작업을 인증하는 데 필요한 액세스만 허용하도록 개별 토큰의 범위를 지정할 수 있습니다. 토큰은 특정 사용자에 연결되며, 조직 및 리포지토리에 대한 사용자의 액세스 권한과 일치합니다. 언제든지 개인 액세스 토큰을 해지할 수 있으며, 이는 보안 문제가 발생할 때 특히 중요합니다. 개인용 액세스 토큰을 사용자 이름과 암호만큼 안전하게 취급해야 한다는 사실을 팀에 알리는 것이 중요합니다. 토큰이 손상되면 즉시 조치를 취해 토큰을 해지해야 합니다.

개인 액세스 토큰을 만들기 위한 자세한 단계는 다음에서 사용할 수 있습니다. 개인 액세스 토큰 만들기 - GitHub Docs

디바이스 토큰

디바이스 토큰은 기본적으로 디바이스 컨텍스트에서 사용되는 PAT의 머신 계정 버전으로, 비사용자가 바인딩되지 않은 특정 사용 사례의 특정 리포지토리에 대한 액세스를 제공합니다. OAuth 흐름을 사용하는 애플리케이션 설정은 디바이스 토큰을 사용합니다. 일반적으로 실행기, 특수 애플리케이션 서비스, Cron 작업(Linux) 또는 자동화된 작업과 관련된 기타 유사한 시나리오에서 사용됩니다. 개인 액세스 토큰과 마찬가지로 디바이스 토큰은 개별 계정에 연결되며 디바이스 토큰을 만드는 계정은 라이선스를 사용합니다.

GitHub 애플리케이션 설치 토큰

설치 토큰을 사용하면 GitHub 앱에서 조직의 애플리케이션 설치에 대해 인증된 API 요청을 수행할 수 있습니다. 설치 토큰을 만들기 전에 먼저 대상 리포지토리에 토큰이 적용되는 GitHub 앱을 설치해야 합니다. 설치 토큰은 1시간 동안 유효하며 특정 용도로 생성되고 비교적 짧은 시간 안에 만료되므로 안전합니다.

OAuth 액세스 토큰

OAuth2 토큰은 사용자에게 브라우저에서 실행되는 표준 OAuth 앱 및 CLI 도구와 같은 헤드리스 애플리케이션에 대한 권한을 부여하는 데 사용됩니다. 앱에서 사용자 액세스 토큰을 사용하여 API에 액세스할 수 있습니다. 이러한 토큰을 사용하면 GitHub 사용자 ID를 타사 애플리케이션에 연결하여 앱이 사용자 대신 작업을 수행할 수 있습니다. 예를 들어 범위를 요청하는 user:email 앱을 사용하려면 앱에 개인 전자 메일 주소에 대한 읽기 전용 액세스 권한이 부여됩니다. 이러한 토큰은 프로덕션 애플리케이션에 대한 웹 애플리케이션 흐름을 사용하여 획득할 수 있습니다. 이러한 토큰은 단기적이고 10분 후에 만료되므로 보안도 보장됩니다.

새로 고침 토큰

새로 고침 토큰은 OAuth 토큰과 연결됩니다. 사용자-서버 요청을 통해 새 OAuth 토큰이 부여되면 새로 고침 토큰이 응답에 포함됩니다. 사용자 토큰이 만료되면 콜백 요청을 통해 새로 고침 토큰을 새 사용자 토큰으로 교환할 수 있습니다. 새 OAuth 토큰이 발급될 때마다 새로 고침 토큰이 포함됩니다. 새로 고침 토큰은 6개월 동안 유효하며, OAuth 토큰 업데이트 시점을 알려주는 역할을 합니다.

식별 가능한 접두사

업계에서 볼 수 있듯이 토큰 접두사는 토큰을 식별할 수 있는 확실한 방법입니다. GitHub에는 각 토큰을 나타내는 세 글자 접두사를 포함합니다. 접두사는 회사를 나타내는 두 문자로 시작하고 토큰 gh형식의 첫 번째 문자 뒤에 잇습니다. 사용 가능한 액세스 토큰 형식의 접두사는 다음과 같습니다.

  • ghp - GitHub 개인용 액세스 토큰
  • ghu - GitHub 사용자-서버 토큰
  • ghs - GitHub 서버 간 토큰
  • gho - OAuth 액세스 토큰
  • ghr - 새로 고침 토큰

또한 가독성을 높이기 위해 토큰에서 이러한 접두사에 구분 기호(_)가 적용됩니다. 밑줄은 Base64 문자가 아니어 SHA(Secure Hash Algorithms)와 같이 임의로 생성된 문자열이 이러한 토큰을 실수로 복제할 수 없도록 합니다. 접두사는 GitHub 리포지토리 내 보안을 더욱 개선하기 위한 GitHub의 고급 보안 기능인 비밀 스캐닝의 거짓 양성 비율을 줄이는 데 도움이 됩니다.

토큰 속도 제한

속도 제한을 초과하면 개발 시간이 손실될 수 있습니다. GitHub 앱 및 OAuth 앱에 대한 속도 제한에 대해 설명하겠습니다. 속도 제한을 이해하면 팀의 개발자에게 리소스를 지원하여 이러한 GitHub 리소스에 대한 조직의 투자를 최적화할 수 있습니다.

속도 제한은 GitHub의 트래픽 속도를 제어하는 데 도움이 되며 시간당 요청을 기준으로 합니다.

  • GitHub 엔터프라이즈 계정에 설치된 GitHub 앱에는 시간당 15000개 요청에 대한 요청 속도 제한이 있습니다.
  • OAuth 앱은 개별 사용자에 대해 인증되고 시간당 5000개의 요청으로 제한됩니다.

엔터프라이즈 관리자는 앱의 속도 제한을 모니터링하고 개발자와 협력하여 스크립트를 제한 내로 유지하도록 조정해야 합니다. 일반적으로 개발자가 워크플로에서 너무 많은 정보를 요청하는 스크립트를 작성하는 등의 작업을 수행하기 전까지는 속도 제한이 문제가 되지 않습니다. 갑자기 개발이 중단되고 속도 제한으로 인해 병목 상태가 발생합니다. 시간당 요청 수를 제한하거나 요청 간에 대기하도록 워크플로를 변경하여 이런 속도 제한 초과 문제를 방지할 수 있습니다. 기본 인증 또는 OAuth를 사용하여 속도 제한을 초과하는 경우 API 응답을 캐싱하고 조건부 요청을 사용하여 문제를 해결할 수 있습니다.

관리 콘솔에서 엔터프라이즈의 인증되지 않은 사용자에 대한 사용자 지정 속도 제한을 설정하고 특정 사용자가 전체 API 속도 제한을 활용할 수 있도록 하는 예외 목록을 만들 수 있습니다.

API 속도 제한을 설정하는 관리 콘솔의 스크린샷

아래에 표시된 속도 제한 API를 사용하여 언제든지 현재 속도 제한 상태를 확인할 수 있습니다. 모든 API 요청의 반환된 HTTP 헤더는 현재 속도 제한 상태를 표시합니다.

curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/rate_limit

예제 응답

{
  "resources": {
    "core": {
      "limit": 5000,
      "remaining": 4999,
      "reset": 1372700873,
      "used": 1
    },
    "search": {
      "limit": 30,
      "remaining": 18,
      "reset": 1372697452,
      "used": 12
    },
    "graphql": {
      "limit": 5000,
      "remaining": 4993,
      "reset": 1372700389,
      "used": 7
    },
    "integration_manifest": {
      "limit": 5000,
      "remaining": 4999,
      "reset": 1551806725,
      "used": 1
    },
    "code_scanning_upload": {
      "limit": 500,
      "remaining": 499,
      "reset": 1551806725,
      "used": 1
    }
  },
  "rate": {
    "limit": 5000,
    "remaining": 4999,
    "reset": 1372700873,
    "used": 1
  }
}

속도 제한에 대한 자세한 내용은 GitHub Docs의 속도 제한을 참조하세요.