CloudFront에서 서명된 URL 또는 서명된 쿠키와 관련된 문제를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 6월 2일

Amazon CloudFront와 서명된 URL 또는 서명된 쿠키를 사용하여 프라이빗 콘텐츠를 보호하고 있습니다. 그런데 403 액세스 거부 오류가 표시됩니다. 이 오류를 해결하려면 어떻게 해야 합니까?

간략한 설명

서명된 URL 또는 서명된 쿠키에 문제가 있는 경우 Amazon CloudFront에서 403 액세스 거부 오류를 반환할 수도 있습니다. 이 오류의 원인 및 문제 해결 단계는 다음 해결 방법 섹션을 참조하세요.

해결 방법

동작에서 뷰어 액세스 제한을 활성화하면 서명자를 결정해야 합니다. 서명자는 CloudFront에서 생성하는 신뢰할 수 있는 키 그룹이거나 CloudFront 키 페어가 포함된 AWS 계정입니다. 다음 403 오류 메시지는 서명자 정보가 누락되었거나 잘못되었음을 나타냅니다.

"Key-Pair-Id 쿼리 파라미터 또는 쿠키 값이 누락되었습니다."라는 메세지의 403 액세스 거부 오류

이 메시지는 쿼리 문자열 파라미터 Key-Pair-ID가 서명된 URL에 없거나 비어 있음을 나타냅니다.

"Key-Pair-Id 쿼리 파라미터 또는 쿠키 값이 누락되었습니다."라는 메세지의 403 액세스 거부 오류

이 메시지는 쿼리 문자열 파라미터 CloudFront-Key-Pair-ID가 서명된 쿠키에 없거나 비어 있음을 나타냅니다.

"알 수 없는 키입니다."라는 메시지의 403 액세스 거부 오류

이 메시지는 CloudFront가 Key-Pair-ID(서명된 URL의 경우) 또는 CloudFront-Key-Pair-ID(서명된 쿠키의 경우)를 통해 서명자 정보를 확인할 수 없음을 나타냅니다. 이 문제를 해결하려면 Key-Pair-ID 값이 올바른지 확인합니다. 서명된 URL 또는 서명된 쿠키의 CloudFront-Key-Pair-ID에 사용됩니다. 먼저

서명된 URL을 사용하는 경우 Key-Pair-ID의 값을 찾아 기록해 둡니다.
-또는-
서명된 쿠키를 사용하는 경우 CloudFront-Key-Pair-ID의 값을 찾아 기록해 둡니다.

그런 다음 Key ID를 찾아 Key-Pair-ID 또는 CloudFront-Key-Pair-ID와 일치하는지 확인합니다.

  1. CloudFront 콘솔을 엽니다. 왼쪽 탐색 메뉴에서 배포를 선택합니다.
  2. 해당 배포를 선택합니다. 그런 다음 동작 탭을 선택합니다.
  3. 동작 이름을 선택한 다음 편집을 선택합니다.
  4. 뷰어 액세스 제한 설정을 찾습니다.
    참고: 로 설정된 경우 이 캐시 동작의 경로 패턴과 일치하는 파일에 대한 요청은 서명된 URL 또는 서명된 쿠키를 사용해야 합니다.
  5. 보기 액세스 제한 필드가 로 설정되었는지 확인한 후 신뢰할 수 있는 인증 유형 필드를 확인합니다.
  6. 신뢰할 수 있는 인증 유형의 설정 값이 신뢰할 수 있는 키 그룹인 경우 신뢰 키 그룹의 이름을 기록해 둡니다.
    그런 다음 신뢰 키 그룹의 퍼블릭 키 ID를 찾은 다음 CloudFront 콘솔로 돌아갑니다. 키 그룹을 선택합니다. 키 그룹 목록에서 기록해 놓은 신뢰할 수 있는 키 그룹의 이름을 선택합니다.
    1단계에서 기록한 Key-Pair-Id 또는 CloudFront-Key-Pair-Id의 값이 신뢰할 수 있는 키 그룹의 퍼블릭 키 ID 중 하나와 일치하는지 확인합니다.
  7. 신뢰할 수 있는 권한 부여 유형의 값이 신뢰할 수 있는 서명자인 경우 AWS에서 생성한 CloudFront 보안 인증이 사용됩니다. 이 경우 1단계에서 기록한 Key-Pair-Id 또는 CloudFront-Key-Pair-Id의 값이 CloudFront 보안 인증의 액세스 키 ID와 일치해야 합니다.
    CloudFront 보안 인증의 액세스 키 ID를 찾으려면 서명자에 대한 키 페어 생성 단원을 참조하세요.

서명된 URL 또는 서명된 쿠키를 생성할 때 JSON 형식의 정책 설명에서 서명된 URL에 대한 제한을 지정합니다. 이 명령문은 URL의 유효 기간을 결정합니다. CloudFront는 다음과 같은 경우 403 액세스 거부 오류를 반환합니다.

  • 서명된 URL은 준비된 정책을 사용하여 서명된 URL에서 Expires 값보다 큰 시간에 전송됩니다.
  • 서명된 쿠키는 준비된 정책을 사용하여 서명된 쿠키에서 CloudFront-Expires 값보다 큰 시간에 전송됩니다.
  • 서명된 URL 또는 서명된 쿠키는 사용자 지정 정책에서 DateLessThan 값보다 크거나 DateGreaterThan 값보다 작은 시간에 전송됩니다.

참고: Expires, CloudFront-Expires, DateLessThan, DateGreaterThan 값은 Unix 시간 형식(초 단위) 및 협정 세계시(UTC)로 표시됩니다. 예를 들어 2013년 1월 1일 오전 10시 UTC는 Unix 시간 형식인 1357034400으로 변환됩니다. Epoch 시간을 사용하는 경우 2147483647(2038년 1월 19일 UTC 03:14:07) 이전의 날짜에 32비트 정수를 사용합니다.

서명된 URL의 Policy 파라미터 또는 서명된 쿠키의 CloudFront-Policy 속성은 사용자 지정 정책이 사용됨을 나타냅니다. 정책 설명은 JSON 형식이며 base64로 인코딩되어 있습니다. DateLessThan 또는 DateGreaterThan의 값을 확인하려면 64base 디코딩 명령을 사용합니다.

base64 인코딩 사용자 지정 정책의 예는 다음과 같습니다.

eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__

다음 Linux 명령을 사용하여 base64로 인코딩된 형식의 사용자 지정 정책을 JSON 형식으로 디코딩합니다. 이 예제에서는 이전 예제의 값을 사용합니다. 사용자 지정 정책으로 교체합니다.

$ echo -n eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__ | base64 -di

명령의 출력은 다음과 유사합니다.

{ "Statement": [{ "Resource": "http://d111111abcdef8.cloudfront.net/game_download.zip", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.0/24" }, "DateLessThan": { "AWS:EpochTime": 1426500000 } } }] }

준비된 정책 또는 사용자 지정 정책에 둘 이상의 문이 포함된 경우 CloudFront는 403 액세스 거부 오류를 반환합니다.

문제를 해결하려면 이전 섹션의 Linux 명령을 사용하여 사용자 지정 정책 설명을 확인합니다. 코드 세부 정보를 확인하고 준비된 정책 또는 사용자 지정 정책에 하나의 명령문만 포함되어 있는지 확인합니다.

다음과 같은 경우 CloudFront에서 403 액세스 거부 오류를 반환합니다.

  • 정책 설명의 키 리소스에 있는 기본 URL에는 축약된 URL(www.example.com)이 있습니다. 전체 URL(http://www.example.com)을 사용하십시오.
  • 기본 URL에는 UTF-8 문자 인코딩이 없습니다.
  • 기본 URL에 모든 문장 부호와 파라미터 이름이 포함되는 것은 아닙니다.
  • 기본 URL의 HTTP 또는 HTTPS 프로토콜이 서명된 URL 또는 서명된 쿠키를 보내는 요청에 사용된 프로토콜과 일치하지 않습니다.
  • 기본 URL의 도메인 이름이 서명된 URL 또는 서명된 쿠키를 보내는 사용자 에이전트가 사용하는 Host 헤더의 값과 일치하지 않습니다.
  • 기본 URL 쿼리 문자열에 유효하지 않은 문자가 포함되어 있습니다.

다음과 같은 경우 CloudFront에서 403 액세스 거부 오류를 반환합니다.

  • 정책 설명에는 공백(탭 및 줄 바꿈 문자 포함)이 포함됩니다.
  • 준비된 정책 또는 사용자 지정 정책은 해시되기 전에 문자열로 형식이 지정되지 않았습니다. AWS SDK를 사용하지 않고 서명된 URL 또는 서명된 쿠키를 생성하는 경우 이러한 상황이 발생할 수 있습니다.
  • 서명을 생성하기 전에는 정책이 해시되지 않았습니다. AWS SDK를 사용하지 않고 서명된 URL 또는 서명된 쿠키를 생성하는 중인 경우 이러한 상황이 발생할 수 있습니다.

서명된 URL 또는 서명된 쿠키를 사용할 때의 서명 모범 사례는 서명된 URL의 서명을 생성하기 위한 코드 예제를 참조하세요.

다음과 같은 경우 CloudFront에서 403 액세스 거부 오류를 반환합니다.

  • 서명된 URL 또는 서명된 쿠키가 IPv6 IP 주소에서 전송되었습니다.
  • 서명된 URL 또는 서명된 쿠키가 사용자 지정 정책에 지정된 IPv4 주소 또는 IPv4 IP 범위에서 전송되지 않았습니다.

IpAddress는 서명된 URL 또는 서명된 쿠키의 사용자 지정 정책에서만 사용할 수 있습니다. IPv6 형식의 IP 주소는 지원되지 않습니다. IpAddress를 포함하는 사용자 지정 정책을 사용하는 경우 배포에 IPv6을 사용하지 마십시오.

CloudFront에서 쿠키가 반환되었지만 동일한 도메인에 대한 후속 요청에 포함되지 않은 경우 CloudFront는 403 액세스 거부 오류를 반환합니다. 이 경우 Set-Cookie 응답 헤더에서 쿠키 속성 도메인경로를 확인합니다.

도메인 값은 요청된 파일의 도메인 이름입니다. 도메인 속성을 지정하지 않는 경우 기본값은 URL의 도메인 이름입니다. 이는 지정된 도메인 이름에만 적용되며 하위 도메인에는 적용되지 않습니다. 도메인 속성을 지정하면 하위 도메인에도 적용됩니다.

도메인 속성을 지정하는 경우 URL의 도메인 이름과 도메인 속성의 값이 일치해야 합니다. CloudFront가 배포에 할당하는 도메인 이름(예: d111111abcdef8.cloudfront.net)을 지정할 수 있지만 도메인 이름으로 *.cloudfront.net을 지정할 수는 없습니다. URL에 대체 도메인 이름(예: example.com)을 사용하려면 배포에 대체 도메인 이름을 추가합니다.

경로 값은 요청된 파일의 경로입니다. 경로 속성을 지정하지 않는 경우 기본값은 URL의 경로입니다.


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?