study-log

body 무결성 검증 방법

Rest API에서 유저 인증은 jwt 사용하여 인증정보가 일치하였을때, 전송되는 body가 변조되지 않았다는것을 보장하려는 방법에 대해서 찾아보게 되었다.
JWT 인증은 “사용자의 신원”을 보장하지만, body 데이터가 중간에 변조되지 않았다는 것을 보장하지는 않기 때문에 body 본문이 클라이언트가 의도한 값인지 추가적인 무결성 검증이 필요하다.

✅ 문제 정리

✅ 가능한 해결 방법

1. HMAC (해시 기반 메시지 인증 코드) 서명 사용

클라이언트가 보내는 body에 대해 서명을 생성해서(클라이언트와 서버가 공유하는 비밀키로 HMAC 해시를 만들어) 서명을 헤더나 별도 필드에 실어 함께 전송하고 서버는 동일키로 HMAC을 재계산하여 일치하는지 비교하여 무결성을 검증.

💡 동작 방식

  1. 클라이언트는 body 데이터를 JSON 문자열로 변환 후, 비밀 키로 HMAC-SHA256 서명 생성
    예) signature = Base64( HMAC_SHA256(secretKey, JSON.stringify({ “price”: 10000 })) )
  2. 이 서명을 헤더 또는 별도 필드에 포함해서 서버에 전송
    예) HTTP 헤더로 X-Signature: signature 추가, JSON 바디와 함께 전송
    • 요새는 비표준 헤더속성에 X-를 붙이지 않는다고 한다. 참고참고.
  3. 서버는 동일한 방식으로 body를 서명해보고, 클라이언트 서명과 비교
    예) 헤더 X-Signature와, 읽어들인 바디로 HMAC 재계산

✅ 장점

✅ 단점

2. JWT Payload에 중요한 데이터 포함하기

JWT는 자체적으로 서명을 포함하기 때문에, 중요한 데이터(price 등)를 JWT 안에 넣으면 위조가 불가능하기에 JWT Payload에 이 JWT를 Authorization 헤더에 넣고 전송하고 서버는 JWT의 서명을 검증하고 price 정보도 JWT 내에서 읽어서 검증하는 방법.

✅ 장점

✅ 단점

3. JSON Web Signature 서명 사용 - 요청 body 자체를 JWT로 만들기

요청 전체를 서명하는 방법으로,
클라이언트 요청 전체 데이터를 JWT 형식(JWS)으로 감싸고, 서명된 토큰으로 보내면 서버는 공개키(RSA/ECDSA) 또는 대칭키(HMAC)으로 JWS 서명을 검증하는 방식.

💡 동작 방식

✅ 장점

✅ 단점

4. mTLS 및 API Gateway 활용

mTLS(상호 TLS 인증)를 걸면 클라이언트 인증서 그 자체가 “이 요청은 올바른 클라이언트에서 왔고, 중간 변조가 없다”를 보장. AWS API Gateway의 SigV4, Kong의 HMAC 플러그인 같은,
API Gateway 레벨 서명 기능을 활용하면, 애플리케이션 코드를 건드리지 않고 메시지 무결성을 검증이 가능.

✅ 상황에 따른 사용

✅ 이 외 무결성을 보장하기 위한 방법