사전 서명 URL로 객체 다운로드·업로드하기

사전 서명 URL로 객체 다운로드·업로드하기

버킷 정책을 업데이트하지 않고도 객체에 대한 시간 제한 액세스를 부여하고 싶을 때 사전 서명 URL(presigned URL) 을 사용할 수 있어요. 사전 서명 URL은 브라우저에 입력하거나 프로그램에서 사용해 객체를 다운로드할 수 있어요. 사전 서명 URL이 사용하는 자격 증명은 그 URL을 생성한 AWS Identity and Access Management(IAM) 보안 주체(principal)의 자격 증명이에요.

또한 사전 서명 URL을 사용해 다른 사람이 특정 객체를 여러분의 S3 버킷에 업로드하도록 허용할 수도 있어요. 이렇게 하면 상대방이 AWS 보안 자격 증명이나 권한을 가지지 않아도 업로드할 수 있어요. 사전 서명 URL에 지정된 것과 같은 키의 객체가 이미 버킷에 존재한다면 Amazon S3는 기존 객체를 업로드된 객체로 대체해요.

사전 서명 URL은 만료 날짜와 시각까지 여러 번 사용할 수 있어요.

주석(annotation) API 작업(PutObjectAnnotation, GetObjectAnnotation, ListObjectAnnotations, DeleteObjectAnnotation)은 사전 서명 URL을 지원해요.

사전 서명 URL을 만들 때는 보안 자격 증명을 제공한 다음 다음을 지정해야 해요.

  • Amazon S3 버킷
  • 객체 키(다운로드의 경우 이 객체가 S3 버킷에 있고, 업로드의 경우 업로드할 파일 이름)
  • HTTP 메서드(객체 다운로드에는 GET, 업로드에는 PUT, 객체 메타데이터 읽기에는 HEAD 등)
  • 만료 시간 간격

사전 서명 URL로 객체를 업로드할 때 체크섬으로 객체 무결성을 검증할 수 있어요. AWS Signature Version 2로 만든 사전 서명 URL은 MD5 체크섬만 지원하지만, AWS Signature Version 4로 만든 사전 서명 URL은 CRC-64/NVME, CRC32, CRC32C, SHA-1, SHA-256, MD5, XXHash64, XXHash3, XXHash128, SHA-512를 포함한 추가 체크섬 알고리즘을 지원해요. 이 추가 체크섬 알고리즘을 사용하려면 AWS Signature Version 4를 사용하고 업로드 요청에 적절한 체크섬 헤더를 포함해야 해요. 객체 무결성에 대한 자세한 내용은 Amazon S3에서 객체 무결성 확인하기를 참고하세요.

출처: 문서

본문

사전 서명 URL을 만들 수 있는 사람

유효한 보안 자격 증명이 있는 사람이라면 누구나 사전 서명 URL을 만들 수 있어요. 하지만 누군가 객체에 성공적으로 액세스하려면, 사전 서명 URL이 기반이 되는 작업을 수행할 권한이 있는 사람이 그 URL을 만들어야 해요.

사전 서명 URL을 만드는 데 사용할 수 있는 자격 증명 유형은 다음과 같아요.

  • IAM 사용자 – AWS Signature Version 4를 사용할 때 최대 7일간 유효해요. 최대 7일간 유효한 사전 서명 URL을 만들려면 먼저 IAM 사용자 자격 증명(액세스 키와 시크릿 키)을 사전 서명 URL을 만드는 데 사용하는 메서드에 위임해야 해요.
  • 임시 보안 자격 증명 – 자격 증명 자체보다 더 오래 유효할 수 없어요. 이 자격 증명에는 다음이 포함돼요.
    • IAM 역할 자격 증명 – 더 긴 만료 시간을 지정해도 역할 세션이 만료되면 사전 서명 URL이 만료돼요.
    • Amazon EC2 인스턴스가 사용하는 IAM 역할 자격 증명 – 역할 자격 증명 기간(보통 6시간) 동안 유효해요.
    • AWS Security Token Service 자격 증명 – 임시 자격 증명 기간 동안에만 유효해요.

참고

임시 자격 증명으로 사전 서명 URL을 만들었다면 자격 증명이 만료될 때 URL도 만료돼요. 일반적으로 사전 서명 URL은 그것을 만드는 데 사용한 자격 증명이 철회, 삭제, 또는 비활성화될 때 만료돼요. 심지어 URL이 더 나중의 만료 시간으로 만들어졌더라도 그렇지요. 임시 보안 자격 증명 수명에 대해서는 _IAM User Guide_의 AWS STS API 작업 비교를 참고하세요.

사전 서명 URL의 만료 시간

사전 서명 URL은 URL이 생성될 때 지정된 기간 동안 유효해요. Amazon S3 콘솔로 사전 서명 URL을 만들면 만료 시간을 1분에서 12시간 사이로 설정할 수 있어요. AWS CLI 또는 AWS SDK를 사용하면 만료 시간을 최대 7일까지 설정할 수 있어요.

임시 토큰으로 사전 서명 URL을 만들었다면 토큰이 만료될 때 URL도 만료돼요. 일반적으로 사전 서명 URL은 그것을 만드는 데 사용한 자격 증명이 철회, 삭제, 또는 비활성화될 때 만료돼요. URL이 더 나중의 만료 시간으로 만들어졌더라도 그렇지요. 사용하는 자격 증명이 만료 시간에 미치는 영향에 대한 자세한 내용은 "사전 서명 URL을 만들 수 있는 사람"을 참고하세요.

Amazon S3는 HTTP 요청 시점에 서명된 URL의 만료 날짜와 시각을 확인해요. 예를 들어 클라이언트가 만료 시간 직전에 대용량 파일 다운로드를 시작하면, 다운로드 중에 만료 시간이 지나도 다운로드는 계속돼요. 하지만 연결이 끊기고 클라이언트가 만료 시간이 지난 뒤에 다운로드를 다시 시작하려고 하면 다운로드는 실패해요.

사전 서명 URL 기능 제한하기

사전 서명 URL의 기능은 그것을 만든 사용자의 권한에 의해 제한돼요. 본질적으로 사전 서명 URL은 그것을 가진 사람에게 액세스를 부여하는 베어러 토큰(bearer token)이에요. 따라서 적절히 보호할 것을 권장해요. 사전 서명 URL의 사용을 제한하는 방법은 다음과 같아요.

AWS Signature Version 4 (SigV4)

사전 서명 URL 요청이 AWS Signature Version 4(SigV4)로 인증될 때 특정 동작을 강제하려면 버킷 정책과 액세스 포인트 정책에서 조건 키를 사용할 수 있어요. 예를 들어 다음 버킷 정책은 s3:signatureAge 조건을 사용해 서명이 10분보다 오래된 경우 amzn-s3-demo-bucket 버킷의 객체에 대한 Amazon S3 사전 서명 URL 요청을 모두 거부해요. 이 예시를 사용하려면 user input placeholders를 여러분의 정보로 바꾸세요.

{
    "Version":"2012-10-17",
    "Statement": [
        {
            "Sid": "Deny a presigned URL request if the signature is more than 10 min old",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "NumericGreaterThan": {
                    "s3:signatureAge": "600000"
                }
            }
        }
    ]
}

AWS Signature Version 4와 관련된 정책 키에 대한 자세한 내용은 _Amazon Simple Storage Service API Reference_의 AWS Signature Version 4 인증을 참고하세요.

네트워크 경로 제한

사전 서명 URL과 모든 Amazon S3 액세스를 특정 네트워크 경로로 제한하려면 AWS Identity and Access Management(IAM) 정책을 작성할 수 있어요. 이 정책은 호출을 수행하는 IAM 보안 주체, Amazon S3 버킷, 또는 둘 다에 설정할 수 있어요.

IAM 보안 주체에 대한 네트워크 경로 제한은 그 자격 증명을 사용하는 사용자가 지정된 네트워크에서 요청하도록 요구해요. 버킷이나 액세스 포인트에 대한 제한은 해당 리소스에 대한 모든 요청이 지정된 네트워크에서 시작되도록 요구해요. 이런 제한은 사전 서명 URL 시나리오 밖에서도 적용돼요.

사용하는 IAM 글로벌 조건 키는 엔드포인트 유형에 따라 달라져요. Amazon S3의 공개 엔드포인트를 사용한다면 aws:SourceIp를 사용하세요. Amazon S3에 대한 가상 사설 클라우드(VPC) 엔드포인트를 사용한다면 aws:SourceVpc 또는 aws:SourceVpce를 사용하세요.

다음 IAM 정책 문은 보안 주체가 지정된 네트워크 범위에서만 AWS에 액세스하도록 요구해요. 이 정책 문을 사용하면 모든 액세스가 그 범위에서 시작되어야 해요. Amazon S3에 사전 서명 URL을 사용하는 사람의 경우도 포함돼요. 이 예시를 사용하려면 user input placeholders를 여러분의 정보로 바꾸세요.

{
    "Sid": "NetworkRestrictionForIAMPrincipal",
    "Effect": "Deny",
    "Action": "*",
    "Resource": "*",
    "Condition": {
        "NotIpAddressIfExists": {"aws:SourceIp": "IP-address-range"},
        "BoolIfExists": {"aws:ViaAWSService": "false"}
    }
}

사전 서명 URL 자주 묻는 질문

Q: 사전 서명 URL이 구성된 만료 시간보다 일찍 만료되는 이유는 무엇인가요?

사전 서명 URL은 그 기반이 되는 자격 증명이 유효한 동안에만 유효해요. 사전 서명 URL은 구성된 만료 시간이나 연결된 자격 증명이 만료되는 시점 중 먼저 오는 쪽에 만료돼요. Amazon Elastic Container Service 작업이나 컨테이너의 경우 역할 자격 증명은 보통 1~6시간마다 교체돼요. AWS Security Token Service(AWS STS) AssumeRole을 사용할 때는 역할 세션이 끝날 때(기본적으로 1시간) 사전 서명 URL이 만료돼요. Amazon EC2 인스턴스 프로필의 경우 메타데이터 자격 증명이 약 6시간의 최대 유효 기간을 두고 주기적으로 교체돼요.

Q: 사전 서명 URL에 액세스할 때 403 Forbidden 오류가 나는 이유는 무엇인가요?

사전 서명 URL을 생성하기 전에 올바른 권한이 구성되었는지 확인하세요. URL을 생성하는 IAM 사용자나 역할은 특정 작업에 대해 s3:GetObject 같은 필수 권한을 가지고 있어야 해요. 또한 Amazon S3 버킷 정책이 객체에 대한 액세스를 명시적으로 거부하지 않는지 확인하세요.

Q: HeadersNotSigned: if-range와 함께 AccessDenied 오류가 나는 이유는 무엇인가요?

Range가 X-Amz-SignedHeaders에 포함되면 Amazon S3는 요청에 If-Range가 있으면 그것도 서명하도록 요구해요. 사전 서명 URL을 생성할 때 If-Range를 X-Amz-SignedHeaders에 추가하세요.

Q: SignatureDoesNotMatch 오류가 나요. 어떻게 고치나요?

Amazon S3 사전 서명 URL을 사용할 때 SignatureDoesNotMatch 오류가 발생하면 몇 가지 일반적인 원인을 고려해 보세요. 먼저 시스템 시계가 Network Time Protocol(NTP) 서버와 동기화되어 있는지 확인하세요. 아주 작은 시간 차이도 서명을 무효화할 수 있기 때문이에요. 다음으로 일부 회사 프록시는 헤더나 쿼리 문자열을 수정해 서명 불일치를 일으킬 수 있다는 점을 알아두세요. 문제 해결을 위해 프록시 없이 테스트해 보세요. 마지막으로 HTTP 메서드, 헤더, 쿼리 문자열을 포함한 모든 요청 매개변수가 URL 생성과 사용 사이에서 정확히 일치하는지 확인하세요. 이런 문제를 해결하면 SignatureDoesNotMatch 오류를 해결할 수 있는 경우가 많아요.

Q: ExpiredToken 오류가 나요. 어떻게 해야 하나요?

사전 서명 URL을 사용할 때 ExpiredToken 오류를 받으면 URL을 생성하는 데 사용된 AWS 자격 증명이 더 이상 유효하지 않다는 뜻이에요. 이 문제를 해결하려면 새 사전 서명 URL을 생성하기 전에 AWS 자격 증명을 새로고침하세요. 장기 실행 애플리케이션에서는 지속적인 액세스를 유지하도록 자격 증명 새로고침 로직을 구현할 것을 권장해요. 적절한 경우 더 오래 지속되는 자격 증명을 사용하거나 토큰 새로고침 메커니즘을 구현할 수 있어요. AWS Security Token Service(AWS STS) AssumeRole을 사용한다면 구성된 세션 기간이 사용 사례 요구 사항을 충족하는지 확인하세요. 사전 서명 URL은 기반이 되는 자격 증명의 기간 동안에만 유효하므로, 적절한 자격 증명 관리 구현이 필수적이라는 것을 기억하세요.

더 알아보기 (Learn more)