기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Classic Load Balancer를 위한 고정 세션 구성
기본적으로 Classic Load Balancer는 로드가 가장 적은 등록 인스턴스에 각 요청을 독립적으로 라우팅합니다. 한편, 고정 세션 기능(세션 어피니티라고도 함)을 사용해 로드 밸런서가 사용자의 세션을 특정 인스턴스에 바인딩하도록 할 수 있습니다. 이렇게 하면 세션 중에 사용자로부터 들어오는 모든 요청이 동일한 인스턴스로 전송됩니다.
고정 세션 관리에서 핵심은 로드 밸런서가 얼마나 오랫동안 동일한 인스턴스로 사용자 요청을 일관되게 라우팅하도록 하느냐입니다. 애플리케이션에 자체 세션 쿠키가 있는 경우 세션 쿠키가 애플리케이션의 세션 쿠키에 지정된 기간을 따르도록 ELB를 구성할 수 있습니다. 애플리케이션에 자체 세션 쿠키가 없는 경우 자체 고정 기간을 지정하여 세션 쿠키를 생성하도록 ELB를 구성할 수 있습니다.
ELB는 세션을 인스턴스에 매핑하는 데 사용되는 AWSELB라는 쿠키를 생성합니다.
요구 사항
-
HTTP/HTTPS 로드 밸런서입니다.
-
각 가용 영역에 있는 하나 이상의 정상 상태 인스턴스입니다.
호환성
-
쿠키의 경로 속성에 대한 RFC는 밑줄을 허용합니다. 그러나 ELB URI는 밑줄 문자를 로 인코딩합니다. Internet Explorer 7과 같은 일부 브라우저에서는 밑줄이 로 인코딩될 것으로 예상하기
%5F때문입니다%5F. 현재 작동 중인 브라우저에 영향을 미칠 수 있기 때문에 ELB는 밑줄 문자를 URI로 계속 인코딩합니다. 예를 들어 쿠키에 속성이 있는 경우path=/my_pathELB는 전달된 요청에서이 속성을 로 변경합니다path=/my%5Fpath. -
기간 기반의 고정 쿠키에서는
secure플래그나HttpOnly플래그를 설정할 수 없습니다. 그러나 이들 쿠키는 민감한 데이터를 포함하고 있지 않습니다. 애플리케이션이 제어하는 세션 고정 쿠키에서secure플래그나HttpOnly플래그를 설정하면 AWSELB 쿠키에서도 그렇게 설정이 됩니다. -
애플리케이션 쿠키의
Set-Cookie필드에 후행 세미콜론이 있으면 로드 밸런서는 이 쿠키를 무시합니다.
기간 기반 세션 고정
로드 밸런서는 각 리스너에 대한 요청에서 인스턴스를 추적하기 위해 특별한 쿠키인 AWSELB를 사용합니다. 로드 밸런서는 요청을 받으면 가장 먼저요청에 쿠키가 있는지 여부를 확인합니다. 쿠키가 있으면 해당 요청이 쿠키에 지정된 인스턴스에 전송됩니다. 쿠키가 없는 경우에는 로드 밸런서가 기존 로드 밸런싱 알고리즘을 기반으로 인스턴스를 선정합니다. 동일한 사용자의 후속 요청이 계속 해당 인스턴스에 바인딩되도록 쿠키가 응답에 삽입됩니다. 고정 정책 구성에서 각 쿠키의 유효 기간을 설정하는 쿠키 만료 시한을 정의합니다. 로드 밸런서는 쿠키 만료 시간을 새로 고침하지 않으며 쿠키가 사용 전에 만료되었는지 여부를 확인하지 않습니다. 쿠키가 만료된 후에는 세션이 더 이상 고정 상태가 아닙니다. 클라이언트는 쿠키가 만료되면 쿠키 저장소에서 쿠키를 제거해야 합니다.
CORS(Cross-Origin Resource Sharing) 요청의 경우 고정을 활성화하려면 SameSite=None; Secure가 필요합니다. 이 경우 ELB는 원래 고정 쿠키와 동일한 정보와이 SameSite 속성을 포함하는 두 번째 고정 쿠키인 AWSELBCORS를 생성합니다. 클라이언트는 두 쿠키를 모두 수신합니다.
인스턴스가 실패하거나 비정상 상태가 되면 로드 밸런서는 해당 인스턴스로의 요청 라우팅을 중지하고 기존 로드 밸런싱 알고리즘을 기반으로 정상 상태의 인스턴스를 새로 선정합니다. 마치 쿠키가 없고 세션이 더 이상 고정 상태가 아닌 것처럼 새 인스턴스로 요청이 라우팅됩니다.
클라이언트가 다른 백엔드 포트를 가진 리스너로 전환되면 고정성이 손실됩니다.
콘솔을 사용하여 로드 밸런서에 대한 기간 기반 고정 세션을 활성화하려면
https://console.aws.amazon.com/ec2/
에서 Amazon EC2 콘솔을 엽니다. -
탐색 창의 Load Balancing 아래에서 로드 밸런서를 선택합니다.
-
로드 밸런서 이름을 선택하여 세부 정보 페이지를 엽니다.
-
리스너 탭에서 리스너 관리를 선택합니다.
-
리스너 관리 페이지에서 업데이트할 리스너를 찾고 쿠키 고정에서 편집을 선택합니다.
-
쿠키 고정 설정 편집 팝업에서 로드 밸런서에서 생성됨을 선택합니다.
-
(선택 사항) 만료 기간에 쿠키 만료 기간(초)을 입력합니다. 만료 기간을 지정하지 않은 경우에는 브라우저 세션 기간 동안 고정 세션이 지속됩니다.
-
변경 사항 저장을 선택하여 팝업 창을 닫습니다.
-
변경 사항 저장을 선택하여 로드 밸런서 세부 정보 페이지로 돌아갑니다.
AWS CLI를 사용하여 로드 밸런서에 대한 기간 기반 고정 세션을 활성화하려면
-
쿠키 만료 기간을 60초로 설정해서 로드 밸런서가 쿠키 고정 정책을 생성하도록 하려면 아래 create-lb-cookie-stickiness-policy 명령을 사용하세요.
aws elb create-lb-cookie-stickiness-policy --load-balancer-namemy-loadbalancer--policy-namemy-duration-cookie-policy--cookie-expiration-period 60 -
지정된 로드 밸런서에서 세션 고정을 활성화하려면 아래 set-load-balancer-policies-of-listener 명령을 사용하세요.
aws elb set-load-balancer-policies-of-listener --load-balancer-namemy-loadbalancer--load-balancer-port443--policy-namesmy-duration-cookie-policy참고
set-load-balancer-policies-of-listener명령은 지정된 로드 밸런서 포트에 연결된 현재의 정책 세트를 대체합니다. 이 명령을 사용할 때마다 활성화할 모든 정책의 목록을 표시하도록--policy-names옵션을 지정합니다. -
(선택 사항) 정책이 활성화되었는지 확인하려면 아래 describe-load-balancers 명령을 사용하세요.
aws elb describe-load-balancers --load-balancer-namemy-loadbalancer응답에는 다음과 같이 지정된 포트의 리스너에 대해 정책이 활성화되었음을 보여주는 정보가 포함되어 있습니다.
{ "LoadBalancerDescriptions": [ { ... "ListenerDescriptions": [ { "Listener": { "InstancePort": 443, "SSLCertificateId": "arn:aws:iam::123456789012:server-certificate/my-server-certificate", "LoadBalancerPort": 443, "Protocol": "HTTPS", "InstanceProtocol": "HTTPS" }, "PolicyNames": [ "my-duration-cookie-policy", "ELBSecurityPolicy-TLS-1-2-2017-01" ] }, ... ], ... "Policies": { "LBCookieStickinessPolicies": [ { "PolicyName": "my-duration-cookie-policy", "CookieExpirationPeriod": 60 } ], "AppCookieStickinessPolicies": [], "OtherPolicies": [ "ELBSecurityPolicy-TLS-1-2-2017-01" ] }, ... } ] }
애플리케이션 제어 세션 고정
로드 밸런서는 특별한 쿠키를 이용하여 최초 요청을 처리한 인스턴스에 세션을 연결하지만, 정책 구성에 지정된 애플리케이션 쿠키의 사용 기간이 적용됩니다. 로드 밸런서는 애플리케이션 응답에 새 애플리케이션 쿠키가 포함되어 있는 경우에만 새 고정 쿠키를 삽입합니다. 로드 밸런서 고정 쿠키는 요청이 있을 때마다 업데이트되지 않습니다. 애플리케이션 쿠키가 명백하게 제거되거나 만료되면 새 애플리케이션 쿠키가 발급될 때까지 세션에서 고정 상태가 중지됩니다.
백엔드 인스턴스에서 설정한 속성(path, port, domain, secure, httponly, discard, max-age, expires, version, comment, commenturl 및 samesite)이 쿠키의 클라이언트로 전송됩니다.
인스턴스가 실패하거나 비정상 상태가 되면 로드 밸런서는 해당 인스턴스로의 요청 라우팅을 중지하고 기존 로드 밸런싱 알고리즘을 기반으로 정상 상태의 인스턴스를 새로 선정합니다. 로드 밸런서는 새로운 정상 상태 인스턴스에 "고정"된 것으로 세션을 처리하고 실패한 인스턴스가 작동을 재개한 경우라도 해당 인스턴스로 계속해서 요청을 라우팅합니다.
콘솔을 사용하여 애플리케이션 제어 세션 고정을 활성화하려면
https://console.aws.amazon.com/ec2/
에서 Amazon EC2 콘솔을 엽니다. -
탐색 창의 Load Balancing 아래에서 로드 밸런서를 선택합니다.
-
로드 밸런서 이름을 선택하여 세부 정보 페이지를 엽니다.
-
리스너 탭에서 리스너 관리를 선택합니다.
-
리스너 관리 페이지에서 업데이트할 리스너를 찾고 쿠키 고정에서 편집을 선택합니다.
-
애플리케이션에서 생성을 선택합니다.
-
[Cookie Name]에 애플리케이션 쿠키의 이름을 입력합니다.
-
변경 사항 저장을 선택합니다.
를 사용하여 애플리케이션 제어 세션 고정을 활성화하려면 AWS CLI
-
로드 밸런서가 쿠키 고정 정책을 생성하도록 하려면 아래 create-app-cookie-stickiness-policy 명령을 사용하세요.
aws elb create-app-cookie-stickiness-policy --load-balancer-namemy-loadbalancer--policy-namemy-app-cookie-policy--cookie-namemy-app-cookie -
로드 밸런서에서 세션 고정을 활성화하려면 아래 set-load-balancer-policies-of-listener 명령을 사용하세요.
aws elb set-load-balancer-policies-of-listener --load-balancer-namemy-loadbalancer--load-balancer-port443--policy-namesmy-app-cookie-policy참고
set-load-balancer-policies-of-listener명령은 지정된 로드 밸런서 포트에 연결된 현재의 정책 세트를 대체합니다. 이 명령을 사용할 때마다 활성화할 모든 정책의 목록을 표시하도록--policy-names옵션을 지정합니다. -
(선택 사항) 고정 정책이 활성화되었는지 확인하려면 아래 describe-load-balancers 명령을 사용하세요.
aws elb describe-load-balancers --load-balancer-namemy-loadbalancer -
응답에는 다음과 같이 지정된 포트의 리스너에 대해 정책이 활성화되었음을 보여주는 정보가 포함되어 있습니다.
{ "LoadBalancerDescriptions": [ { ... "ListenerDescriptions": [ { "Listener": { "InstancePort": 443, "SSLCertificateId": "arn:aws:iam::123456789012:server-certificate/my-server-certificate", "LoadBalancerPort": 443, "Protocol": "HTTPS", "InstanceProtocol": "HTTPS" }, "PolicyNames": [ "my-app-cookie-policy", "ELBSecurityPolicy-TLS-1-2-2017-01" ] }, { "Listener": { "InstancePort": 80, "LoadBalancerPort": 80, "Protocol": "TCP", "InstanceProtocol": "TCP" }, "PolicyNames": [] } ], ... "Policies": { "LBCookieStickinessPolicies": [], "AppCookieStickinessPolicies": [ { "PolicyName": "my-app-cookie-policy", "CookieName": "my-app-cookie" } ], "OtherPolicies": [ "ELBSecurityPolicy-TLS-1-2-2017-01" ] }, ... } ] }