Infograb logo
애플리케이션 액세스와 함께 JWT 토큰 사용하기

Teleport는 각 요청에 대해 Teleport의 권한으로 서명된 JWT 토큰을 대상 애플리케이션의 Teleport-Jwt-Assertion 헤더와 함께 전송합니다.

JWT 토큰을 사용하여 인증된 Teleport 사용자, 사용자의 역할 및 특성에 대한 정보를 얻을 수 있습니다. 이를 통해 다음을 수행할 수 있습니다:

  • Teleport의 신원/역할/특성을 웹 애플리케이션의 신원/역할/특성에 매핑합니다.
  • Teleport 신원을 신뢰하여 사용자를 애플리케이션에 자동으로 로그인 시킵니다.

JWT 소개

JSON 웹 토큰(JWT)은 정보를 당사자 간에 JSON 객체로 안전하게 전송하는 방법을 정의하는 개방형 표준입니다.

자세한 설명은 https://jwt.io/introduction/를 방문하세요.

Teleport JWT는 세 개의 섹션을 포함합니다:

  • 헤더
  • 페이로드
  • 서명

헤더

예제 헤더

{
  "alg": "RS256",
  "typ": "JWT"
}

페이로드

예제 페이로드

{
  "aud": [
    "http://127.0.0.1:34679"
  ],
  "iss": "aws",
  "nbf": 1603835795,
  "sub": "alice",
  // Teleport 사용자 이름.
  "username": "alice"
  // Teleport 사용자 역할.
  "roles": [
    "admin"
  ],
  // Teleport 사용자 특성.
  "traits": {
    "logins": [
      "root",
      "ubuntu",
      "ec2-user"
    ]
  },
  // Teleport 신원 만료.
  "exp": 1603943800,
}

JWT는 다음 헤더와 함께 전송됩니다: Teleport-Jwt-Assertion.

예제 Teleport JWT 주장

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiaHR0cDovLzEyNy4wLjAuMTozNDY3OSJdLCJleHAiOjE2MDM5NDM4MDAsImlzcyI6ImF3cyIsIm5iZiI6MTYwMzgzNTc5NSwicm9sZXMiOlsiYWRtaW4iXSwic3ViIjoiYmVuYXJlbnQiLCJ1c2VybmFtZSI6ImJlbmFyZW50In0.PZGUyFfhEWl22EDniWRLmKAjb3fL0D4cTmkxEfb-Q30hVMzVhka5WB8AUsPsLPVhTzsQ6Nkk1DnXHdz6oxrqDDfumuRrDnpJpjiXj_l0D3bExrchN61enzBHxSD13VkRIqP1V6l4i8yt8kXDIBWc-QejLTodA_GtczkDfnnpuAfaxIbD7jEwF27KI4kZu7uES9LMu2iCLdV9ZqarA-6HeDhXPA37OJ3P6eVQzYpgaOBYro5brEiVpuJLr1yA0gncmR4FqmhCpCj-KmHi2vmjmJAuuHId6HZoEZJjC9IAsNlrSA4GHH9j82o7FF1F4J2s38bRy3wZv46MT8X8-QBSpg

JWT 주입

헤더 패스스루(headers passthrough) 구성을 사용하여 {{internal.jwt}} 템플릿 변수를 통해 JWT 토큰을 모든 헤더에 주입할 수 있습니다. 이 변수는 위에서 설명한 사용자 신원 정보를 포함하는 Teleport JWT CA로 서명된 JWT 토큰으로 교체됩니다.

예를 들어:

- name: "elasticsearch"
  uri: https://localhost:4321
  public_addr: elastic.example.com
  rewrite:
    headers:
    - "Authorization: Bearer {{internal.jwt}}"

JWT 검증

Teleport는 JWT가 신뢰할 수 있는지 확인하기 위해 JSON 웹 키 세트(jwks) 엔드포인트를 제공합니다. 이 엔드포인트는 https://[cluster-name]:3080/.well-known/jwks.json입니다:

예제 jwks.json

{
  "keys": [
    {
      "kty": "RSA",
      "n": "xk-0VSVZY76QGqeN9TD-FJp32s8jZrpsalnRoFwlZ_JwPbbd5-_bPKcz8o2tv1eJS0Ll6ePxRCyK68Jz2UC4V4RiYaqJCRq_qVpDQMB1sQ7p9M-8qvT82FJ-Rv-W4RNe3xRmBSFDYdXaFm51Uk8OIYfv-oZ0kGptKpkNY390aJOzjHPH2MqSvhk9Xn8GwM8kEbpSllavdJCRPCeNVGJXiSCsWrOA_wsv_jqBP6g3UOA9GnI8R6HR14OxV3C184vb3NxIqxtrW0C4W6UtSbMDcKcNCgajq2l56pHO8In5GoPCrHqlo379LE5QqpXeeHj8uqcjeGdxXTuPrRq1AuBpvQ",
      "e": "AQAB",
      "alg": "RS256"
    }
  ]
}

Teleport의 JWT 토큰을 검증하는 데 사용되는 예제 Go 프로그램은 GitHub에서 확인하세요.

애플리케이션 가이드

많은 기존 웹 애플리케이션 및 API가 JWT 인증을 지원합니다.

현재 사용 가능한 다음 가이드가 있습니다:

Teleport 원문 보기