HMAC + SHA-256 을 의미하는 서명 알고리즘
SHA-256을 사용하여 HMAC한 서명 알고리즘
서명 = HMAC-SHA256(
Base64url(Header) + "." + Base64url(Payload),
비밀키(Secret Key)
)
받은 토큰의 서명 == 서버가 직접 계산한 서명?
→ 같으면: 유효한 토큰 ✅
→ 다르면: 위변조된 토큰 ❌
단순히, SHA-256만으로 서명을 하면 payload가 조작된 것을 감지할 수 없음.
서명 = SHA256("header.payload")
탈취된 토큰의 payload를 위조하여, 재서명하여도 조작된것을 검증 할 수 없음.
재서명 = SHA256(header.변경된payload)
Hash-based Message Authentication Code 의 줄임말로 키를 받아 해시값을 만들어내는 방식을 말한다.
HMAC(K, M) = SHA256(
(K ⊕ opad) + ← 바깥 패딩과 키를 XOR
SHA256(
(K ⊕ ipad) + M ← 안쪽 패딩과 키를 XOR한 뒤 메시지 붙이기
)
)
K : 비밀키M : 서명할 메시지 (header.payload)ipad : 0x36(6) 반복 (inner padding)opad : 0x5C(\) 반복 (outer padding)패딩은 key의 길이만큼 반복하여 생성한다.
key가 5글자라면, 바깥 패딩은 "66666" 이 된다.
같은 키를 그대로 두 번 쓰면 내부/외부 해시가 너무 비슷한 구조가 되어서 수학적 취약점이 생기기때문에,
key를 패딩과 XOR연산하여 한번 더 꼬아주는게 핵심이다.
SHA-256은 Merkle-Damgård 구조로, 최종 해시값이 곧 마지막 내부 상태값이다.
따라서 SHA256(K + M)의 결과를 알면, K를 모르더라도
SHA256(K + M + 추가데이터)를 계산할 수 있다.
HMAC은 내부 해시값을 외부 SHA256의 입력으로 한번 더 감싸기 때문에
공격자가 내부 상태를 이어서 계산할 수 있는 접점 자체가 사라진다.
내부/외부 해시에 동일한 키가 반복되면, 여러 서명값을 수집했을 때
두 해시 계산 사이의 수학적 관계를 추론할 수 있게 된다.
ipad/opad로 키를 XOR 변형하면, 내부/외부가 수학적으로
독립된 키를 쓰는 것과 같은 효과가 나서 이 관계를 끊어낼 수 있다.