본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

세션 어피니티

원문 보기 위키 갱신

세션 어피니티 (Session affinity)

세션 어피니티를 활성화하면 로드 밸런서가 특정 최종 사용자의 모든 요청을 특정 엔드포인트로 보내요. 이 연속성은 요청이 여러 서버에 분산된다면 잃어버릴 수 있는 사용자 세션 정보(예: 장바구니 항목)를 보존해 줘요. 이 문서는 세션 어피니티의 유형과 활성화 방법을 안내해요.

출처: 문서

본문

세션 어피니티를 활성화하면 로드 밸런서가 특정 최종 사용자의 모든 요청을 특정 엔드포인트로 보내요. 이 연속성은 요청이 여러 서버에 분산될 경우 잃어버릴 수 있는 사용자 세션 정보(예: 장바구니 항목)를 보존해 줘요.

세션 어피니티는 네트워크 요청을 줄이는 데도 도움이 되어, 사용량 기반 요금을 쓰는 고객에게 비용 절감 효과를 줄 수 있어요.

참고

세션 어피니티는 공용 로드 밸런서(Public Load Balancers)에서만 지원돼요.

유형 (Types)

세션 어피니티는 "none" 또는 ""(기본값)으로 지정하지 않는 한 로드 밸런서가 사용해야 할 세션 어피니티 유형을 지정해요.

프록시된 로드 밸런서에 대한 첫 번째 요청에서 요청이 전달될 엔드포인트의 정보를 인코딩하는 쿠키가 생성돼요. 동일한 클라이언트가 동일한 로드 밸런서에 보내는 후속 요청은 쿠키 기간 동안 그리고 엔드포인트가 건강한 상태인 한 쿠키가 인코딩하는 엔드포인트로 전송돼요. 쿠키가 만료되거나 엔드포인트가 비정상이 되면 새 엔드포인트가 계산되어 사용돼요.

어떻게 동작하나요?

세션 어피니티는 동일한 클라이언트의 요청을 동일한 엔드포인트로 자동으로 보내요:

  1. 클라이언트가 첫 번째 요청을 하면 Cloudflare는 클라이언트에 __cflb 쿠키를 설정해요(연결된 엔드포인트를 추적하기 위해).
  2. 동일한 클라이언트의 후속 요청은 쿠키 기간 동안, 그리고 엔드포인트가 건강한 상태인 한 그 엔드포인트로 전달돼요.
  3. 쿠키가 만료되거나 엔드포인트가 비정상이 되면 Cloudflare는 새 장애 조치 엔드포인트를 추적하는 새 쿠키를 설정해요.
    flowchart LR
      accTitle: Session affinity process
      accDescr: Session affinity directs requests from the same client to the same server.
     A[Client] --Request--> B{<code>__cflb</code> cookie set?}
     B -->|Yes| C[Route to previous endpoint]
     C --> O2
     B ---->|No| E[Follow normal routing]
     E --> O2
     E --Set <code>__cflb</code> cookie--> A
     subgraph P1 [Pool 1]
        O1[Endpoint 1]
        O2[Endpoint 2]
     end

모든 쿠키 기반 세션은 사용자 지정 세션 Time to live(TTL)를 설정하지 않는 한 기본적으로 23시간 동안 지속돼요.

Always Use HTTPS가 활성화되면 세션 쿠키는 안전(secure)해져요. 또한 사이트 간 스크립팅 공격을 방지하기 위해 쿠키에는 항상 HttpOnly가 활성화돼요.

이는 cookie와 유사하게 동작하지만 초기 엔드포인트 선택이 안정적이고 클라이언트의 IP 주소를 기반으로 해요.

HTTP 헤더 사용 (By HTTP header)

프록시된 로드 밸런서에 대한 첫 번째 요청에서 구성된 HTTP 헤더를 기반으로 세션 키가 생성돼요. 세션 키는 로드 밸런서 세션 상태 동안 요청이 전달될 엔드포인트를 저장하는 데 사용되는 요청 헤더를 인코딩해요. 동일한 헤더를 가진 로드 밸런서에 대한 후속 요청은 세션 기간 동안, 그리고 엔드포인트가 건강한 상태인 한 동일한 엔드포인트로 전송돼요. 세션이 세션 어피니티 TTL(초) 동안 유휴 상태였거나 엔드포인트가 비정상이면 새 엔드포인트가 계산되어 사용돼요.

참고

HTTP 헤더 기반 세션 어피니티에서는 Sticky Zero-Downtime Failover가 지원되지 않아요.

헤더 사용 방식 제어하기

기본적으로 HTTP 헤더 기반 세션 어피니티를 위해 구성한 HTTP 헤더 중 하나 이상이 로드 밸런서로 보내는 요청에 존재해야 헤더 기반 세션이 생성돼요. 클라이언트가 요청에서 HTTP 헤더를 추가하거나 제거하고 이미 세션을 수립했다면, 구성에 지정된 후속 요청에서 발견된 새 HTTP 헤더를 기반으로 새 세션이 생성돼요.

세션 생성을 위해 구성한 모든 HTTP 헤더가 요청에 존재하도록 요구하고 싶다면, Cloudflare API를 통해 session_affinity_attributes.require_all_headers를 true로 설정하거나, 로드 밸런서를 편집할 때 Cloudflare 대시보드에서 Require all headers를 enabled로 토글하세요.


Cloudflare 대시보드에서 세션 어피니티 활성화

로드 밸런서를 만들거나 편집할 때 Hostname 단계에서 세션 어피니티를 활성화해요.

세션 어피니티를 활성화하면 다음 옵션 중 하나를 선택해요:

  • By Cloudflare cookie only: 연결된 엔드포인트를 추적하는 __cflb 쿠키를 설정해요.
  • By Cloudflare cookie and Client IP fallback: __cflb 쿠키를 설정하지만, 세션 어피니티 쿠키가 제공되지 않을 때는 클라이언트 IP 주소도 사용해요.
  • By HTTP header.

중요

세션 어피니티는 DNS-only 모드 (회색 구름)에서 지원되지 않아요. 대신 DNS persistence를 사용할 수 있어요.


Cloudflare API를 통해 세션 어피니티 활성화

세션 어피니티는 로드 밸런서의 속성이며, 다음 엔드포인트로 설정할 수 있어요:

session_affinity, session_affinity_ttl, session_affinity_attributes 파라미터를 사용해 세션 어피니티의 동작을 사용자 지정해요.

HTTP 헤더 기반 세션 어피니티를 활성화하려면 session_affinity 값을 header로 설정하고 HTTP 헤더 이름을 session_affinity_attributes.headers에 추가해요.

API 명령에 대한 자세한 내용은 API로 로드 밸런서 만들기를 참고하세요.


엔드포인트 드레인 (Endpoint Drain)

엔드포인트 드레인을 사용하면 활성 고객에게 영향을 주지 않고 엔드포인트에서 모든 트래픽을 드레인하거나 제거할 수 있어요. 엔드포인트 드레인에 대한 자세한 내용은 계획된 유지보수 수행을 참고하세요.

중요

엔드포인트 드레인은 DNS-only 모드 (회색 구름)의 로드 밸런서에서 지원되지 않아요.

제로 다운타임 장애 조치 (Zero-Downtime Failover)

제로 다운타임 장애 조치는 일시적인 네트워크 문제 중에 풀 내의 엔드포인트로 트래픽을 자동으로 보내줘요. 이는 활성 상태 모니터 사이에 문제가 발생할 때 사용자에게 표시되는 오류를 줄이는 데 도움을 줘요.

세 가지 옵션 중 하나를 활성화할 수 있어요:

  • None: 장애 조치가 발생하지 않으며 사용자에게 오류가 표시될 수 있어요.
  • Temporary: 원래 고정(pin)된 엔드포인트를 사용할 수 있게 될 때까지 트래픽이 다른 엔드포인트로 전송돼요.
  • Sticky: 세션 어피니티 쿠키가 업데이트되고, 필요에 따라 이후 요청이 새 엔드포인트로 전송돼요.

참고

HTTP 헤더 기반 세션 어피니티에서는 Sticky Zero-Downtime Failover가 지원되지 않아요.

더 알아보기 (Learn more)

로드 밸런싱의 트래픽 스티어링과 프록시 모드에 대해 더 알아보려면 관련 개념 문서를 참고하세요.