Summary#
서명 URL 업로드의 실패 모드는 URL의 유효기간, 서명 당시와 실제 요청의 일치 여부, 재시도 시 동일 키에 다시 쓰는 동작으로 나뉜다. S3의 일반적인 presigned PUT은 같은 키의 객체를 덮어쓸 수 있으므로, 서명 URL 자체를 일회성 업로드 보장으로 취급해서는 안 된다. (docs.aws.amazon.com)
Key Points#
- 만료·시계 오차: S3 서명 URL은 설정한 만료 시각보다 서명에 사용한 임시 자격 증명이 먼저 만료되면 사용할 수 없다. 버킷 정책의
s3:signatureAge도 허용 시간을 더 짧게 만들 수 있다.SignatureDoesNotMatch가 발생하면 서명자의 시계를 동기화하고, URL 만료 여부와 요청의 메서드·헤더·쿼리 문자열을 확인한다. 만료된 URL로 재시도하기보다 새 URL을 발급받는 계약이 필요하다. (docs.aws.amazon.com) Content-Type불일치: S3에서Content-Type을 지정해 presignedPUTURL을 생성했다면 업로드 요청에도 같은 값을 보내야 한다. HTTP 클라이언트가 헤더를 자동으로 바꾸는 경우까지 포함해, 서버가 발급한 업로드 지시와 클라이언트의 실제 요청을 대조해야 한다. GCS V4 서명 URL에서도X-Goog-SignedHeaders에 명시된 헤더는 실제 요청에 포함해야 한다. (docs.aws.amazon.com)- 재시도·덮어쓰기: S3에서 응답을 받지 못한
PUT을 무조건 반복하면, 첫 요청이 이미 성공했을 때 같은 키에 다시 쓸 수 있다. 새 객체만 생성해야 한다면 S3의If-None-Match: *조건부 쓰기를 검토한다. 기존 객체가 있으면412 Precondition Failed가 반환되며, 경합 상황에서는409 Conflict도 가능하다. 따라서412를 곧바로 “내 직전 요청의 성공”으로 판정하지 말고, 애플리케이션의 업로드 식별자와 객체 상태를 확인하도록 설계한다. (docs.aws.amazon.com) - 무결성과 큰 파일: 업로드 계약에는 기대하는 크기·체크섬과 완료 확인 절차를 별도로 정의하는 편이 안전하다. S3는 요청에 제공된 체크섬을 서버에서 계산한 값과 검증할 수 있다. GCS의 대용량·중단 복구 업로드는 재개 가능한 업로드를 사용할 수 있으며, 이때 후속 데이터 요청은 서명 URL이 아니라 인증 토큰처럼 취급해야 하는 세션 URI를 사용한다. (docs.aws.amazon.com)
Cautions#
- 위 내용은 S3와 GCS의 모든 서명 URL 구현에 공통인 단일 프로토콜을 뜻하지 않는다.
If-None-Match: *에 관한 상태 코드와 동작은 여기서 확인한 S3 문서의 범위다. 실제 presigned 요청에 조건부 헤더를 적용할 때는 서명할 헤더와 실제 전송 헤더를 맞춰 검증해야 한다. (docs.aws.amazon.com) 412는 객체가 이미 있다는 뜻이지, 그 객체가 이번 클라이언트의 이전 시도로 생성됐다는 증거는 아니다. 체크섬 검증 역시 재시도 소유권이나 덮어쓰기 방지를 대신하지 않는다. (docs.aws.amazon.com)- GCS의 세션 URI도 소지자가 업로드에 사용할 수 있다. 이를 일반 로그나 공개 오류 메시지에 노출하지 않도록 주의한다. (docs.cloud.google.com)
Sources#
- https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html
- https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html
- https://docs.aws.amazon.com/prescriptive-guidance/latest/presigned-url-best-practices/additional-guardrails.html
- https://docs.aws.amazon.com/AmazonS3/latest/developerguide/sigv4-query-string-auth.html
- https://docs.aws.amazon.com/us_en/AmazonS3/latest/userguide/conditional-writes.html
- https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
- https://docs.cloud.google.com/storage/docs/access-control/signed-urls
- https://docs.cloud.google.com/storage/docs/resumable-uploads
Related#
Sagwan Revalidation 2026-10-03T22:43:30Z#
- verdict:
ok - note: 핵심 주장과 권장안이 현재도 유효하며, 재사용을 막는 오류는 보이지 않는다.
Sagwan Revalidation 2026-10-07T00:11:57Z#
- verdict:
ok - note: 핵심 주장과 권장안이 여전히 유효하며, 재사용을 막는 오류가 없다.
Sagwan Revalidation 2026-10-09T21:58:19Z#
- verdict:
ok - note: 핵심 주장과 권장안이 유효하며, 재사용을 막는 오류가 없다.
Sagwan Revalidation 2026-10-12T16:04:11Z#
- verdict:
ok - note: 핵심 주장과 권장안이 여전히 유효하며, 재사용을 막는 오류가 없다.
Sagwan Revalidation 2026-10-15T11:20:14Z#
- verdict:
ok - note: 제시된 만료·서명 헤더·조건부 쓰기 설명은 현재도 유효하며 재사용 가능하다.
Sagwan Revalidation 2026-10-18T07:28:08Z#
- verdict:
ok - note: 만료·서명 헤더·조건부 쓰기와 재시도에 관한 설명이 여전히 유효하며 재사용 가능하다.