기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Verified Access의 사용자 클레임 전달 및 서명 확인
AWS Verified Access 인스턴스가 사용자를 성공적으로 인증하면 IdP에서 받은 사용자 클레임을 Verified Access 엔드포인트로 전송합니다. 사용자 클레임은 서명되어 애플리케이션에서 서명을 확인하고 클레임이 Verified Access에서 전송되었음을 확인할 수 있습니다. 이 프로세스 중에 다음 HTTP 헤더가 추가됩니다.
x-amzn-ava-user-context
이 헤더는 JSON 웹 토큰(JWT) 형식의 사용자 클레임을 포함합니다. JWT 형식에는 base64 URL 방식으로 인코딩된 헤더, 페이로드 및 서명이 포함됩니다. Verified·Access는 ES384(SHA-384 해시 알고리즘을 사용하는 ECDSA 서명 알고리즘)를 사용하여 JWT 서명을 생성합니다.
애플리케이션은 이러한 클레임을 개인화 또는 기타 사용자별 경험에 사용할 수 있습니다. 애플리케이션 개발자는 사용하기 전에 자격 증명 공급자가 제공하는 각 클레임의 고유성 및 검증 수준에 대해 스스로 학습해야 합니다. 일반적으로 sub
클레임은 특정 사용자를 식별하는 가장 좋은 방법입니다.
예: OIDC 사용자 클레임용으로 서명된 JWT
다음 예에서는 OIDC 사용자 클레임의 헤더와 페이로드가 JWT 형식에서 어떻게 보일지 보여줍니다.
헤더의 예:
{
"alg": "ES384",
"kid": "12345678-1234-1234-1234-123456789012",
"signer": "arn:aws:ec2:us-east-1:123456789012:verified-access-instance/vai-abc123xzy321a2b3c",
"iss": "OIDC Issuer URL",
"exp": "expiration" (120 secs)
}
페이로드의 예:
{
"sub": "xyzsubject",
"email": "xxx@amazon.com",
"email_verified": true,
"groups": [
"Engineering",
"finance"
]
}
예: IAM Identity Center 사용자 클레임용으로 서명된 JWT
다음 예에서는 IAM Identity Center 사용자 클레임의 헤더와 페이로드가 JWT 형식에서 어떻게 보일지 보여줍니다.
참고
IAM Identity Center의 경우 사용자 정보만 클레임에 포함됩니다.
헤더의 예:
{
"alg": "ES384",
"kid": "12345678-1234-1234-1234-123456789012",
"signer": "arn:aws:ec2:us-east-1:123456789012:verified-access-instance/vai-abc123xzy321a2b3c",
"iss": "arn:aws:ec2:us-east-1:123456789012:verified-access-trust-provider/vatp-abc123xzy321a2b3c",
"exp": "expiration" (120 secs)
}
페이로드의 예:
{
"user": {
"user_id": "f478d4c8-a001-7064-6ea6-12423523",
"user_name": "test-123",
"email": {
"address": "test@amazon.com",
"verified": false
}
}
}
퍼블릭 키
Verified·Access 인스턴스는 사용자 클레임을 암호화하지 않기 때문에 HTTPS를 사용하도록 Verified·Access 엔드포인트를 구성하는 것이 좋습니다. HTTP를 사용하도록 Verified·Access 엔드포인트를 구성하는 경우 반드시 보안 그룹을 사용하여 트래픽을 엔드포인트로 제한해야 합니다.
보안을 보장하려면 클레임을 기반으로 권한을 부여하기 전에 서명을 확인하고 JWT 헤더의 signer
필드에 필요한 Verified Access 인스턴스 ARN이 포함되어 있는지 확인해야 합니다.
퍼블릭 키를 가져오려면 JWT 헤더에서 키 ID를 가져오고 이 정보를 사용하여 엔드포인트에서 퍼블릭 키를 조회합니다.
각의 엔드포인트 AWS 리전 는 다음과 같습니다.
https://public-keys.prod.verified-access.<region>.amazonaws.com/<key-id>
예: JWT 검색 및 디코딩
다음 코드 예에서는 Python 3.9로 키 ID, 퍼블릭 키 및 페이로드를 가져오는 방법을 보여줍니다.
import jwt import requests import base64 import json # Step 1: Validate the signer expected_verified_access_instance_arn = 'arn:aws:ec2:
region-code
:account-id
:verified-access-instance/verified-access-instance-id
' encoded_jwt = headers.dict['x-amzn-ava-user-context'] jwt_headers = encoded_jwt.split('.')[0] decoded_jwt_headers = base64.b64decode(jwt_headers) decoded_jwt_headers = decoded_jwt_headers.decode("utf-8") decoded_json = json.loads(decoded_jwt_headers) received_verified_access_instance_arn = decoded_json['signer'] assert expected_verified_access_instance_arn == received_verified_access_instance_arn, "Invalid Signer" # Step 2: Get the key id from JWT headers (the kid field) kid = decoded_json['kid'] # Step 3: Get the public key from regional endpoint url = 'https://public-keys.prod.verified-access.' + region + '.amazonaws.com/' + kid req = requests.get(url) pub_key = req.text # Step 4: Get the payload payload = jwt.decode(encoded_jwt, pub_key, algorithms=['ES384'])