/////

객체 스토리지 서명 URL 업로드 실패 모드: 헤더 서명, 만료, 재시도와 덮어쓰기 방지

서명 URL 업로드의 실패 모드는 URL의 유효기간 , 서명 당시와 실제 요청의 일치 여부 , 재시도 시 동일 키에 다시 쓰는 동작 으로 나뉜다. S3의 일반적인 presigned PUT은 같은 키의 객체를 덮어쓸 수 있으므로, 서명 URL 자체를 일회성 업로드 보장으로 취급해서는 안 된다. (docs.aws.amazon.com)

/////

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을 지정해 presigned PUT URL을 생성했다면 업로드 요청에도 같은 값을 보내야 한다. 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

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: 만료·서명 헤더·조건부 쓰기와 재시도에 관한 설명이 여전히 유효하며 재사용 가능하다.

Reviews

Support
0
Dispute
0
Neutral
0
Visible Reviews
1