AWS API 요청 서명 요소

AWS API 요청 서명 요소

SigV4로 AWS API 요청에 서명할 때 필요한 구성 요소(액세스 키, 서명 키, 서명 범위, 정규 요청 등)와 서명이 계산되는 방식을 설명하는 페이지예요.

출처: 문서

본문

AWS Signature Version 4로 요청에 서명하려면 다음 요소가 필요해요.

자격 증명

  • 액세스 키 ID(Access Key ID) — 자격 증명을 식별하는 키 AKIA... 형태.
  • 시크릿 액세스 키(Secret Access Key) — 서명을 만들 때 쓰는 비밀 값.

장기 IAM 사용자 액세스 키 또는 AWS STS 임시 자격 증명(액세스 키 ID, 시크릿 액세스 키, 세션 토큰)을 사용할 수 있어요. 임시 자격 증명을 쓰는 것이 보안상 더 좋아요.

서명 범위 (Credential Scope)

서명을 만들 때 다음 정보를 조합한 서명 범위(credential scope)를 계산해요.

<access-key-id>/<date>/<region>/<service>/aws4_request
  • <date> — YYYYMMDD 형식의 날짜 (UTC).
  • <region> — 요청을 보내는 AWS 리전.
  • <service> — 대상 AWS 서비스 (예: s3, iam, sts).
  • aws4_request — 고정된 종결 문자열.

정규 요청 (Canonical Request)

서명 대상이 되는 요청을 표준 형태로 직렬화한 것이 정규 요청이에요. 다음과 같은 줄들로 구성돼요.

HTTPMethod
CanonicalURI
CanonicalQueryString
CanonicalHeaders
SignedHeaders
HashedPayload

각 줄은 개행으로 구분되고, 각 부분은 정해진 규칙에 따라 정규화돼요. 예를 들어 헤더는 소문자 키, 정렬된 순서, key:value 형식으로 표현되고, 서명에 포함할 헤더 목록(SignedHeaders)을 함께 기록해요.

서명할 문자열 (String to Sign)

정규 요청을 바탕으로 서명할 문자열을 만들고, 이를 SHA-256 해시로 변환해요.

AWS4-HMAC-SHA256
<timestamp>
<credential-scope>
Hex(SHA256(CanonicalRequest))

서명 (Signature)

다음처럼 일련의 HMAC-SHA256 계산으로 파생 서명 키(derived signing key)를 만든 다음 서명을 계산해요.

kDate    = HMAC("AWS4" + SecretAccessKey, Date)
kRegion  = HMAC(kDate, Region)
kService = HMAC(kRegion, Service)
kSigning = HMAC(kService, "aws4_request")
signature = Hex(HMAC(kSigning, StringToSign))

이렇게 얻은 서명을 요청에 포함해서 보내요.

실제 구현

SDK를 쓰면 이런 서명 계산이 자동으로 처리돼요. 수동으로 구현할 때는 정규 요청의 각 부분(경로, 쿼리, 헤더)이 정확히 정규화 규칙을 따라야 해요. 예를 들어 URL 인코딩, 헤더 정렬, 빈 쿼리 처리 등에서 작은 차이가 서명 오류를 일으킬 수 있어요.

자세한 규격은 AWS 일반 참조의 Signature Version 4 서명 프로세스를 참고하세요.

더 알아보기 (Learn more)