API 보안 보호
API 서비스에서 X-Timestamp, X-Nonce, X-AccessKey, X-Signature는 API 요청 서명 메커니즘의 일반적인 핵심 구성 요소로, 주로 인증, 데이터 무결성 검증, 재생 공격 방지에 사용됩니다.
핵심 구성 요소 분석
1. X-Timestamp (타임스탬프)
기능
- 서버 측에서 요청 적시성을 검증하기 위해 요청 시작 시간(일반적으로 Unix 타임스탬프)을 기록합니다.
해결된 문제
- 재생 공격 방지: 서버는 타임스탬프 유효 기간(예: 5분)을 설정하여 만료된 요청을 직접 거부합니다. 공격자는 만료된 후에 가로챈 합법적인 요청을 재생할 수 없습니다.
- 동기화 확인: 클라이언트와 서버 간의 시간 편차가 합리적인 범위 내에 있는지 확인하여 시간 조작이 요청 유효성에 영향을 미치는 것을 방지합니다.
2. X-Nonce (일회성 랜덤 번호)
기능
- 각 요청의 고유성을 보장하기 위해 고유한 랜덤 문자열(예: UUID)을 생성합니다.
해결된 문제
- 중복 요청 방지: 서버는 Nonce 값을 캐시(또는 타임스탬프와 결합)하여 이미 처리된 중복 요청을 거부합니다.
- 서명 동적성 강화: 동일한 매개변수를 가진 요청이라도 Nonce가 다르기 때문에 서명 결과가 다르며, 이를 통해 서명 재사용을 방지합니다.
3. X-AccessKey (액세스 키)
기능
- 클라이언트 신원(예: 사용자, 애플리케이션 또는 서비스)을 식별하며, 일반적으로 서버에서 미리 할당된
SecretKey와 쌍으로 사용됩니다.
해결된 문제
- 인증: 요청자가 법적으로 등록된 클라이언트인지 확인합니다.
4. X-Signature (요청 서명)
기능
- 클라이언트는
SecretKey를 사용하여 요청 내용(매개변수, 경로, 타임스탬프, Nonce 등)에 대한 서명을 생성하고, 서버는 동일한 알고리즘을 사용하여 서명을 확인합니다.
해결된 문제
- 데이터 무결성: 전송 중 요청이 변조되지 않았는지 보장합니다(매개변수 수정은 서명 확인 실패를 유발합니다).
- 신원 위조 방지:
SecretKey가 없는 공격자는 올바른 서명을 생성할 수 없으며 합법적인 요청을 위조할 수 없습니다. - 핵심 매개변수 바인딩: 서명 알고리즘은 일반적으로 요청 방법, 경로, 매개변수 등을 포함하여 요청 내용과 서명 간의 일관성을 보장합니다.
전체 프로세스 예제
클라이언트 서명 생성 단계
- 요청 데이터 연결
- 암호화 알고리즘을 통해
SecretKey로 서명을 생성하고X-Signature헤더에 저장합니다. X-Timestamp,X-Nonce,X-AccessKey,X-Signature를 요청 헤더에 추가하여 전송합니다.
서버 측 확인 프로세스
- 타임스탬프 확인: 유효 기간(예: ±5분) 내에 있는지 확인합니다.
- Nonce 확인: 이미 존재하는지 확인합니다(중복 요청 방지를 위해 타임스탬프와 함께 캐시할 수 있습니다).
- 서명 확인:
AccessKey를 통해 해당SecretKey를 찾고, 동일한 알고리즘으로 서명을 재생성하여X-Signature와 비교합니다. - 결과 처리: 모든 확인이 통과하면 요청 로직을 실행합니다; 그렇지 않으면 401 Unauthorized 또는 403 Forbidden 오류를 반환합니다.
메커니즘 장점 요약
| 기능 | 구현 방법 |
|---|---|
| 인증 | AccessKey가 클라이언트 신원을 식별하고, Signature는 클라이언트가 유효한 SecretKey를 보유하고 있음을 확인합니다. |
| 데이터 변조 방지 | 서명이 요청 내용(방법, 경로, 매개변수 등)에 바인딩되어 있으며, 어떠한 수정도 서명 확인 실패를 유발합니다. |
| 재생 공격 방지 | Timestamp는 적시성을 보장하고, Nonce는 요청 고유성을 보장하며, 이중 메커니즘은 중복/만료된 요청을 거부합니다. |
| 부인 방지 | 서명은 요청 원천을 추적할 수 있으며, 클라이언트는 합법적인 요청을 시작한 것을 거부할 수 없습니다. |