ToolDeck

ตัวเข้ารหัส JWT

สร้างและลงนาม JSON Web Tokens ด้วย HS256, HS384, HS512

ส่วนหัว

ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ

เนื้อหา

ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ

คีย์ลับ

ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ

JWT ที่เข้ารหัส

Output will appear here…

คีย์ลับของคุณไม่ต้องออกจากเบราว์เซอร์ของคุณ การลงนามทั้งหมดเกิดขึ้นที่ฝั่งไคลเอนต์

ลองดูด้วย:ถอดรหัส JWT

JWT Encoding คืออะไร?

JWT encoding คือกระบวนการสร้าง JSON Web Token — สตริงที่กะทัดรัดและปลอดภัย URL ที่มีชุดของ claims ที่ลงนามด้วยคีย์การเข้ารหัส ผลลัพธ์คือ token สามส่วน (ส่วนหัว.ข้อมูล.ลายเซ็น) ที่กำหนดโดย RFC 7519 ที่เซิร์ฟเวอร์สามารถตรวจสอบได้โดยไม่ต้องรักษาสถานะเซสชั่น

header ประกาศอัลกอริทึมการลงนาม (เช่น HS256) และประเภทโทเค็น payload บรรจุ claims — คู่คีย์-ค่า เช่น subject (sub), เวลาหมดอายุ (exp) และข้อมูลที่กำหนดเองที่แอปพลิเคชันของคุณต้องการ ทั้งสองส่วนถูกแปลงเป็น JSON จากนั้น base64url-encoded ส่วน signature คำนวณจาก header และ payload ที่เข้ารหัสแล้วโดยใช้คีย์ลับ ผูกทั้งสามส่วนเข้าด้วยกัน

ต่างจาก session cookie JWT เป็นแบบพึ่งพาตัวเอง: ผู้ยืนยันไม่ต้องสอบถามฐานข้อมูลหรือเรียกบริการภายนอก ทำให้การตรวจสอบตัวตนด้วย JWT เป็นที่นิยมใน REST API ไมโครเซอร์วิส และ single-page application ที่การอนุญาตแบบไร้สถานะช่วยลด latency และทำให้การขยายแนวนอนง่ายขึ้น

ทำไมต้องใช้เครื่องมือเข้ารหัส JWT?

การสร้าง JWT ด้วยมือต้องใช้การ base64url encoding การแปลงเป็น JSON และการคำนวณ HMAC เครื่องมือนี้จัดการทั้งสามขั้นตอนทันที เพื่อให้คุณมุ่งเน้นไปที่การกำหนด claims ได้อย่างถูกต้อง

สร้างโทเค็นทันที
แก้ไข header, payload และคีย์ลับ — JWT ที่ลงนามแล้วจะอัปเดตแบบ real-time ไม่ต้องมีขั้นตอน build ไม่ต้องติดตั้ง library ไม่ต้องเขียน boilerplate code
🔒
รองรับหลายอัลกอริทึม HMAC
สลับระหว่าง HS256, HS384 และ HS512 ด้วยคลิกเดียว header จะอัปเดตโดยอัตโนมัติและ signature จะถูกคำนวณใหม่ทันที
🛡️
ประมวลผลแบบ Privacy-First
การลงนามทั้งหมดเกิดขึ้นในเบราว์เซอร์ของคุณโดยใช้ Web Crypto API คีย์ลับและข้อมูล payload ของคุณจะไม่ออกจากเครื่องของคุณ — ไม่มีเซิร์ฟเวอร์ ไม่มี log ไม่มีความเสี่ยง
📋
ปุ่มช่วยเพิ่ม Claim อัตโนมัติ
เพิ่ม iat, exp+1h หรือ exp+24h timestamp ด้วยปุ่มเดียว ไม่ต้องคำนวณ Unix timestamp ด้วยตนเองหรือค้นหาเวลา epoch ปัจจุบัน

กรณีการใช้งานเครื่องมือเข้ารหัส JWT

การทดสอบการตรวจสอบตัวตนฝั่ง Frontend
สร้างโทเค็นที่มี claims และเวลาหมดอายุที่กำหนดเพื่อทดสอบ login flow, ตรรกะการรีเฟรชโทเค็น และ protected route guard โดยไม่ต้องรัน backend auth server
การพัฒนา Backend API
สร้างโทเค็นทดสอบที่มี claims sub, aud และ scope ที่กำหนดเองเพื่อทดสอบ authorization middleware, การควบคุมการเข้าถึงตามบทบาท และการตรวจสอบสิทธิ์ในระหว่างการพัฒนาในเครื่อง
DevOps & CI/CD Pipeline
สร้างโทเค็นบริการที่มีอายุสั้นสำหรับสคริปต์การ deploy, การทดสอบ integration หรือการสื่อสารระหว่างเซอร์วิส ที่ OAuth flow แบบเต็มจะเพิ่มความซับซ้อนโดยไม่จำเป็น
การทดสอบ QA & Manual
สร้างโทเค็นที่มี claims กรณีขอบ — โทเค็นหมดอายุ, ฟิลด์ที่ขาดหาย, audience ผิด — เพื่อยืนยันว่า API ของคุณส่งคืนการตอบสนอง HTTP 401 หรือ 403 ที่ถูกต้อง
การตรวจสอบความปลอดภัย
สร้างโทเค็นที่ลงนามด้วยอัลกอริทึมและความยาวคีย์ลับต่างกันเพื่อยืนยันว่าตรรกะการยืนยันของคุณปฏิเสธ signature ที่อ่อนแอหรือไม่ตรงกันอย่างถูกต้อง
การเรียนรู้และการสร้างต้นแบบ
นักเรียนและนักพัฒนาที่เพิ่งเริ่มต้นกับ JWT สามารถทดลองกับฟิลด์ header, โครงสร้าง claim และอัลกอริทึมการลงนามเพื่อทำความเข้าใจว่าแต่ละส่วนของโทเค็นทำงานอย่างไร

HS256 vs HS384 vs HS512: การเปรียบเทียบอัลกอริทึม HMAC

ทั้งสามอัลกอริทึมใช้ HMAC (Hash-based Message Authentication Code) ร่วมกับคีย์ลับที่แชร์ ความแตกต่างอยู่ที่ฟังก์ชัน hash พื้นฐาน ซึ่งส่งผลต่อความยาว signature และระยะขอบความปลอดภัย สำหรับแอปพลิเคชันส่วนใหญ่ HS256 มีความปลอดภัยเพียงพอ เลือก HS384 หรือ HS512 เมื่อข้อกำหนดการปฏิบัติตามกฎเกณฑ์ (เช่น FIPS-140) กำหนดให้ใช้ hash ที่แข็งแกร่งขึ้น หรือเมื่อโทเค็นของคุณรองรับการตัดสินใจอนุญาตที่มีมูลค่าสูง

อัลกอริทึมHashSignatureความเร็วการใช้งานทั่วไป
HS256SHA-25632 BFastestGeneral purpose, default for most libraries
HS384SHA-38448 BFastHigher security margin, FIPS-140 compliant
HS512SHA-51264 BFastMaximum HMAC security, large payloads

การอ้างอิง Standard JWT Claims

RFC 7519 กำหนด registered claims เจ็ดรายการ ไม่มีรายการใดที่บังคับ แต่การใช้งานอย่างถูกต้องช่วยเพิ่ม interoperability และความปลอดภัย claim exp มีความสำคัญเป็นพิเศษ — โทเค็นที่ไม่มีวันหมดอายุจะใช้งานได้ไม่จำกัดหากไม่มีการหมุนเวียนคีย์ลับ

Claimชื่อคำอธิบายตัวอย่าง
issIssuerWho issued the token"auth.example.com"
subSubjectWho the token represents"user-123"
audAudienceIntended recipient service"api.example.com"
expExpirationUnix timestamp — token invalid after this time1717203600
nbfNot BeforeUnix timestamp — token invalid before this time1717200000
iatIssued AtUnix timestamp when the token was created1717200000
jtiJWT IDUnique token identifier for revocation tracking"a1b2c3d4"

การเข้ารหัส JWT ในโค้ด

ตัวอย่างเหล่านี้แสดงวิธีสร้างและลงนาม JWT โดยใช้โปรแกรม แต่ละตัวอย่างสร้างโทเค็นที่ลงนาม HS256 ที่ถูกต้อง สำหรับระบบ production ควรตั้ง claim exp เสมอและใช้คีย์ลับที่สุ่มแบบ cryptographically secure อย่างน้อย 256 bits

JavaScript (Web Crypto API)
async function signJWT(payload, secret, alg = 'HS256') {
  const header = { alg, typ: 'JWT' }
  const enc = new TextEncoder()

  // Base64url encode header and payload
  const b64url = (obj) =>
    btoa(JSON.stringify(obj)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')

  const h = b64url(header)
  const p = b64url(payload)

  // Sign with HMAC-SHA256
  const key = await crypto.subtle.importKey(
    'raw', enc.encode(secret),
    { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']
  )
  const sig = await crypto.subtle.sign('HMAC', key, enc.encode(`${h}.${p}`))
  const s = btoa(String.fromCharCode(...new Uint8Array(sig)))
    .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')

  return `${h}.${p}.${s}`
}

// Usage
const token = await signJWT(
  { sub: 'user-123', name: 'Alice', iat: Math.floor(Date.now() / 1000) },
  'your-256-bit-secret'
)
// → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."
Python (PyJWT)
import jwt
import time

payload = {
    "sub": "user-123",
    "name": "Alice",
    "iat": int(time.time()),
    "exp": int(time.time()) + 3600,  # expires in 1 hour
}

# Sign with HS256 (default)
token = jwt.encode(payload, "your-256-bit-secret", algorithm="HS256")
# → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."

# Verify and decode
decoded = jwt.decode(token, "your-256-bit-secret", algorithms=["HS256"])
# → {"sub": "user-123", "name": "Alice", "iat": 1717200000, "exp": 1717203600}
Node.js (jsonwebtoken)
const jwt = require('jsonwebtoken')

const payload = {
  sub: 'user-123',
  name: 'Alice',
  role: 'admin',
}

// Sign — iat is added automatically
const token = jwt.sign(payload, 'your-256-bit-secret', {
  algorithm: 'HS256',
  expiresIn: '1h',    // sets exp claim
  issuer: 'auth.example.com',  // sets iss claim
})

// Verify
const decoded = jwt.verify(token, 'your-256-bit-secret')
// → { sub: 'user-123', name: 'Alice', role: 'admin', iat: ..., exp: ... }
Go (golang-jwt)
package main

import (
    "fmt"
    "time"
    "github.com/golang-jwt/jwt/v5"
)

func main() {
    claims := jwt.MapClaims{
        "sub":  "user-123",
        "name": "Alice",
        "iat":  time.Now().Unix(),
        "exp":  time.Now().Add(time.Hour).Unix(),
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    signed, _ := token.SignedString([]byte("your-256-bit-secret"))
    fmt.Println(signed)
    // → eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi...
}

คำถามที่พบบ่อย

การเข้ารหัส JWT ต่างจากการถอดรหัส JWT อย่างไร?
การเข้ารหัส JWT สร้างโทเค็นที่ลงนามจาก header, payload และคีย์ลับ การถอดรหัส JWT ทำกระบวนการย้อนกลับ — อ่าน header และ payload ที่เข้ารหัส base64url กลับมาเป็น JSON การถอดรหัสไม่ต้องใช้คีย์ลับ แต่การเข้ารหัสต้องใช้เสมอเพราะต้องคำนวณ signature
คีย์ลับ JWT ควรยาวแค่ไหน?
สำหรับ HS256 ใช้คีย์ลับอย่างน้อย 256 bits (32 bytes) สำหรับ HS384 ใช้อย่างน้อย 384 bits (48 bytes) สำหรับ HS512 ใช้อย่างน้อย 512 bits (64 bytes) คีย์ที่สั้นกว่าได้รับการยอมรับทางเทคนิคจาก library ส่วนใหญ่ แต่จะลดความปลอดภัยที่แท้จริงของ HMAC signature สร้างคีย์ลับด้วยตัวสร้างค่าสุ่มที่ปลอดภัยทาง cryptographic ไม่ใช่ passphrase ที่มนุษย์เลือก
การใช้เครื่องมือนี้กับคีย์ลับจริงปลอดภัยหรือไม่?
เครื่องมือนี้ประมวลผลทุกอย่างในเบราว์เซอร์ของคุณโดยใช้ Web Crypto API — ไม่มีข้อมูลใดถูกส่งไปยังเซิร์ฟเวอร์ใด อย่างไรก็ตาม หลีกเลี่ยงการวางคีย์ลับของ production ลงในเครื่องมือเว็บใด ๆ ในฐานะแนวปฏิบัติด้านความปลอดภัยทั่วไป สำหรับการจัดการคีย์ใน production ใช้ environment variable หรือ secrets manager เช่น HashiCorp Vault หรือ AWS Secrets Manager
ควรใช้ HS256 หรือ RS256 สำหรับแอปพลิเคชันของฉัน?
ใช้ HS256 เมื่อบริการเดียวกันทั้งสร้างและยืนยันโทเค็น — มันเร็วกว่าและง่ายกว่า ใช้ RS256 (asymmetric) เมื่อบริการของบุคคลที่สามต้องการยืนยันโทเค็นของคุณโดยไม่สามารถสร้างได้ RS256 เป็นที่นิยมใน OAuth 2.0 provider, OpenID Connect และสถาปัตยกรรม multi-tenant SaaS
ทำไม JWT ของฉันถึงหมดอายุทันทีหลังสร้าง?
claim exp ใช้ Unix timestamp เป็นวินาที ไม่ใช่มิลลิวินาที หากคุณตั้ง exp เป็น Date.now() (ซึ่งคืนค่าเป็นมิลลิวินาที) โทเค็นจะดูเหมือนหมดอายุในอีกหลายพันปี — หรือหากคุณใช้ค่ามิลลิวินาทีโดยไม่ตั้งใจในที่ที่ต้องการวินาที library อาจตีความว่าหมดอายุแล้ว ควรใช้ Math.floor(Date.now() / 1000) ใน JavaScript หรือ int(time.time()) ใน Python เสมอ
ฉันสามารถใส่ข้อมูลสำคัญใน JWT payload ได้หรือไม่?
ทำได้ แต่ไม่ควรทำ JWT payload เป็นเพียงการ base64url-encoded ไม่ใช่การเข้ารหัส — ใครก็ตามที่มีโทเค็นสามารถอ่าน claims ได้ อย่าเก็บรหัสผ่าน หมายเลขบัตรเครดิต หรือข้อมูลส่วนบุคคลใน payload หากจำเป็นต้องรวมข้อมูลสำคัญ ใช้ JWE (JSON Web Encryption) ตามที่กำหนดใน RFC 7516 ซึ่งเข้ารหัส payload ทั้งหมด
จะเกิดอะไรขึ้นถ้าฉันเปลี่ยน payload หลังจากลงนาม?
signature จะกลายเป็นไม่ถูกต้อง HMAC signature คำนวณจาก bytes ที่แน่นอนของ header และ payload ที่เข้ารหัสแล้ว การเปลี่ยนแปลงใด ๆ — แม้แต่การเพิ่มช่องว่างหรือเปลี่ยนตัวอักษรเดียว — จะสร้าง signature ที่แตกต่างออกไปอย่างสิ้นเชิง ผู้ยืนยันที่ใช้งานอย่างถูกต้องจะปฏิเสธโทเค็นพร้อมข้อผิดพลาด signature mismatch

เครื่องมือที่เกี่ยวข้อง