Skip to content

무료 JWT 비밀 키 생성기 — HS256/384/512

온라인으로 HS256/384/512용 강력한 RFC 준수 JWT 비밀 키를 생성하세요. 100% 브라우저 실행, 서버 전송 없음. base64url·base64·hex, .env 복사 지원.

트래킹 없음 브라우저 실행 무료
비밀 키는 crypto.getRandomValues로 로컬에서 생성되며 업로드·로깅·저장되지 않습니다. 이 기기에 머뭅니다.
16 64

동등한 CLI 명령

RFC 7518 §3.2 키 길이 정확성, base64url / base64 / hex 전반의 RFC 4648 인코딩 정확성, CSPRNG 소싱(crypto.getRandomValues, Math.random 사용 안 함), 생성된 비밀 키의 무전송·무저장 비공개성, 접근성(라벨링된 컨트롤, 표시/숨김 마스킹, 생성·복사 시 스크린 리더 알림)을 검토했습니다. — Go Tools 보안 도구팀 · Jun 16, 2026

JWT 비밀 키 생성기란?

JWT 비밀 키 생성기는 HMAC 서명 JSON Web Token이 변조되지 않았음을 증명하는 데 쓰는 무작위 서명 키를 만듭니다. HS256, HS384, HS512로 토큰에 서명하면 알고리즘은 하나의 공유 비밀을 사용해 토큰의 헤더와 페이로드에 대해 HMAC을 실행합니다. 검증자는 같은 비밀로 같은 HMAC을 다시 계산해, 서명이 일치할 때만 토큰을 받아들입니다. 그 방식의 보안 전체는 비밀이 길고 예측 불가능하다는 데 달려 있는데 — 바로 이것이 이 도구가 만드는 것입니다. 고른 알고리즘에 맞게 크기가 정해진, 브라우저에서 생성된 높은 엔트로피의 무작위 문자열이죠.

이 도구가 무엇을 하고 무엇을 하지 않는지 분명히 할 필요가 있습니다. 이 도구는 비밀 키 — JWT_SECRET 환경 변수에 넣는 값 — 를 생성하지, 완성된 토큰을 만들지 않습니다. 헤더와 페이로드를 조립해 실제 JWT로 서명하고 싶다면 그것은 JWT 인코더의 일입니다. 기존 토큰을 분해해 서명을 검증하려면 JWT 디코더를 쓰세요. 비밀 키를 열쇠로, 인코더를 그 열쇠가 작동시키는 자물쇠로 생각하세요. 열쇠를 한 번 생성해 안전하게 보관하고, 그것을 재사용해 많은 토큰에 서명하고 검증합니다.

키는 얼마나 길어야 할까요? 답은 취향이 아니라 명세로 정해집니다. JSON Web Algorithms 표준인 RFC 7518 §3.2는 HMAC 키가 적어도 해시 출력만큼 커야 한다고 요구합니다. "해시 출력과 같은 크기(예: HS256은 256비트) 또는 그 이상의 키를 반드시 사용해야 한다." 그래서 생성기가 자동으로 따르는 깔끔한 표가 나옵니다.

| Algorithm | HMAC | Min bytes | Min bits | hex chars | base64 chars | base64url chars | |-----------|------|-----------|----------|-----------|--------------|-----------------| | HS256 | HMAC-SHA-256 | 32 | 256 | 64 | 44 | 43 | | HS384 | HMAC-SHA-384 | 48 | 384 | 96 | 64 | 64 | | HS512 | HMAC-SHA-512 | 64 | 512 | 128 | 88 | 86 |

문자 수는 그 바이트 길이의 RFC 4648 인코딩에서 나옵니다. hex는 바이트 수를 두 배로 늘리고, base64는 패딩과 함께 4⁄3로 확장하며, base64url은 패딩을 떼므로 32바이트 키는 44가 아니라 43 base64url 문자가 됩니다. base64url은 JWT의 기본 인코딩이며 — URL 안전 알파벳, 패딩 없음 — 그래서 여기서 기본 출력입니다. base64url 비밀 키는 헤더, URL, 설정 값 안에 이스케이프 없이 들어갈 수 있습니다.

무작위성은 타협할 수 없는 부분입니다. 이 생성기는 Web Crypto 키 생성을 뒷받침하는 바로 그 기본 요소인, 브라우저의 암호학적으로 안전한 의사 난수 생성기 crypto.getRandomValues에서 바이트를 뽑습니다. 빠르지만 예측 가능해 서명 키에 전혀 부적합한 Math.random은 절대 쓰지 않습니다 — 예측 가능한 RNG는 추측 가능한 비밀을, 추측 가능한 비밀은 위조 가능한 토큰을 뜻합니다. HMAC 검증이 공유 비밀로 로컬에서 일어나므로, 토큰을 손에 넣은 공격자는 속도 제한 없이 약한 키를 오프라인으로 무차별 대입할 수 있습니다. hashcat(모드 16500)과 jwt_tool 같은 도구가 바로 이를 하려고 존재합니다. 반면 완전한 엔트로피의 32바이트 무작위 키는 계산적으로 도달 불가능합니다. 교훈은 직설적입니다. 비밀번호, 사전 단어, 손으로 입력한 문자열을 JWT 비밀 키로 절대 쓰지 말고 — 무작위로 생성하세요.

끝으로, 키를 클라이언트 측에서 생성하는 것 자체가 보안 속성입니다. 서명 비밀 키는 제3자에게, 그것을 만드는 데 도와주는 사이트에게조차 절대 전송돼선 안 됩니다. 여기서 모든 바이트는 사용자의 브라우저에서 만들어지고 인코딩됩니다. 업로드되거나 로깅되거나 저장되는 것은 없습니다. 키를 배포할 준비가 되면 Copy for .env 버튼이 JWT_SECRET=… 줄을 건네주고, 더 큰 설정에 접어 넣어야 한다면 JSON to .env 변환기가 도울 수 있습니다. 생성하고, 복사하고, 시크릿 관리자에 저장하고 — 때가 되면 kid 헤더와 겹치는 유효 구간으로 순환하세요.

// The secret you generate here goes straight into your signing code.
// Node.js with jsonwebtoken — the JWT_SECRET env var holds the key.
import jwt from 'jsonwebtoken';

const secret = process.env.JWT_SECRET; // e.g. base64url value from this tool

// Sign a token with HS256 (HMAC-SHA-256).
const token = jwt.sign({ sub: 'user-42', role: 'member' }, secret, {
  algorithm: 'HS256',
  expiresIn: '15m'
});

// Verify it — pin the algorithm to a whitelist; never trust the token's alg.
const payload = jwt.verify(token, secret, { algorithms: ['HS256'] });

// ---------------------------------------------------------------
// Python with PyJWT — same secret, same algorithm pinning.
// import jwt
// token = jwt.encode({"sub": "user-42"}, key, algorithm="HS256")
// payload = jwt.decode(token, key, algorithms=["HS256"])  # whitelist!

// ---------------------------------------------------------------
// Equivalent-strength CLI generation (32 bytes for HS256):
//   openssl rand -base64 32
//   node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
//   python -c "import secrets; print(secrets.token_urlsafe(32))"

주요 기능

알고리즘 인식 키 길이

HS256, HS384, HS512를 고르면 생성기가 RFC 7518 §3.2 최소 키 크기 — 32, 48, 64바이트 — 를 자동으로 설정합니다. 더 긴 키를 요청할 수는 있지만, 명세를 위반하거나 엄격한 라이브러리가 서명을 거부할 만큼 작은 키를 실수로 만들 일은 없습니다.

텍스트 안전한 세 가지 출력 형식

같은 무작위 바이트를 base64url(JWT의 기본 URL 안전·패딩 없는 인코딩 — 기본값), 표준 base64, hex로 나란히 얻으세요. base64url이 JWT_SECRET에 가장 안전한 기본값이며, 특정 로더나 라이브러리가 다른 것을 기대할 때 형식을 전환하세요. 엔트로피는 셋 모두 동일합니다.

암호학적으로 안전한 무작위성

모든 비밀 키는 브라우저의 CSPRNG이자 Web Crypto 키 생성 뒤의 기본 요소인 crypto.getRandomValues에서 뽑힙니다. Math.random은 절대 쓰지 않습니다. 이는 예측 가능한 구조가 없는 완전한 엔트로피 키를 보장하며 — 비밀 키를 오프라인 무차별 대입의 도달 범위 밖에 두는 속성입니다.

한 번의 클릭으로 .env 복사

Copy for .env는 값을 관례적인 JWT_SECRET=… 할당으로, 한 줄에 따옴표 없이 감싸 — 키 이름을 직접 입력하지 않고도 .env 파일, Docker 시크릿, CI 변수에 바로 붙여 넣을 수 있습니다. 일반 Copy는 값만 필요할 때 원시 비밀 키를 가져옵니다.

동등한 CLI 명령

패널이 선택한 알고리즘에 맞는 openssl rand, Node crypto.randomBytes, Python secrets 한 줄 명령을 출력하므로 프로비저닝 스크립트나 Dockerfile에서 동등한 강도의 키를 재현할 수 있습니다. 경쟁 도구 대부분은 이를 생략하지만, 여기서는 기본 제공됩니다.

표시 / 숨김 마스킹

비밀 키는 데모, 튜토리얼, 화면 공유 중 화면에서 가리도록 기본적으로 마스킹됩니다. 복사할 준비가 됐을 때만 눈 아이콘으로 드러내세요. Copy 동작은 값이 보이든 숨겨지든 항상 실제 비밀 키를 클립보드에 둡니다.

100% 비공개, 브라우저 전용

비밀 키는 전적으로 사용자 기기에서 생성·인코딩·표시됩니다. 네트워크 요청도, 로깅도, 저장도 없습니다 — 개발자 도구 → 네트워크에서 확인하세요. 서명 키는 절대 제3자에게 닿아선 안 되며, 여기서는 결코 그렇지 않습니다. 그것이 클라이언트 측에서 생성하는 모든 이유입니다.

15개 언어 지원

라벨, 설명, 안내를 포함한 전체 인터페이스가 15개 언어로 현지화되어, 팀이 어디서 일하든 도구를 쓸 수 있고 보안 조언이 명확합니다.

실전 예시

base64url로 HS256 비밀 키 생성(기본값)

Algorithm: HS256 · Format: base64url
3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

HS256은 HMAC-SHA-256으로 서명하므로 RFC 7518 §3.2는 최소 32바이트(256비트) 키를 요구합니다. 이 생성기는 crypto.getRandomValues에서 암호학적으로 안전한 32바이트 무작위 값을 뽑아 base64url — JWT 자체가 사용하는 패딩 없는 URL 안전 알파벳 — 로 인코딩합니다. 32바이트는 43자 base64url 문자열이 됩니다. 그 값을 그대로 JWT_SECRET에 넣으세요. 클릭할 때마다 새로운 비밀 키가 생성되어 두 번 다시 같은 값이 나오지 않습니다.

HS512 비밀 키 생성(64바이트 / 512비트)

Algorithm: HS512 · Format: base64url
k2Lp9XqA0mNbVcZ7rT4wYsHfGjUe8RoIdPlNkBvM3xQ1aWtCyZuS6FhEgJ (86 chars)

HS512는 HMAC-SHA-512를 사용하며, 그 해시 출력은 64바이트이므로 RFC 7518 §3.2는 최소 64바이트(512비트) 키를 요구합니다. 이 도구는 알고리즘을 감지해 바이트 수를 자동으로 올려 주므로 최솟값을 외울 필요가 없습니다. 64바이트 무작위 값은 86자 base64url 문자열, 표준 base64로는 88자, hex로는 128자로 인코딩됩니다. 여기서 더 긴 알고리즘을 고르는 것이 한 번의 클릭으로 더 높은 엔트로피 비밀 키를 확보하는 방법입니다.

.env 줄로 비밀 키 복사

Click "Copy for .env"
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

Copy for .env는 생성된 값을 관례적인 JWT_SECRET=… 할당으로 감싸 주므로, 키 이름을 직접 입력하지 않고도 .env 파일, Docker 시크릿, CI 변수에 바로 붙여 넣을 수 있습니다. 값은 한 줄에 따옴표 없이 남아 — dotenv 형식 로더가 기대하는 정확한 형태입니다. 변수를 더 큰 설정에 포함해야 하나요? 아래 링크된 JSON to .env 변환기와 함께 사용하세요.

CLI에서 비밀 키 재현하기(동등한 강도)

Show the CLI command
openssl rand -base64 32

CLI 패널은 선택한 알고리즘에 맞춰 같은 수의 안전한 무작위 바이트를 뽑는 openssl, Node, Python 명령을 출력합니다 — HS256은 openssl rand -base64 32, HS384는 …48, HS512는 …64입니다. 출력은 바이트 단위로 동일한 문자열이 아니라 동등한 강도의 비밀 키입니다. openssl은 패딩이 있는 표준 base64를 내보내는 반면 이 도구는 기본값으로 base64url을 쓰므로, 알파벳과 끝 문자가 다릅니다. 프로비저닝 스크립트에 맞는 것을 쓰세요. 엔트로피는 동일합니다.

비밀 키 표시 및 숨기기

Toggle the eye icon
•••••••••••••••••••••••••••••••••••••••••••  ↔  3sJ9aFq2kP7m…

비밀 키는 기본적으로 가려져 있어, 데모나 화면 공유 중에 어깨너머로 보이거나 화면 녹화에 잡히지 않습니다. 복사할 준비가 되면 눈 아이콘을 클릭해 드러내고, 그 후에는 다시 숨기세요. 값이 보이든 가려져 있든 Copy와 Copy for .env는 동작합니다 — 클립보드에 들어가는 것은 항상 실제 비밀 키이며 점이 아닙니다.

JWT 비밀 키 생성기 사용법

  1. 1

    서명 알고리즘 선택

    HS256, HS384, HS512 중에서 고르세요. 생성기는 그 HMAC 변형에 대한 RFC 7518 §3.2 최소 키 길이 — 32, 48, 64바이트 — 를 즉시 적용하므로 숫자를 찾아보거나 너무 작은 키를 쓸 위험이 없습니다.

  2. 2

    출력 형식 선택

    base64url이 기본값입니다 — JWT의 기본 URL 안전·패딩 없는 인코딩이죠. 로더가 기대하면 표준 base64로 전환하거나, 시스템이 0–f 문자만 받으면 hex로 전환하세요. 셋 모두 동일한 엔트로피로 같은 무작위 바이트를 인코딩합니다.

  3. 3

    비밀 키 드러내고 복사하기

    비밀 키는 데모나 화면 공유 중 화면에서 가리도록 기본적으로 마스킹됩니다. 눈 아이콘을 클릭해 드러낸 뒤 Copy로 원시 값을 가져오거나, Copy for .env로 .env 파일 또는 CI 변수에 바로 쓸 JWT_SECRET=… 줄을 복사하세요.

  4. 4

    필요할 때 다시 생성

    Regenerate를 클릭해 crypto.getRandomValues에서 뽑은 새롭고 독립적인 비밀 키를 얻으세요. 환경마다 하나씩 생성하고 — 개발·스테이징·운영에서 같은 서명 키를 절대 재사용하지 마세요.

  5. 5

    CLI 대안 사용 또는 서명으로 넘어가기

    CLI 패널은 스크립트 프로비저닝용으로 대응하는 openssl, Node, Python 한 줄 명령을 보여 줍니다. 비밀 키를 손에 넣었다면 JWT 인코더로 토큰에 서명하고 JWT 디코더로 서명을 확인하세요.

흔한 JWT 비밀 키 실수

비밀번호나 짧은 문구를 비밀 키로 사용

사람이 고른 문자열은 서명 키로 쓰기에 엔트로피가 너무 적어, 사전 또는 무차별 대입 공격으로 오프라인에서 복구될 수 있으며, 그 후에는 어떤 토큰이든 위조됩니다. 대신 완전한 엔트로피의 무작위 비밀 키를 생성하세요.

✗ 오류
JWT_SECRET=mySuperSecret123  →  low entropy, brute-forceable
✓ 정상
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0  →  32 random bytes

알고리즘이 요구하는 것보다 짧은 키

RFC 7518 §3.2는 HMAC 키가 적어도 해시 출력만큼 길어야 한다고 요구합니다. HS256에 16바이트 키는 32바이트 하한 아래라 — 서명을 약화하고 일부 라이브러리는 아예 거부합니다.

✗ 오류
16-byte key with HS256  →  below the 32-byte minimum
✓ 정상
32-byte key with HS256  →  meets RFC 7518 §3.2

Math.random으로 키 생성

Math.random은 암호학적으로 안전하지 않습니다 — 출력이 예측 가능하므로 그것으로 만든 비밀 키는 추측 가능하고 서명한 토큰은 위조 가능합니다. 서명 키는 crypto.getRandomValues 같은 CSPRNG에서 와야 합니다.

✗ 오류
Math.random()-based key  →  predictable, unsafe
✓ 정상
crypto.getRandomValues key  →  full entropy

서명 전에 비밀 키를 다시 인코딩

도구가 만든 정확한 문자열을 저장하고 그대로 넣으세요. 한 서비스에서는 base64 디코딩해 바이트로 다루고 다른 서비스에서는 리터럴 문자열로 다루면, 양쪽이 다른 키를 갖게 되어 모든 서명 검사가 실패합니다.

✗ 오류
Service A: raw string · Service B: base64-decoded  →  signatures never match
✓ 정상
Both services use the identical stored string  →  signatures verify

모든 환경에서 같은 비밀 키 재사용

개발·스테이징·운영이 공유하는 하나의 JWT_SECRET은 어디서든 유출되면 모든 곳의 토큰을 위조하게 하고 순환을 전부 아니면 전무로 만듭니다. 환경마다 별개의 비밀 키를 프로비저닝하세요.

✗ 오류
Same JWT_SECRET in dev, staging, prod  →  one leak breaks all
✓ 정상
A unique secret per environment  →  blast radius contained

검증 시 토큰의 alg를 신뢰

검증자가 토큰이 선언한 알고리즘을 받아들이게 두면 alg:none과 HS/RS 혼동 위조가 가능해집니다. 비밀 키가 아무리 강하든 명시적인 알고리즘 화이트리스트를 넘기세요.

✗ 오류
jwt.verify(token, secret)  →  accepts the token's alg
✓ 정상
jwt.verify(token, secret, { algorithms: ['HS256'] })  →  pinned

누가 이 도구를 쓰나

새 서비스용 JWT_SECRET 프로비저닝
HMAC 서명 토큰을 발급하는 API를 띄우나요? 라이브러리가 쓰는 알고리즘을 고르고, 비밀 키를 JWT_SECRET=… 줄로 복사해 서비스 환경에 넣으세요. 개발·스테이징·운영에 별개의 키를 생성하고 — 환경 간에 하나의 비밀 키를 절대 공유하지 마세요.
침해되었거나 오래된 비밀 키 순환
키가 유출이 의심되거나 단순히 순환할 때가 되면, 여기서 새 비밀 키를 생성해 새 kid를 부여하고, 활성 토큰이 만료될 때까지 계속 검증되도록 겹침 구간을 두고 배포하세요. 확인된 침해에서는 즉시 순환하고 받아들이는 집합에서 옛 키를 빼세요.
약하거나 손으로 입력한 키 교체
JWT_SECRET이 짧은 문구이거나 복사한 예제 값인 코드베이스를 물려받았나요? 그 키는 오프라인으로 무차별 대입할 수 있습니다. 완전한 엔트로피의 32바이트 대체 키를 생성하고, 순환 구간 뒤로 교체해, 악용되기 전에 토큰 위조 구멍을 막으세요.
파이프라인에서 키 생성 스크립트화
키를 손이 아니라 CI나 Dockerfile에서 만들어야 하나요? CLI 패널의 openssl, Node, Python 한 줄 명령으로 프로비저닝 스크립트 안에서 동등한 강도의 비밀 키를 만들고, 이 페이지로 각 명령이 만드는 바이트 길이와 인코딩을 이해하세요.
JWT 서명을 안전하게 가르치기
실제 운영 키를 절대 노출하지 않고 HS256이 어떻게 동작하는지 팀에 보여 주세요 — 화면에서 일회용 비밀 키를 생성하고(드러낼 때까지 가려짐), JWT 인코더로 샘플 토큰에 서명하고, JWT 디코더로 검증해 서명-검증 루프 전체를 보이게 하세요.
HS256, HS384, HS512 키 크기 비교
어떤 HMAC 변형으로 표준화할지 결정 중인가요? 알고리즘 사이를 오가며 필요한 키 길이와 인코딩된 문자열이 어떻게 늘어나는지 — 43, 64, 86 base64url 문자 — 보고, 설정에 확정하기 전에 시스템에 맞는 강도 대 토큰 크기 절충을 고르세요.
로컬 개발용 키 생성
로컬 인증 흐름을 돌릴 빠르고 유효한 비밀 키가 필요한가요? 한 번의 클릭으로 생성하고 .env로 복사하면 — 배포 전에 교체하길 잊어버릴 자리표시자가 아니라 실제 CSPRNG 키로 막힘이 풀립니다.

생성기 작동 원리

crypto.getRandomValues(CSPRNG)
비밀 키는 Web Crypto의 암호학적으로 안전한 의사 난수 생성기인 crypto.getRandomValues로 Uint8Array를 채워 생성됩니다. Web Crypto 키 생성을 뒷받침하는 바로 그 엔트로피 원천입니다. Math.random은 어디에서도 쓰이지 않습니다 — 통계적으로 예측 가능해 어떤 암호 키에도 부적합합니다.
RFC 7518 §3.2 키 크기 산정
알고리즘별 바이트 수는 HMAC 키가 해시 출력 크기 이상이어야 한다는 JSON Web Algorithms 요구를 따릅니다. HS256(SHA-256)은 32바이트, HS384(SHA-384)는 48, HS512(SHA-512)는 64입니다. 알고리즘 선택이 최솟값을 정하며, 생성기는 명세 하한 아래의 키를 내보내지 않습니다.
RFC 4648 인코딩(base64url / base64 / hex)
원시 바이트는 RFC 4648 알파벳으로 인코딩됩니다. base64url은 패딩 없이 URL 안전 알파벳을 쓰고(32바이트 → 43자), 표준 base64는 +, /, = 패딩을 쓰며(→ 44자), hex는 바이트당 두 문자를 씁니다(→ 64자). 형식을 전환하면 같은 바이트를 다시 인코딩할 뿐 — 바탕 엔트로피는 바뀌지 않습니다.
왜 base64url이 기본값인가
JWT 구성 요소 자체가 base64url로 인코딩되며, URL 안전·패딩 없는 알파벳 덕분에 base64url 비밀 키는 헤더, URL, 설정 파일에서 이스케이프가 전혀 필요 없습니다. 표준 base64의 + 와 / 와 끝의 = 는 그런 맥락에서 깨질 수 있으므로, base64url이 JWT_SECRET에 보수적인 기본값입니다.
Copy-for-.env 형식
Copy for .env는 JWT_SECRET=를 한 줄에 따옴표 없이 내보냅니다 — dotenv 형식 로더가 수정 없이 파싱하는 형태입니다. 원시 비밀 키는 .env 파일에서 따옴표가 필요한 문자를 절대 포함하지 않으므로, 그 줄은 그대로 붙여 넣어도 안전합니다.
동등한 강도의 CLI 명령, 바이트 단위로 동일하진 않음
CLI 패널의 openssl rand -base64 N, Node randomBytes(N).toString('base64url'), Python secrets.token_urlsafe(N) 명령은 모두 선택한 알고리즘에 맞춰 N개의 안전한 무작위 바이트를 뽑습니다. 같은 문자열이 아니라 동등한 강도의 키를 만듭니다 — openssl은 패딩된 표준 base64를 내보내므로 알파벳과 끝 문자가 이 도구의 base64url 기본값과 다릅니다.

JWT 비밀 키 모범 사례

키 길이를 알고리즘에 맞추기
RFC 7518 §3.2가 요구하듯 HS256은 최소 32바이트, HS384는 48, HS512는 64바이트를 쓰세요. 이 생성기가 대신 해 주지만, 직접 키 크기를 정한다면 해시 출력 길이 아래로 절대 내려가지 마세요 — 너무 작은 HMAC 키는 서명을 약화하고 엄격한 라이브러리가 거부할 수 있습니다.
항상 CSPRNG로 생성하고 비밀번호는 쓰지 않기
JWT 비밀 키는 아무도 외울 필요 없는 기계 자격 증명이므로 엔트로피를 아낌없이 쓰세요. 패스프레이즈, 사전 단어, 손으로 입력한 문자열이 아니라 암호학적으로 안전한 무작위 키를 쓰세요. 사람이 고른 비밀은 JWT 크래킹 도구가 자동화하는 오프라인 무차별 대입 공격의 가장 쉬운 표적입니다.
환경마다 고유한 비밀 키 쓰기
개발·스테이징·운영은 각자의 JWT_SECRET을 가져야 합니다. 하나의 키를 공유하면 위험이 낮은 환경의 유출이 모든 곳의 토큰을 위조하게 하고, 순환이 전부 아니면 전무가 됩니다. 환경마다 별개의 비밀 키를 여기서 생성해 각자의 시크릿 관리자 범위에 저장하세요.
검증할 때 알고리즘 고정하기
검증 측에서는 항상 명시적인 알고리즘 화이트리스트를 — jsonwebtoken에서 algorithms: ['HS256'], PyJWT에서 algorithms=["HS256"] — 넘기고, 토큰 안의 alg 필드를 절대 신뢰하지 마세요. 토큰이 스스로 선언한 알고리즘을 받아들이면, 비밀 키가 아무리 강하든 고전적인 alg 혼동과 alg:none 위조 공격이 가능해집니다.
kid 헤더와 겹치는 키로 순환하기
서명한 토큰에 키 식별자(kid)를 달고 활성 키를 JWKS 엔드포인트로 게시해 무중단 순환을 하세요. 옛 키의 토큰이 만료될 때까지 그것을 계속 받아들이며 새 키로 새 토큰에 서명합니다. 침해가 의심되면 겹침을 건너뛰고 옛 키를 즉시 폐기하세요.

자주 묻는 질문

생성한 JWT 비밀 키가 서버로 전송되나요?
아니요. 비밀 키는 플랫폼의 암호학적으로 안전한 난수 생성기인 crypto.getRandomValues를 사용해 전적으로 브라우저에서 생성됩니다. 바이트는 사용자 기기에서 만들어져 로컬에서 인코딩되며 사용자에게만 보입니다. 업로드되는 것도, 로깅되는 것도, 디스크에 쓰이는 것도, 제3자에게 전송되는 것도 없습니다 — 개발자 도구 → 네트워크를 열고 Regenerate나 Copy를 클릭해 보면 어떤 요청도 발생하지 않음을 확인할 수 있습니다. 즉 여기서 생성한 키는 나타나는 그 순간부터 오직 사용자만의 것이며, 어떤 서버도 그것을 보지 못합니다. 이것이 바로 건네주는 모든 키의 사본을 원칙적으로 보관할 수 있는 웹사이트가 아니라, 클라이언트 측에서 서명 비밀 키를 생성하는 핵심 이유입니다.
안전한 JWT 비밀 키를 어떻게 생성하나요?
세 단계입니다. 먼저 애플리케이션이 사용하는 서명 알고리즘 — HS256, HS384, HS512 — 을 고르면, 생성기가 그 변형의 RFC 7518 §3.2 최솟값(32, 48, 64바이트)에 맞춰 즉시 키 크기를 정하므로 직접 숫자를 고르거나 너무 작은 키를 쓸 위험이 없습니다. 둘째, 인코딩을 base64url(JWT의 기본 URL 안전 형식)로 두거나, 설정 로더가 다른 것을 기대하면 base64나 hex로 전환하세요. 셋째, Copy를 — 또는 바로 붙여 넣을 수 있는 JWT_SECRET=… 줄을 얻으려면 Copy for .env를 — 클릭하고, 그 값을 시크릿 관리자나 환경 변수에 저장하되 절대 소스 관리에 두지 마세요. 모든 바이트가 crypto.getRandomValues에서 오므로 32바이트 키는 이미 256비트의 엔트로피를 지니며, 이는 사람이 고른 비밀을 깨뜨리는 오프라인 무차별 대입 공격의 도달 범위를 한참 벗어납니다. 명령줄을 선호하나요? 이 도구는 터미널에 붙여 넣을 수 있는 동등한 openssl, Node, Python 한 줄 명령도 출력합니다.
HS256 JWT 비밀 키는 얼마나 길어야 하나요?
최소 32바이트(256비트)입니다. JSON Web Algorithms 명세인 RFC 7518 §3.2는 HMAC 서명에 대해 "해시 출력과 같은 크기(예: HS256은 256비트) 또는 그 이상의 키를 반드시 사용해야 한다"고 명시합니다. HS256은 HMAC-SHA-256(256비트 해시)으로 서명하므로 최소 키는 32바이트입니다. HS384는 HMAC-SHA-384를 쓰며 최소 48바이트(384비트)가, HS512는 HMAC-SHA-512를 쓰며 최소 64바이트(512비트)가 필요합니다. 이 생성기는 알고리즘을 고르면 올바른 최솟값을 자동으로 선택하며, 더 긴 키를 요청할 수도 있습니다. 더 짧은 키는 단지 약할 뿐 아니라 명세를 위반하며, 일부 라이브러리는 그런 키로 서명하기를 거부합니다.
base64url, base64, hex의 차이는 무엇이며 어느 것을 골라야 하나요?
셋 모두 같은 무작위 바이트를 인코딩하며, 엔트로피가 아니라 문자 알파벳만 다릅니다. base64url은 JWT의 기본 인코딩으로 — URL 안전 알파벳(+ 와 / 대신 - 와 _)을 쓰고 패딩을 생략하므로 토큰, URL, 헤더 안에서 이스케이프가 전혀 필요 없습니다. 그래서 여기서 기본값입니다. 표준 base64는 +, /, = 패딩을 사용하므로 설정 로더나 라이브러리가 고전적 base64를 특정해 기대할 때 고르세요. hex(base16)는 각 바이트를 0–f 두 문자로 쓰며, 더 길지만 모호하지 않은 문자열을 만들어 시스템이 영숫자가 아닌 문자를 거부할 때 유용합니다. JWT_SECRET 환경 변수에는 base64url이 가장 안전한 기본값이며, 정확한 문자열을 저장하고 변경 없이 서명 라이브러리에 그대로 다시 넣는 한 셋 중 어느 것이든 동작합니다.
약한 JWT 비밀 키가 크랙될 수 있나요?
네 — 그리고 이것이 HMAC 서명 JWT의 가장 큰 단일 위험입니다. HS256/384/512는 하나의 공유 비밀을 쓰므로, 토큰을 손에 넣은 누구든 속도 제한도 서버 접촉도 없이 서명에 대해 오프라인 무차별 대입이나 사전 공격을 돌릴 수 있습니다. hashcat(모드 16500이 JWT를 노립니다)이나 jwt_tool 같은 도구가 바로 이를 위해 만들어졌습니다. 일반 GPU에서 엔트로피가 낮은 비밀 키는 보통 초에서 시간 단위로 무너지고, 사전 단어나 유출된 비밀번호는 거의 즉시 무너질 수 있습니다. 이 생성기가 만드는 완전한 엔트로피의 32바이트 무작위 키는 무차별 대입의 도달 범위를 한참 벗어납니다. 공격자가 비밀 키를 복구하면 관리자 권한을 주장하는 것을 포함해 어떤 토큰이든 위조할 수 있으므로, 비밀 키 강도는 선택 사항이 아닙니다. CSPRNG로 서명 키를 생성하고, 절대 사람이 고른 문자열을 쓰지 마세요. 약한 비밀 키, alg 혼동, 토큰 재생 공격을 더 깊이 다룬 내용은 JWT 보안 모범 사례 가이드를 참고하세요.
비밀번호를 JWT 비밀 키로 쓸 수 있나요?
쓸 수는 있지만 그래선 안 됩니다. 사람이 기억할 수 있는 비밀번호는 — 긴 패스프레이즈라도 — 32바이트 무작위 값보다 훨씬 적은 엔트로피를 지니며, 이는 위에서 설명한 오프라인 무차별 대입 및 사전 공격의 현실적인 표적이 됩니다. JWT 비밀 키는 기계 대 기계 자격 증명이라 아무도 외울 필요가 없으므로, 기억 가능성을 위해 엔트로피를 희생할 이유가 없습니다. 여기서 무작위 비밀 키를 생성해 시크릿 관리자나 환경 변수에 저장하고, 애플리케이션이 그것을 읽게 하세요. 다른 용도로 기억 가능한 자격 증명이 필요하다면 그것은 비밀번호 생성기의 일이고, 사용자 비밀번호 저장이라면 bcrypt 생성기의 단방향 해시의 일이지 — 토큰 서명 키의 일이 아닙니다.
활성 토큰을 깨지 않고 JWT 비밀 키를 어떻게 순환하나요?
단번에 교체하지 말고 겹치게 순환하세요. 서명하는 토큰에 키 식별자(kid 헤더)를 추가해 검증자가 어떤 비밀 키로 확인할지 알게 하고, 활성 키를 — 보통 서비스가 읽는 JWKS 엔드포인트를 통해 — 게시하세요. 순환하려면 여기서 새 비밀 키를 생성하고, 새 kid로 새 토큰에 서명하기 시작하되 이전 키도 검증용으로 계속 받아들이며, 그 키로 서명한 모든 토큰이 만료된 뒤에야 옛 키를 폐기하세요. 그 겹침 구간 덕분에 어떤 유효한 세션도 도중에 무효화되지 않습니다. 침해가 의심되면 점진적 겹침을 건너뛰세요. 즉시 순환하고, 받아들이는 집합에서 옛 키를 빼고, 재인증을 강제해 유출된 토큰이 한 번에 검증되지 않게 하세요.
HMAC(HS*) 키는 RSA나 ECDSA(RS*/ES*) 키와 어떻게 다른가요?
같은 문제를 정반대의 키 모델로 풉니다. HS256/384/512는 HMAC 알고리즘으로, 서명과 검증을 모두 하는 하나의 대칭 비밀 — 이 도구가 생성하는 종류 — 을 쓰므로 토큰을 검증할 수 있는 모든 당사자가 토큰을 위조할 수도 있습니다. 단일 서비스가 자신의 토큰을 직접 발급하고 확인할 때 간단하고 빠르며 이상적입니다. RS*(RSA)와 ES*(ECDSA)는 비대칭으로, 개인 키가 서명하고 별도의 공개 키가 검증만 하는 키 쌍을 씁니다. 서명 키를 절대 노출하지 않고 토큰을 검증해야 하는 누구에게나 공개 키를 건넬 수 있어 — 신원 공급자가 발급한 토큰을 여러 독립 서비스가 검증할 때 올바른 선택입니다. 이 생성기는 HMAC 대칭 비밀만 만듭니다. 생성한 키로 실제 토큰을 조립해 서명하려면 JWT 인코더를, 토큰을 살펴보고 검증하려면 JWT 디코더를 사용하세요.

Bcrypt 해시 생성 및 검증 도구

보안 도구

온라인으로 bcrypt 비밀번호 해시를 생성·검증하세요 — 조절 가능한 비용 인자, $2b$/$2a$/$2y$ 접두사 지원. 100% 브라우저에서 실행, 비밀번호는 업로드되지 않습니다.

JWT 디코더 (JWT Decoder)

보안 도구

무료 JWT 디코더로 JWT 토큰을 온라인에서 즉시 디코딩. 헤더, 페이로드, 서명, 만료, 클레임 확인. 100% 브라우저 기반 — 토큰이 기기를 떠나지 않음. 가입·추적 없음.

JWT 인코더 (JWT Encoder)

보안 도구

무료 온라인 JWT 생성기·인코더. 헤더와 페이로드를 구성하고 HS256, RS256, ES256으로 즉시 서명. 100% 브라우저 기반 — 비밀 키와 개인 키가 기기를 떠나지 않음.

MD5 해시 생성기 · 파일 체크섬 도구

보안 도구

MD5, SHA-256, SHA-1, SHA-512 해시를 온라인에서 무료로 생성합니다. 브라우저에서 텍스트나 파일을 해싱하고 체크섬을 검증하며 결과를 복사할 수 있습니다.

무작위 비밀번호 생성기 (Random Password Generator)

보안 도구

강력한 무작위 비밀번호를 즉시 만드는 무료 온라인 도구. 길이와 문자 종류를 지정해 최대 50개까지 일괄 생성하고 엔트로피 분석을 확인할 수 있습니다.

SHA-1 해시 생성기 (160비트 레거시)

보안 도구

SHA-1 해시를 브라우저에서 무료로 생성합니다. 40자리 16진수 출력, 업로드 없음. Git 지문 조회, 구형 인증서 검사, 마이그레이션 감사용 레거시 도구입니다.