서명된 요청 만들기
서명된 요청 만들기
SigV4로 AWS API 요청에 서명하는 전체 과정을 단계별로 설명하는 페이지예요. 자격 증명 준비부터 정규 요청, 서명 계산, 요청 전송까지를 다뤄요.
출처: 문서
본문
SigV4로 서명된 AWS API 요청을 만드는 과정은 대략 다음 단계로 이뤄져요.
1단계: 자격 증명 준비
액세스 키 ID와 시크릿 액세스 키를 준비해요. STS 임시 자격 증명을 쓴다면 세션 토큰도 포함돼요. IAM 사용자의 액세스 키 대신 임시 자격 증명을 쓰는 것이 보안상 좋아요.
2단계: 요청 요소 정의
- HTTP 메서드 (GET/POST 등)
- 요청 경로(URI) — 조회 파라미터는 제외한 경로
- 쿼리 문자열
- 헤더 (host, x-amz-date 등)
- 페이로드(본문) 해시
3단계: 정규 요청(Canonical Request) 구성
다음 형식으로 정규 요청 문자열을 만든 뒤 SHA-256 해시를 계산해요.
HTTPMethod
CanonicalURI
CanonicalQueryString
CanonicalHeaders
SignedHeaders
HashedPayload
CanonicalURI— URI 경로를 URL 인코딩한 뒤/로 구분.CanonicalQueryString— 쿼리 파라미터를 정렬하고 URL 인코딩.CanonicalHeaders— 서명할 헤더를 소문자, 정렬 순서로name:value\n형식으로 나열.SignedHeaders— 서명에 포함시킨 헤더 이름 목록 (세미콜론 구분, 소문자).HashedPayload— 요청 본문의 SHA-256 해시를 소문자 hex로.
4단계: 서명할 문자열(String to Sign) 구성
AWS4-HMAC-SHA256
<timestamp>
<credential-scope>
Hex(SHA256(CanonicalRequest))
<timestamp>—x-amz-date값 (ISO 8601, UTC).<credential-scope>—date/region/service/aws4_request.
5단계: 파생 서명 키와 서명 계산
kDate = HMAC("AWS4" + SecretAccessKey, Date)
kRegion = HMAC(kDate, Region)
kService = HMAC(kRegion, Service)
kSigning = HMAC(kService, "aws4_request")
signature = Hex(HMAC(kSigning, StringToSign))
6단계: 요청에 서명 포함
Authorization 헤더로 보내는 방식의 예시예요.
Authorization: AWS4-HMAC-SHA256 Credential=<access-key-id>/<scope>, SignedHeaders=<headers>, Signature=<signature>
또는 사전 서명된 URL 형태(X-Amz-* 파라미터)로 보낼 수도 있어요.
실패 시 확인
서명 오류(SignatureDoesNotMatch)가 나면 계산에 사용한 각 요소가 실제 전송 요청과 정확히 일치하는지 확인해야 해요. 특히 경로의 URL 인코딩, 헤더 정렬, 타임스탬프가 흔한 실수 지점이에요. 자세한 해결 방법은 SigV4 트러블슈팅을 참고하세요.
자세한 규격과 수동 구현 예시는 AWS 일반 참조의 Signature Version 4 서명 프로세스를 참고하세요.