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 서명 프로세스를 참고하세요.