웹 서비스를 이용하다 보면 “로그인 상태 유지” 기능을 많이 사용해봤을 것이다.
이 기능의 뒤에는 바로 JWT(JSON Web Token)라는 기술이 숨어 있는데,
JWT는 요즘 웹 서비스에서 사용자 인증을 위해 널리 사용되는 기술이다.

이 JWT를 안전하게 사용하기 위해서는 여러 가지 알고리즘이 사용된다.
그런데 흔히 “암호화”라고 부르는 이 과정은, 정확히는 서명(Signing)이라고 부르는 것이 맞다.
이 글에서는 JWT의 개념과 작동 원리, 서명 알고리즘 종류, 그리고 자주 사용되는 알고리즘에 대해 알아보도록 한다.

JWT는 뭘까? 간단하게 알아보자!

JWT는 웹 서비스에서 사용자 인증 정보를 안전하게 주고받기 위한 표준이다.
쉽게 말해, 사용자가 로그인에 성공하면 서버는 사용자 정보를 담은 JWT를 발급한다.
이후 사용자는 JWT를 서버에 제시하여 로그인 상태를 유지하고 다양한 서비스에 접근할 수 있게 된다.
JWT는 크게 세 부분으로 이루어져 있다.

  • Header: 토큰의 종류와 해싱 알고리즘(서명 알고리즘) 등 메타데이터 정보를 담고 있다.
  • Payload: 사용자 정보, 토큰 만료 시간 등 필요한 데이터를 담고 있다. 마치 편지의 내용과 같다.
  • Signature: 헤더(Header)와 페이로드(Payload)의 무결성을 검증하는 데 사용된다. 편지 봉투의 도장과 같은 역할을 한다.

JWT를 편지로 비유해서 설명해보면,
헤더는 이 것이 어떤 종류의 편지 인지(비밀편지, 감사편지 등), 받는 이의 정보(to. 누구에게) 등 중요한 정보를 담고 있다.
즉, 편지의 제목이나 형식에 해당하는 부분이다.
페이로드는 편지의 본문이라고 생각하면 된다.
실제로 전달하고 싶은 메시지를 담고 있다. (안녕, 잘 지내?와 같이)
서명은 위조되지 않았다는 것을 증명하기 위한 편지 봉투에 찍는 도장 혹은 밀봉 스티커(?)와 같다.
이 것이 훼손되어 있으면 당연히 ‘누군가가 뜯어봤겠지?’라는 의문이 드는 것과 같이 말이다.

 JWT 토큰, 어떻게 만들어질까?

JWT 토큰은 세 개의 부분으로 구성된 문자열을 말한다.
[헤더].[페이로드].[서명]으로 구성되어 있으며, 이 전체 토큰은 인증, 정보 전달 등에 사용된다.

JWT 토큰과 JWT 서명을 같게 생각할 수도 있지만, 둘은 서로 다른 개념이다.
JWT 토큰은 위에서 설명한 바와 같이 말 그대로 세 개의 부분으로 구성되어 있는 JWT 자체의 전체 구조를 의미한다.
반면, JWT 서명은 JWT 토큰의 한 부분으로, 헤더와 페이로드의 무결성을 확인하는 데 사용된다.

그렇다면 서명이 있어야 JWT 토큰이 만들어진다는 것을 알 수 있는데,
JWT 서명은 비밀 키(Secret Key)를 사용하여 생성된다.
이 비밀 키는 서버만 알고 있어야 하는 아주 중요한 정보이기 때문에 노출되면 안된다.
만약 비밀 키가 노출된다면,
유효한 서명이 포함된 위조된 토큰을 이용하여 시스템 전반적인 보안 자체를 무력화할 수 있다.
가장 쉽게 예를 들어보자면, 관리자 권한을 이용해서 여러 가지 행위를 할 수도 있겠다.

그렇다면 다시 본론으로 돌아와서 JWT 토큰은 어떻게 만들어질까?
JWT 생성 과정은 다음과 같다.

  1. 헤더와 페이로드 인코딩: 필요한 데이터가 담긴 헤더와 페이로드는 각각 Base64Url로 인코딩된다.
  2. 서명 생성: 인코딩된 헤더와 페이로드를 점(.)으로 연결한 후, 비밀 키를 사용하여 해싱 알고리즘 (예: HMAC-SHA256, RS256)으로 서명을 생성한다. 생성된 서명이 바로 JWT의 ‘sigunature’이 된다.
  3. JWT 생성: 인코딩된 헤더, 페이로드, 서명을 점(.)으로 연결하여 최종 JWT를 생성한다.

JWT 암호화(서명) 알고리즘(해싱 알고리즘)은 왜 필요할까?

서버는 JWT 토큰을 생성 시, 비밀 키를 사용하여 Header와 Payload를 기반으로 서명(Signature)을 생성한다고 했다.
클라이언트가 보낸 JWT는 서버에서 비밀 키를 통해 서명을 검증하여 토큰의 무결성을 확인한다.
그렇기 때문에 JWT 암호화 알고리즘은 토큰의 신뢰성과 무결성을 보장하기 위해 필수적이다.
JWT는 클라이언트와 서버 간의 인증 및 정보 교환에 사용되며
누군가 토큰을 위조하거나 변조하는 것을 막기 위해 사용되기 때문이다.

만약 누군가 토큰 내용을 변경하려고 하면 어떻게 될까?
변조된 JWT 토큰은 네트워크를 통해 서버측으로 전달된다.
서버는 서명 알고리즘을 통해 헤더와 페이로드가 변경되지 않았음을 확인하고,
서명이 유효하지 않으면 변조된 토큰으로 간주하고 변조된 JWT 토큰을 거부해버린다.
서명을 통해 전송 과정에서 데이터가 변조되지 않았음을 확인할 수 있기 때문에 데이터의 신뢰성과 무결성이 보장된다.
결국 서명 검증 과정에서 변경 사실이 드러나게 된다는 것이다.
비유하자면 누군가 편지 내용을 바꾸려고 봉투를 열었다가 다시 봉했을 때,
도장이 훼손되어 있는 것과 같은 느낌이라고 하면 이해에 조금 더 도움이 될까?

즉, JWT가 변조되지 않았음을 검증하는 중요한 메커니즘을 제공하기 때문에 필요하다.

JWT 서명 알고리즘 종류를 알아보자

JWT에서 가장 많이 사용되는 주요 서명 알고리즘은 세 가지로 나눌 수 있다.

  • HS256(HMAC, Hash-based Message Authentication Code with SHA-256)
  • RS256(RSA, Rivest–Shamir–Adleman with SHA-256)
  • ES256(ECDSA, Elliptic Curve Digital Signature Algorithm with SHA-256)

이 세 가지 알고리즘을 중심으로 각각의 개념과 장단점을 비교해보자.

HS256 (HMAC with SHA-256)

HMAC 알고리즘을 간략히 설명한 이미지
  • 개념
    • 대칭키 알고리즘으로, 서명 생성과 검증에 동일한 비밀 키를 사용한다.
    • SHA-256 해시 함수를 사용하여 메시지를 암호화한다.
  • 장점
    • 구현이 간단하고 속도가 빠르다.
  • 단점
    • 키 관리가 중요하다.
    • 서버와 클라이언트가 동일한 비밀 키를 공유해야 하므로 키 유출 시 보안 위험이 높다.

RS256 (RSA with SHA-256)

RSA 알고리즘을 간략히 설명한 이미지
  • 개념
    • 비대칭키 알고리즘으로, 공개키와 개인키(혹은 비밀키라고도 한다.) 한 쌍을 사용한다.
    • 개인키로 서명을 생성하고 공개키로 서명을 검증한다.
    • 개인키는 나만 가지고 있고, 공개키는 누구에게나 공개할 수 있다.
  • 장점
    • 키 관리가 용이하고 보안성이 높다.
    • 개인키는 서버에만 안전하게 보관하면 되므로 키 유출 위험이 적다.
  • 단점
    • HS256에 비해 서명 생성 및 검증 속도가 느리다.

ES256 (ECDSA with SHA-256)

ECDSA 알고리즘을 간략히 설명한 이미지
  • 개념
    • RS256과 마찬가지로 비대칭키 알고리즘이다.
    • 타원 곡선 암호화(ECC, Elliptic Curve Cryptography)를 기반으로 한다. (대표적으로 ECC(ECDSA) 서명 알고리즘을 사용하는 것은 블록체인을 이용한 비트코인이 있다.)
    • RS256보다 키 크기가 작아도 동일한 수준의 보안을 제공한다.
  • 장점
    • 키 크기가 작아서 데이터 전송량과 저장 공간을 절약할 수 있다.
    • 작은 키 데이터로도 높은 보안성과 빠른 계산 속도로 인해 일반적으로 RS256보다 성능이 우수하다고 평가된다.
    • 클라이언트나 IoT 디바이스, 모바일 환경 등 자원이 제한된 환경에 적합하다.
  • 단점
    • RS256보다 구현 복잡성이 높다.

JWT에 어떤 알고리즘을 선택해야 하는 것이 좋을까?

HS256 (HMAC-SHA256)

설정과 구현이 간단하며 성능이 뛰어나다.
RSA나 ECDSA보다 서명 생성과 검증 속도가 빠르다.
키 교환이 필요 없으며, 주로 단순한 시스템이나 신뢰할 수 있는 환경에서 사용한다.
단, 대칭키 방식이므로 비밀키 관리가 중요하다.

  • 단순한 내부 서비스나 테스트 환경
  • 서명 생성/검증 속도 모두 중요한 환경

RS256 (RSA)

RSA는 오랫동안 사용되어 온 표준이며, 대부분의 시스템에서 기본적으로 지원된다.
공개키 기반이라 비밀키를 노출하지 않아도 된다.
보안성이 높으면서도 검증 속도가 빠르다는 장점이 있다.
서명 생성 속도는 느리지만 검증 속도가 빠르기 때문에 대규모 API 인증 등에 적합하다는 장점이 있다.
단, 키 크기가 크므로 데이터 전송량이 증가할 수 있다는 단점이 있다.

  • 기존 시스템과의 호환성이 중요한 환경
  • 다수의 검증이 필요한 환경 (API 인증)

ES256 (ECDSA)

작은 키 크기로 높은 보안성을 제공하며, 리소스가 제한된 환경에서 성능이 뛰어나다.
ECC 기반 알고리즘은 RSA보다 양자 컴퓨팅에 대한 내성이 강한 것으로 평가되어 있어
장기적인 보안을 고려한 최신 시스템 설계에 적합하다.
또한, 키 크기가 작기 때문에 JWT 토큰 크기를 줄이는 데 효과적이다.
데이터 전송량이 적고 서명 생성이 빠르다는 장점이 있다.
검증 속도는 다소 느릴 수 있지만, 대부분의 애플리케이션에서 문제가 되진 않는다.

  • 높은 보안성과 효율성이 필요한 환경 (IoT, 모바일 등)
  • 데이터 전송량의 최소화가 중요한 환경
  • 미래 지향적 시스템으로 장기적인 보안성이 중요한 환경

간단 요약

암호화 알고리즘 선택은 사용 환경보안 요구 사항에 따라 달라진다.

  • 리소스 효율성과 보안이 중요하다 ➡️ ES256.
  • 검증 속도와 호환성을 중시한다 ➡️ RS256.
  • 단순성과 성능이 필요하다 ➡️ HS256.

참고된 출처

Similar Posts

댓글 남기기