InfoGrab DocsInfoGrab Docs

애플리케이션 액세스에서 JWT 토큰 사용하기

요약

이 페이지에서는 Teleport가 보호되는 애플리케이션에 대해 JSON Web Token 인증을 지원하는 방법을 설명합니다. Teleport는 대상 application에 대한 각 요청과 함께 Teleport 권한(authority)으로 서명된 JWT 토큰을 Teleport-Jwt-Assertion 헤더에 담아 전송합니다.

이 페이지에서는 Teleport가 보호되는 애플리케이션에 대해 JSON Web Token 인증을 지원하는 방법을 설명합니다.

Teleport는 대상 application에 대한 각 요청과 함께 Teleport 권한(authority)으로 서명된 JWT 토큰을 Teleport-Jwt-Assertion 헤더에 담아 전송합니다.

JWT 토큰을 사용하여 인증된 Teleport 사용자와 그 역할 및 트레잇에 대한 정보를 얻을 수 있습니다. 이를 통해 다음을 수행할 수 있습니다:

  • Teleport의 identity/roles/traits를 웹 애플리케이션의 identity/roles/traits에 매핑합니다.
  • Teleport identity를 신뢰하여 사용자를 애플리케이션에 자동으로 로그인시킵니다.

JWT 소개#

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

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

Teleport JWT는 세 가지 섹션으로 구성됩니다:

  • Header
  • Payload
  • Signature

헤더 예시

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

Payload#

페이로드 예시

{
  "aud": [
    "http://127.0.0.1:34679"
  ],
  "iss": "aws",
  "nbf": 1603835795,
  "sub": "alice",
  // Teleport user name.
  "username": "alice"
  // Teleport user roles.
  "roles": [
    "admin"
  ],
  // Teleport user traits.
  "traits": {
    "logins": [
      "root",
      "ubuntu",
      "ec2-user"
    ]
  },
  // Teleport identity expiration.
  "exp": 1603943800,
}

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

Teleport JWT Assertion 예시

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 Web Key Set(jwks) 엔드포인트를 제공합니다. 이 엔드포인트는 https://[cluster-name]/.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는 애플리케이션 액세스를 위해 생성되는 JWT에 사용자의 role과 trait을 포함하며, Teleport가 업스트림 web application으로 보내는 모든 요청에 Teleport-Jwt-Assertion 헤더가 함께 전송됩니다.

web application이 이러한 값을 필요로 하지 않거나, HTTP 헤더의 크기 제한을 초과하여 오류가 발생하는 경우 이 정보를 토큰에서 생략하도록 Teleport를 구성할 수 있습니다.

- name: "dashboard"
  uri: https://localhost:4321
  rewrite:
    # Specify whether to include roles or traits in the JWT.
    # Options:
    # - roles-and-traits: include both roles and traits
    # - roles: include only roles
    # - traits: include only traits
    # - none: exclude both roles and traits from the JWT token
    # Default: roles-and-traits
    jwt_claims: roles-and-traits
    headers:
    # Inject header with Teleport-signed JWT token.
    - "Authorization: Bearer {{internal.jwt}}"

애플리케이션 액세스에서 JWT 토큰 사용하기

Teleport v18.9
원문 보기
요약

이 페이지에서는 Teleport가 보호되는 애플리케이션에 대해 JSON Web Token 인증을 지원하는 방법을 설명합니다. Teleport는 대상 application에 대한 각 요청과 함께 Teleport 권한(authority)으로 서명된 JWT 토큰을 Teleport-Jwt-Assertion 헤더에 담아 전송합니다.

이 페이지에서는 Teleport가 보호되는 애플리케이션에 대해 JSON Web Token 인증을 지원하는 방법을 설명합니다.

Teleport는 대상 application에 대한 각 요청과 함께 Teleport 권한(authority)으로 서명된 JWT 토큰을 Teleport-Jwt-Assertion 헤더에 담아 전송합니다.

JWT 토큰을 사용하여 인증된 Teleport 사용자와 그 역할 및 트레잇에 대한 정보를 얻을 수 있습니다. 이를 통해 다음을 수행할 수 있습니다:

  • Teleport의 identity/roles/traits를 웹 애플리케이션의 identity/roles/traits에 매핑합니다.
  • Teleport identity를 신뢰하여 사용자를 애플리케이션에 자동으로 로그인시킵니다.

JWT 소개#

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

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

Teleport JWT는 세 가지 섹션으로 구성됩니다:

  • Header
  • Payload
  • Signature

헤더 예시

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

Payload#

페이로드 예시

{
  "aud": [
    "http://127.0.0.1:34679"
  ],
  "iss": "aws",
  "nbf": 1603835795,
  "sub": "alice",
  // Teleport user name.
  "username": "alice"
  // Teleport user roles.
  "roles": [
    "admin"
  ],
  // Teleport user traits.
  "traits": {
    "logins": [
      "root",
      "ubuntu",
      "ec2-user"
    ]
  },
  // Teleport identity expiration.
  "exp": 1603943800,
}

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

Teleport JWT Assertion 예시

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 Web Key Set(jwks) 엔드포인트를 제공합니다. 이 엔드포인트는 https://[cluster-name]/.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는 애플리케이션 액세스를 위해 생성되는 JWT에 사용자의 role과 trait을 포함하며, Teleport가 업스트림 web application으로 보내는 모든 요청에 Teleport-Jwt-Assertion 헤더가 함께 전송됩니다.

web application이 이러한 값을 필요로 하지 않거나, HTTP 헤더의 크기 제한을 초과하여 오류가 발생하는 경우 이 정보를 토큰에서 생략하도록 Teleport를 구성할 수 있습니다.

- name: "dashboard"
  uri: https://localhost:4321
  rewrite:
    # Specify whether to include roles or traits in the JWT.
    # Options:
    # - roles-and-traits: include both roles and traits
    # - roles: include only roles
    # - traits: include only traits
    # - none: exclude both roles and traits from the JWT token
    # Default: roles-and-traits
    jwt_claims: roles-and-traits
    headers:
    # Inject header with Teleport-signed JWT token.
    - "Authorization: Bearer {{internal.jwt}}"