서명된 쿠키 사용 - Amazon CloudFront

서명된 쿠키 사용

현재의 URL을 변경하지 않으려는 경우나 여러 제한된 파일(예: 웹 사이트의 구독자 영역에 있는 전체 파일)에 대한 액세스 권한을 제공하려는 경우, CloudFront 서명된 쿠키를 사용하여 콘텐츠 액세스를 제어할 수 있습니다. 이 주제에서는 서명된 쿠키를 사용할 때 고려해야 할 사항과 미리 준비된 정책 및 사용자 지정 정책을 사용하여 서명된 쿠키를 설정하는 방법을 다룹니다.

서명된 쿠키에 대해 미리 준비된 정책 또는 사용자 지정 정책 사용 결정

서명된 쿠키를 만들 때 JSON 형식의 정책 설명을 작성하여 서명된 쿠키의 제약 조건(예: 쿠키의 유효 기간)을 지정합니다. 미리 준비된 정책 또는 사용자 지정 정책을 사용할 수 있습니다. 다음 테이블은 미리 준비된 정책과 사용자 지정 정책을 비교합니다.

설명 미리 준비된 정책 사용자 정의 정책

정책 설명은 여러 파일에 재사용할 수 있습니다. 정책 설명을 재사용하려면 Resource 객체에 와일드카드 문자를 사용해야 합니다. 자세한 내용은 서명된 쿠키에서 사용자 지정 정책을 위한 정책 설명에서 지정한 값 섹션을 참조하세요.)

아니요

날짜 및 시간을 지정하여 사용자가 콘텐츠에 액세스를 시작할 수 있습니다.

아니요

예(선택 사항)

사용자의 콘텐츠 액세스를 중단할 날짜 및 시간을 지정할 수 있습니다.

콘텐츠에 액세스할 수 있는 사용자의 IP 주소 또는 IP 주소 범위를 지정할 수 있습니다.

아니요

예(선택 사항)

미리 준비된(canned) 정책으로 서명된 쿠키를 만드는 방법에 대한 자세한 내용은 미리 준비된 정책을 사용하여 서명된 쿠키 설정을 참조하십시오.

사용자 지정 정책으로 서명된 쿠키를 만드는 방법에 대한 자세한 내용은 사용자 지정 정책을 사용하여 서명된 쿠키 설정을 참조하십시오.

서명된 쿠키 작동 방식

서명된 쿠키에 대한 CloudFront 구성 방법과 사용자가 서명된 쿠키를 포함한 요청을 제출할 때 CloudFront 반응에 대한 개요가 있습니다.

  1. CloudFront 배포에서 CloudFront가 URL 서명을 확인하는 데 사용할 수 있는 퍼블릭 키가 포함된 신뢰할 수 있는 키 그룹을 하나 이상 지정합니다. 해당 프라이빗 키를 사용하여 URL에 서명합니다.

    자세한 내용은 서명된 URL 및 서명된 쿠키를 생성할 수 있는 서명자 지정 단원을 참조하십시오.

  2. 사용자가 콘텐츠에 액세스해야 하는지 여부를 파악하고, 필요하면 최종 사용자에게 Set-Cookie 헤더 세 개를 보내도록 애플리케이션을 개발합니다. (각 Set-Cookie 헤더는 이름-값 페어를 하나만 포함할 수 있고 CloudFront 서명된 쿠키에는 이름-값 페어 3개가 필요합니다.) 최종 사용자가 프라이빗 콘텐츠를 요청하기 전에 Set-Cookie 헤더를 최종 사용자에게 보내야 합니다. 쿠키의 만료 시간을 짧게 설정한 경우, 사용자가 계속 액세스할 수 있도록 후속 요청에 대해 Set-Cookie 헤더 세 개를 더 보낼 수 있습니다.

    일반적으로 CloudFront 배포에는 캐시 동작이 2개 이상 있는데 하나는 인증이 필요 없고 다른 하나는 필요합니다. 사이트 보안에 대한 오류 페이지에는 로그인 페이지로 가는 리디렉터 또는 링크가 있습니다.

    쿠키를 기반으로 파일을 캐시하도록 배포를 구성하는 경우, CloudFront는 서명된 쿠키의 속성을 기반으로 별도의 파일을 캐시하지 않습니다.

  3. 사용자가 웹 사이트에 로그인하여 콘텐츠에 대한 비용을 지불하거나 액세스에 필요한 자격 요건을 충족합니다.

  4. 애플리케이션은 응답을 통해 Set-Cookie 헤더를 반환하고 최종 사용자는 이름-값 페어를 저장합니다.

  5. 사용자가 파일을 요청합니다.

    사용자의 브라우저 또는 기타 최종 사용자는 4단계의 이름-값 페어를 불러와서 이를 Cookie 헤더의 요청에 추가합니다. 이것이 서명된 쿠키입니다.

  6. CloudFront는 퍼블릭 키를 사용하여 서명된 쿠키의 서명을 확인하고 쿠키가 아직 변조되지 않았음을 확인합니다. 유효하지 않은 서명인 경우 요청을 거부합니다.

    쿠키의 서명이 유효한 경우, CloudFront는 쿠키의 정책 설명을 보거나 미리 준비된(canned) 정책을 사용하는 경우, 정책 설명을 구성하여 요청이 아직 유효함을 확인합니다. 예를 들어, 쿠키의 시작 및 종료 날짜와 시간을 지정하는 경우, CloudFront는 액세스가 허용된 시간 동안 콘텐츠 액세스를 시도한 사용자를 확인합니다.

    요청이 정책 설명의 요구 사항을 충족하는 경우, CloudFront는 제한되지 않은 콘텐츠와 같은 방식으로 콘텐츠를 제공합니다. 다시 말해 파일이 이미 엣지 캐시에 있는지 여부를 판단하고, 필요에 따라 요청을 오리진으로 전달하고, 사용자에게 파일을 반환합니다.

Domain 헤더에 Set-Cookie 파라미터를 지정할 때는 루트 도메인 이름을 가진 사용자의 액세스 가능성을 줄이도록 최대한 정확한 값을 지정하십시오. 예를 들자면 example.com보다 app.example.com이 더 좋고, example.com을 제어하지 않을 때는 특히 그렇습니다. 이렇게 하면 www.example.com을 통한 콘텐츠 액세스를 방지할 수 있습니다.

이런 유형의 공격을 방지하려면 다음을 수행하세요.

  • ExpiresMax-Age 쿠키 속성을 제외하여 Set-Cookie 헤더에서 세션 쿠키를 만들도록 합니다. 세션 쿠키는 사용자가 브라우저를 닫을 때 자동으로 삭제되며, 따라서 권한 없는 제3자가 콘텐츠에 액세스할 가능성을 줄여 줍니다.

  • Secure 속성을 포함하여 최종 사용자가 이를 요청할 때 쿠키가 암호화되도록 하세요.

  • 가능하면 사용자 지정 정책을 사용하고 최종 사용자의 IP 주소를 포함합니다.

  • CloudFront-Expires 속성에서 사용자의 콘텐츠 액세스를 허용할 기간을 기준으로 하여 가장 짧고 합리적인 만료 시간을 지정하세요.

CloudFront는 서명된 쿠키가 아직 유효한지 파악하기 위해 HTTP 요청 시 쿠키의 만료 날짜 및 시간을 확인합니다. 클라이언트가 만료 시간 직전에 대용량 파일을 다운로드하기 시작한 경우, 다운로드 도중 만료 시간이 지나도 다운로드는 완료됩니다. TCP 연결이 끊어진 경우, 클라이언트가 만료 시간 이후에 다운로드를 다시 시작하는 것은 불가능합니다.

클라이언트가 범위 GET을 사용하여 파일을 작은 조각으로 가져오는 경우, 만료 시간 이후의 GET 요청은 실패합니다. 범위 GET에 대한 자세한 내용은 CloudFront에서 객체에 대한 부분적인 요청을 처리하는 방법(범위 GET)을 참조하십시오.

샘플 코드 및 타사 도구

프라이빗 콘텐츠에 대한 샘플 코드는 서명된 URL에 대한 서명을 만드는 방법만 보여줍니다. 그러나 서명된 쿠키에 대한 서명 생성 프로세스도 이와 유사하기 때문에 대부분의 샘플 코드는 여전히 관계가 있습니다. 자세한 정보는 다음 주제를 참조하세요.