프로그래밍공부(Programming Study)/보안(Security)

JWT와 HMAC: 안전한 인증을 위한 핵심 개념

Chaany 2024. 8. 26.
728x90

1. JWT (JSON Web Token)란?

JSON Web Token(JWT)은 두 개체 간에 JSON 객체로 정보를 안전하게 전송하기 위한 개방형 표준(RFC 7519)입니다. 이 토큰은 일반적으로 사용자 인증 및 정보 교환에 사용되며, 기본적으로 Base64Url로 인코딩된 세 부분으로 구성됩니다:

  • 헤더(Header): 토큰 유형과 해시 알고리즘(HMAC, RSA 등)을 지정합니다.
  • 페이로드(Payload): 인증된 사용자와 관련된 클레임(정보)을 포함합니다.
  • 서명(Signature): 토큰의 무결성을 확인하는 데 사용됩니다. 이는 헤더와 페이로드를 합친 후 지정된 알고리즘(HMAC 등)으로 서명합니다.

JWT는 자체적으로 서명이 되어 있어 클라이언트와 서버 간에 신뢰할 수 있는 방식으로 정보를 교환할 수 있습니다.

2. HMAC (Hash-based Message Authentication Code)란?

HMAC은 메시지 무결성을 확인하고 인증을 제공하기 위해 사용되는 암호학적 해시 함수입니다. HMAC은 키와 메시지를 결합하여 고유한 해시 값을 생성합니다. 이 해시 값은 메시지와 함께 전송되어, 수신자가 동일한 키를 사용해 해시를 다시 계산하고 원래 해시 값과 비교함으로써 메시지가 변경되지 않았음을 확인할 수 있습니다.

HMAC의 주요 구성 요소는 다음과 같습니다:

  • 해시 함수(Hash Function): SHA-256, SHA-1, MD5 등이 사용될 수 있습니다.
  • 비밀 키(Secret Key): 메시지 인증을 위해 사용되는 키입니다. 이 키는 안전하게 관리되어야 하며, 유출될 경우 인증의 신뢰성이 떨어집니다.

3. JWT와 HMAC의 관계

JWT는 기본적으로 서명을 통해 무결성과 인증을 보장하는데, 이 서명을 생성할 때 HMAC 알고리즘이 자주 사용됩니다. JWT의 서명은 헤더와 페이로드를 결합한 후, HMAC 키를 사용해 해시된 값을 포함합니다. 이렇게 생성된 JWT는 수신자가 동일한 HMAC 키를 사용해 서명을 확인하고 토큰의 무결성을 검증할 수 있게 합니다.

4. HMAC 키 교환 방식

HMAC에서 사용되는 키는 매우 중요하며, 안전하게 교환되어야 합니다. HMAC 키 교환 방식은 주로 다음과 같은 방법으로 이루어집니다:

  • 대칭 키 교환(Symmetric Key Exchange): 양측이 사전에 공유된 비밀 키를 사용하는 방식입니다. 이 방식은 키가 사전에 안전하게 교환되어야 하며, 키 유출의 위험이 있습니다.
  • 비대칭 키 교환(Asymmetric Key Exchange): 공개 키 암호화를 사용하여 키를 교환하는 방식입니다. 한 쪽은 공개 키를 사용해 키를 암호화하고, 다른 쪽은 해당 키를 사용해 복호화합니다. 이 방식은 키 교환 중에 키가 노출될 위험을 줄일 수 있습니다.
  • 키 교환 알고리즘(Key Exchange Algorithm): Diffie-Hellman 키 교환 방식과 같은 알고리즘을 사용해 안전하게 키를 교환할 수 있습니다. 이 방식은 보안 채널을 통해 키를 교환할 수 있도록 해줍니다.

5. HMAC 키 교환의 구체적 사례

다음은 파이썬을 사용한 HMAC 키 교환의 간단한 예시입니다.

import hmac
import hashlib

# 두 개체 간에 공유된 비밀 키
shared_secret_key = b'secret_key'

# 메시지
message = b'Important message'

# HMAC 생성
hmac_value = hmac.new(shared_secret_key, message, hashlib.sha256).hexdigest()

# 수신자 측에서 HMAC 검증
def verify_hmac(shared_secret_key, message, received_hmac):
    calculated_hmac = hmac.new(shared_secret_key, message, hashlib.sha256).hexdigest()
    return hmac.compare_digest(calculated_hmac, received_hmac)

# 검증 결과
is_valid = verify_hmac(shared_secret_key, message, hmac_value)
print("HMAC 검증 결과:", is_valid)

이 예제에서는 사전에 공유된 비밀 키를 사용하여 HMAC을 생성하고, 수신자가 동일한 비밀 키로 메시지의 무결성을 확인하는 과정을 보여줍니다.

결론

JWT와 HMAC은 현대적인 웹 애플리케이션에서 필수적인 보안 도구입니다. JWT는 인증 및 정보 교환에 사용되며, HMAC은 메시지 무결성 검증과 인증에 중요한 역할을 합니다. 또한 HMAC 키 교환 방식은 보안성을 확보하기 위해 신중하게 고려되어야 하며, 안전한 키 교환이 이루어져야 합니다.

728x90

댓글