사용자 인증 Application Load Balancer - Elastic Load Balancing

문서의 영문과 번역 사이에 충돌이 있는 경우에는 영문 버전을 따릅니다. 번역 버전은 기계 번역을 사용하여 제공합니다.

사용자 인증 Application Load Balancer

애플리케이션에 액세스하는 사용자를 안전하게 인증하도록 Application Load Balancer를 구성할 수 있습니다. 이렇게 하면 애플리케이션이 비즈니스 로직에 집중할 수 있도록 사용자 인증 작업을 로드 밸런서로 오프로드할 수 있습니다.

지원되는 사용 사례는 다음과 같습니다.

  • OpenID Connect(OIDC) 호환 자격 증명 공급자(IdP)를 통해 사용자를 인증합니다.

  • 에서 지원되는 사용자 풀을 통해 Amazon, Facebook 또는 Google과 같은 잘 알려진 소셜 IdP를 통해 사용자를 인증합니다.Amazon Cognito.

  • 에서 지원되는 사용자 풀을 통해 SAML, LDAP 또는 Microsoft AD를 사용하는 기업 자격 증명을 통해 사용자를 인증합니다.Amazon Cognito.

OIDC 준수 IDP 사용 준비

에서 OIDC 호환 IdP를 사용하는 경우 다음을 수행합니다.Application Load Balancer:

  • IdP에서 새 OIDC 앱을 생성합니다. 클라이언트 ID와 클라이언트 암호를 구성해야 합니다.

  • IdP가 게시하는 권한 부여, 토큰 및 사용자 정보와 같은 엔드포인트를 가져옵니다. 잘 알려진 구성에서 이 정보를 찾을 수 있습니다.

  • IDP 앱에서 다음 리디렉션 URL 중 하나를 허용하십시오. 여기서 DNS는 로드 밸런서의 도메인 이름이고 CNAME은 애플리케이션의 DNS 별칭입니다.

    • '^https://.+$'DNS/oauth2/idpresponse

    • '^https://.+$'CNAME/oauth2/idpresponse

사용 준비 Amazon Cognito

에서 Amazon Cognito 사용자 풀을 사용하는 경우 다음을 수행하십시오.Application Load Balancer:

  • 사용자 풀 생성 자세한 내용은 Amazon Cognito 사용자 in the Amazon Cognito 개발자 안내서.

  • 사용자 풀 클라이언트를 생성합니다. 클라이언트가 클라이언트 암호를 생성하고, 코드 부여 흐름을 사용하며, 로드 밸런서가 사용하는 것과 동일한 OAuth 범위를 지원하도록 클라이언트를 구성해야 합니다. 자세한 내용은 사용자 풀 앱 클라이언트 구성 in the Amazon Cognito 개발자 안내서.

  • 사용자 풀 도메인을 생성합니다. 자세한 내용은 사용자 풀의 도메인 이름 추가 in the Amazon Cognito 개발자 안내서.

  • 요청된 범위가 ID 토큰을 반환하는지 확인하십시오. 예를 들어, 기본 범위, openid ID 팔레트를 반환하지만 aws.cognito.signin.user.admin 범위는 에 없습니다.

  • 소셜 또는 기업 IdP와 연동하려면 연동 섹션에서 IdP를 활성화합니다. 자세한 내용은 사용자 풀에 소셜 로그인 추가 또는 사용자 풀에 SAML idp를 사용하여 로그인 추가 in the Amazon Cognito 개발자 안내서.

  • 다음 리디렉션이 콜백 URL 필드에 리디렉션됩니다. Amazon Cognito여기서 DNS는 로드 밸런서의 도메인 이름이고 CNAME은 애플리케이션에 대한 DNS 별칭입니다(하나를 사용하는 경우).

    • '^https://.+$'DNS/oauth2/idpresponse

    • '^https://.+$'CNAME/oauth2/idpresponse

  • IDP 앱의 콜백 URL에서 사용자 풀 도메인을 허용합니다. IdP의 형식을 사용합니다. 예: .

    • '^https://.+$'domain-prefixauthregion.amazoncognito.com/saml2/idpresponse

    • '^https://.+$'user-pool-domain/oauth2/idpresponse

다음을 활성화하려면 IAM 사용자에게 로드 밸런서를 사용하도록 Amazon Cognito 사용자를 인증하려면 사용자에게 cognito-idp:DescribeUserPoolClient 작업.

사용 준비 Amazon CloudFront

앞에서 CloudFront 배포를 사용하는 경우 다음 설정을 활성화하십시오.Application Load Balancer:

  • Forward 요청 헤더(모두) — 보장 CloudFront 인증 요청에 대한 응답을 캐시하지 않습니다. 이렇게 하면 인증 세션이 만료된 후 응답이 캐시에서 제공되지 않습니다. 또는 캐싱이 활성화되어 있는 동안 이 위험을 줄이기 위해 CloudFront 배포의 소유자는 인증 쿠키가 만료되기 전에 TTL(Time to Live) 값이 만료되도록 설정할 수 있습니다.

  • 쿼리 문자열 전달 및 캐싱(모두) — 부하 분산 장치가 사용자가 Idp를 사용하여 사용자를 인증하는 데 필요한 쿼리 문자열 매개 변수에 액세스할 수 있도록 합니다.

  • 쿠키 포워딩(모두) — 보장 CloudFront 모든 인증 쿠키를 로드 밸런서에 전달합니다.

사용자 인증 구성

하나 이상의 리스너 규칙에 대한 인증 작업을 생성하여 사용자 인증을 구성합니다. The authenticate-cognito and authenticate-oidc 작업 유형은 HTTPS 수신자만 지원됩니다. 해당 필드의 경우, 다음을 참조하십시오. 인증 구성 and 인증 IDcactionconfig in the Elastic Load Balancing API 참조 버전 2015-12-01.

로드 밸런서는 인증 상태를 유지하기 위해 클라이언트에 세션 쿠키를 보냅니다. 사용자 인증에는 HTTPS 리스너가 필요하므로 이 쿠키에는 항상 secure 속성이 포함됩니다. 이 쿠키에는 CORS(Cross-Origin Resource Sharing) 요청이 있는 SameSite=None 속성이 포함됩니다.

Application Load Balancer는 URL로 인코딩된 쿠키 값을 지원하지 않습니다.

기본적으로 SessionTimeout 필드는 7일로 설정됩니다. 더 짧은 세션이 필요한 경우 세션 제한 시간을 1초까지 짧게 구성할 수 있습니다. 자세한 정보는 단원을 참조하십시오.인증 로그아웃 및 세션 시간 초과.

애플리케이션에 적절하게 OnUnauthenticatedRequest 필드를 구성합니다. 예: .

  • 사용자가 소셜 또는 기업 ID를 사용하여 로그인하도록 요구하는 애플리케이션—이 옵션은 기본 옵션으로 지원됩니다. authenticate. 사용자가 로그인되지 않은 경우 로드 밸런서는 요청을 idp 인증 끝점으로 리디렉션하고, idp는 사용자가 사용자 인터페이스를 사용하여 로그인하도록 요청합니다.

  • 로그인 또는 로그인되지 않은 사용자에게 일반적인 보기를 제공하는 응용 프로그램—이러한 유형의 애플리케이션을 지원하기 위해 allow 옵션. 사용자가 로그인한 경우 로드 밸런서는 사용자 클레임을 제공하며 애플리케이션은 개인 설정된 보기를 제공할 수 있습니다. 사용자가 로그인하지 않은 경우 로드 밸런서는 사용자 클레임 없이 요청을 전달하며 애플리케이션은 일반 보기를 제공할 수 있습니다.

  • 몇 초마다 로드하는 javascript 기능이 있는 단일 페이지 애플리케이션—기본적으로 인증 세션 쿠키가 만료되면 AJAX 호출이 idp로 리디렉션되고 차단됩니다. 귀하가 deny 옵션, 부하 분산 장치는 이 AJAX 호출에 HTTP 401 승인 받지 않은 오류를 반환합니다.

부하 분산 장치는TokenEndpoint) 및 idp 사용자 정보 엔드포인트(UserInfoEndpoint) ). 로드 밸런서의 보안 그룹과 VPC의 네트워크 ACL이 이러한 엔드포인트에 대한 발신 액세스를 허용하는지 확인합니다. VPC에서 인터넷에 액세스할 수 있는지 확인합니다. 내부 로드 밸런서가 있는 경우, NAT 게이트웨이를 사용하여 로드 밸런서가 이러한 엔드포인트를 액세스할 수 있도록 설정합니다.

다음을 사용하십시오. 생성-규칙 명령을 사용하여 사용자 인증을 구성합니다.

aws elbv2 create-rule --listener-arn listener-arn --priority 10 \ --conditions Field=path-pattern,Values="/login" --actions file://actions.json

다음은 actions.json 파일을 지정하는 파일을 authenticate-oidc 행동과 forward 작업.

[{ "Type": "authenticate-oidc", "AuthenticateOidcConfig": { "Issuer": "https://idp-issuer.com", "AuthorizationEndpoint": "https://authorization-endpoint.com", "TokenEndpoint": "https://token-endpoint.com", "UserInfoEndpoint": "https://user-info-endpoint.com", "ClientId": "abcdefghijklmnopqrstuvwxyz123456789", "ClientSecret": "123456789012345678901234567890", "SessionCookieName": "my-cookie", "SessionTimeout": 3600, "Scope": "email", "AuthenticationRequestExtraParams": { "display": "page", "prompt": "login" }, "OnUnauthenticatedRequest": "deny" }, "Order": 1 }, { "Type": "forward", "TargetGroupArn": "arn:aws:elasticloadbalancing:region-code:account-id:targetgroup/target-group-name/target-group-id", "Order": 2 }]

다음은 actions.json 파일을 지정하는 파일을 authenticate-cognito 행동과 forward 작업.

[{ "Type": "authenticate-cognito", "AuthenticateCognitoConfig": { "UserPoolArn": "arn:aws:cognito-idp:region-code:account-id:userpool/user-pool-id", "UserPoolClientId": "abcdefghijklmnopqrstuvwxyz123456789", "UserPoolDomain": "userPoolDomain1", "SessionCookieName": "my-cookie", "SessionTimeout": 3600, "Scope": "email", "AuthenticationRequestExtraParams": { "display": "page", "prompt": "login" }, "OnUnauthenticatedRequest": "deny" }, "Order": 1 }, { "Type": "forward", "TargetGroupArn": "arn:aws:elasticloadbalancing:region-code:account-id:targetgroup/target-group-name/target-group-id", "Order": 2 }]

자세한 정보는 단원을 참조하십시오.리스너 규칙.

인증 흐름

Elastic Load Balancing은 다음 단계가 포함된 OIDC 권한 부여 코드 흐름을 사용합니다.

  1. 인증 작업이 포함된 규칙에 대한 조건이 충족되면 로드 밸런서는 요청 헤더에서 인증 세션 쿠키를 확인합니다. 쿠키가 없는 경우 로드 밸런서는 IdP가 사용자를 인증할 수 있도록 사용자를 IdP 권한 부여 엔드포인트로 리디렉션합니다.

  2. 사용자가 인증된 후 IdP는 권한 부여 코드를 사용하여 사용자를 로드 밸런서로 다시 리디렉션합니다. 로드 밸런서는 코드를 IdP 토큰 엔드포인트에 제공하여 ID 토큰과 액세스 토큰을 가져옵니다.

  3. 로드 밸런서는 ID 토큰을 확인한 후 액세스 토큰을 IdP 사용자 정보 엔드포인트와 교환하여 사용자 클레임을 가져옵니다.

  4. 로드 밸런서는 클라이언트의 사용자 에이전트가 요청을 수행할 때 쿠키를 로드 밸런서에 전송할 수 있도록 인증 세션 쿠키를 생성하여 클라이언트에 전송합니다. 대부분의 브라우저는 쿠키 크기를 4K로 제한하기 때문에 로드 밸런서는 크기가 4K를 초과하는 쿠키를 여러 쿠키로 샤드합니다. IdP에서 수신한 사용자 클레임과 액세스 토큰의 총 크기가 11K 바이트를 초과하면 로드 밸런서는 클라이언트에게 HTTP 500 오류를 반환하고 ELBAuthUserClaimsSizeExceeded 지표를 증가시킵니다.

  5. 로드 밸런서는 HTTP 헤더에서 사용자 클레임을 대상에 전송합니다. 자세한 정보는 단원을 참조하십시오.사용자 청구 인코딩 및 서명 확인.

  6. IdP가 ID 토큰에서 유효한 새로 고침 토큰을 제공하는 경우 로드 밸런서는 새로 고침 토큰을 저장하고 세션 제한 시간이 초과되거나 IdP 새로 고침이 실패할 때까지 액세스 토큰이 만료될 때마다 이 토큰을 사용하여 사용자 클레임을 새로 고칩니다. 사용자가 로그아웃하면 새로 고침이 실패하고 로드 밸런서는 사용자를 IdP 권한 부여 엔드포인트로 리디렉션합니다. 이렇게 하면 사용자가 로그아웃한 후 로드 밸런서가 세션을 중단할 수 있습니다. 자세한 정보는 단원을 참조하십시오.인증 로그아웃 및 세션 시간 초과.

사용자 청구 인코딩 및 서명 확인

로드 밸런서는 사용자를 성공적으로 인증한 후 IdP에서 수신된 사용자 클레임을 대상에 전송합니다. 로드 밸런서는 애플리케이션이 서명을 확인하고 클레임이 로드 밸런서에서 전송되었음을 확인할 수 있도록 사용자 클레임에 서명합니다.

로드 밸런서는 다음 HTTP 헤더를 추가합니다.

x-amzn-oidc-accesstoken

토큰 엔드포인트의 액세스 토큰, 일반 텍스트.

x-amzn-oidc-identity

사용자 정보 엔드포인트의 제목 필드(sub), 일반 텍스트.

x-amzn-oidc-data

사용자 클레임, JSON 웹 토큰(JWT) 형식.

전체 사용자 클레임이 필요한 애플리케이션은 표준 JWT 라이브러리를 사용하여 JWT 토큰을 확인할 수 있습니다. 이러한 토큰은 JWT 형식을 따르지만 ID 토큰이 아닙니다. JWT 형식에는 base64 URL 방식으로 인코딩된 헤더, 페이로드 및 서명이 포함되고 끝에 패딩 문자가 포함됩니다. JWT 서명은 ECDSA + P-256 + SHA256입니다.

JWT 헤더는 다음 필드가 있는 JSON 객체입니다.

{ "alg": "algorithm", "kid": "12345678-1234-1234-1234-123456789012", "signer": "arn:aws:elasticloadbalancing:region-code:account-id:loadbalancer/app/load-balancer-name/load-balancer-id", "iss": "url", "client": "client-id", "exp": "expiration" }

JWT 페이로드는 IdP 사용자 정보 엔드포인트에서 수신된 사용자 클레임이 포함되는 JSON 객체입니다.

{ "sub": "1234567890", "name": "name", "email": "alias@example.com", ... }

로드 밸런서는 사용자 클레임을 암호화하지 않기 때문에 HTTPS를 사용하도록 대상 그룹을 구성하는 것이 좋습니다. HTTP를 사용하도록 대상 그룹을 구성하는 경우 반드시 보안 그룹을 사용하여 트래픽을 로드 밸런서로 리디렉션해야 합니다. 또한 클레임을 기반으로 권한 부여를 수행하기 전에 서명을 확인하는 것이 좋습니다. 퍼블릭 키를 가져오려면 JWT 헤더에서 키 ID를 가져오고 이 정보를 사용하여 다음 리전 엔드포인트에서 퍼블릭 키를 조회합니다.

https://public-keys.auth.elb.region.amazonaws.com/key-id

AWS GovCloud(미국 서부)의 경우 엔드포인트는 다음과 같습니다.

https://s3-us-gov-west-1.amazonaws.com/aws-elb-public-keys-prod-us-gov-west-1/key-id

AWS GovCloud(미국 동부)의 경우 엔드포인트는 다음과 같습니다.

https://s3-us-gov-east-1.amazonaws.com/aws-elb-public-keys-prod-us-gov-east-1/key-id

다음 예에서는 Python 3.x로 퍼블릭 키를 가져오는 방법을 보여줍니다.

import jwt import requests import base64 import json # Step 1: Get the key id from JWT headers (the kid field) encoded_jwt = headers.dict['x-amzn-oidc-data'] 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) kid = decoded_json['kid'] # Step 2: Get the public key from regional endpoint url = 'https://public-keys.auth.elb.' + region + '.amazonaws.com/' + kid req = requests.get(url) pub_key = req.text # Step 3: Get the payload payload = jwt.decode(encoded_jwt, pub_key, algorithms=['ES256'])

다음 예에서는 Python 2.7로 퍼블릭 키를 가져오는 방법을 보여줍니다.

import jwt import requests import base64 import json # Step 1: Get the key id from JWT headers (the kid field) encoded_jwt = headers.dict['x-amzn-oidc-data'] jwt_headers = encoded_jwt.split('.')[0] decoded_jwt_headers = base64.b64decode(jwt_headers) decoded_json = json.loads(decoded_jwt_headers) kid = decoded_json['kid'] # Step 2: Get the public key from regional endpoint url = 'https://public-keys.auth.elb.' + region + '.amazonaws.com/' + kid req = requests.get(url) pub_key = req.text # Step 3: Get the payload payload = jwt.decode(encoded_jwt, pub_key, algorithms=['ES256'])

인증 로그아웃 및 세션 시간 초과

애플리케이션은 인증된 사용자를 로그아웃해야 하는 경우 인증 세션 쿠키의 만료 시간을 -1로 설정하고 클라이언트를 IdP 로그아웃 엔드포인트(IdP가 지원하는 경우)로 리디렉션해야 합니다. 사용자가 삭제된 쿠키를 재사용할 수 없도록 하려면 액세스 토큰의 만료 시간을 적절히 짧게 구성하는 것이 좋습니다. 클라이언트가 비-NULL 새로 고침으로 만료된 액세스 팔레트가 있는 세션 쿠키와 함께 로드 밸런서를 제공하는 경우, 로드 밸런서는 해당 사용자가 여전히 로그인되어 있는지 여부를 결정하기 위해 idp에 접속 합니다.

새로 고침 토큰과 세션 제한 시간은 다음과 같이 연계됩니다.

  • 세션 제한 시간이 액세스 토큰 만료 시간보다 짧은 경우 로드 밸런서는 세션 제한 시간을 준수합니다. 사용자에게 IdP가 포함된 활성 세션이 있는 경우 다시 로그인하라는 메시지가 표시되지 않을 수 있습니다. 그렇지 않으면 사용자가 로그인하도록 리디렉션됩니다.

  • 세션 제한 시간이 액세스 토큰 만료 시간보다 길고 IdP가 새로 고침 토큰을 지원하지 않는 경우 로드 밸런서는 제한 시간이 초과될 때까지 인증 세션을 유지한 다음 사용자가 다시 로그인하도록 합니다.

  • 세션 제한 시간이 액세스 토큰 만료 시간보다 길고 IdP가 새로 고침 토큰을 지원하는 경우 로드 밸런서는 액세스 토큰이 만료될 때마다 사용자 세션을 새로 고칩니다. 로드 밸런서는 인증 세션 제한 시간이 초과되거나 새로 고침 흐름이 실패한 후에만 사용자가 다시 로그인하도록 합니다.