JWT Kodlayıcı
HS256, HS384, HS512 ile JSON Web Token'ları oluşturun ve imzalayın
Başlık
Yük
Gizli Anahtar
Kodlanmış JWT
Gizli anahtarınız asla tarayıcınızı terk etmez. Tüm imzalama istemci tarafında gerçekleşir.
JWT Kodlaması Nedir?
JWT kodlaması, JSON Web Token oluşturma işlemidir — kriptografik anahtar ile imzalanan taleplerin kompakt, URL'ye uygun bir dizesidir. Sonuç, RFC 7519 tarafından tanımlanan üç bölümlü bir token (başlık.yük.imza) olup sunucular oturum durumunu korumadan doğrulayabilir.
Header, imzalama algoritmasını (ör. HS256) ve token türünü bildirir. Payload, claim'leri içerir — konu (sub), son kullanma zamanı (exp) ve uygulamanızın ihtiyaç duyduğu özel veriler gibi anahtar-değer çiftleri. Her iki bölüm de JSON olarak serileştirilir, ardından base64url ile kodlanır. İmza, gizli anahtar kullanılarak kodlanmış header ve payload üzerinden hesaplanır ve üç segmenti birbirine bağlar.
Oturum çerezlerinin aksine JWT'ler kendi kendine yeterlidir: doğrulayıcının veritabanını sorgulaması veya harici bir hizmeti çağırması gerekmez. Bu durum, JWT tabanlı kimlik doğrulamayı REST API'lerde, mikro hizmetlerde ve durumsuz yetkilendirmenin gecikmeyi azalttığı ve yatay ölçeklendirmeyi kolaylaştırdığı tek sayfalı uygulamalarda popüler kılar.
Neden JWT Kodlayıcı Kullanılır?
JWT'leri elle oluşturmak base64url kodlama, JSON serileştirme ve HMAC hesaplaması gerektirir. Bu araç üç adımı da anında gerçekleştirir; böylece claim'leri doğru ayarlamaya odaklanabilirsiniz.
JWT Kodlayıcı Kullanım Senaryoları
HS256 ve HS384 ve HS512: HMAC Algoritması Karşılaştırması
Her üç algoritma da paylaşılan bir gizli anahtarla HMAC (Hash tabanlı İleti Kimlik Doğrulama Kodu) kullanır. Fark, imza uzunluğunu ve güvenlik marjini etkileyen temel karma işlevindedir. Çoğu uygulama için HS256 yeterli güvenlik sağlar. Uyumluluk gereksinimleri (ör. FIPS-140) daha güçlü bir karma zorunlu kıldığında veya token'larınız yüksek değerli yetkilendirme kararları taşıdığında HS384 veya HS512'yi seçin.
| Algoritma | Karma | İmza | Hız | Tipik kullanım |
|---|---|---|---|---|
| HS256 | SHA-256 | 32 B | Fastest | General purpose, default for most libraries |
| HS384 | SHA-384 | 48 B | Fast | Higher security margin, FIPS-140 compliant |
| HS512 | SHA-512 | 64 B | Fast | Maximum HMAC security, large payloads |
Standart JWT Claim Referansı
RFC 7519, yedi kayıtlı claim tanımlar. Hiçbiri zorunlu değildir; ancak bunları doğru kullanmak birlikte çalışabilirliği ve güvenliği artırır. exp claim'i özellikle önemlidir — gizli anahtar değiştirilmezse son kullanma tarihi olmayan token'lar süresiz olarak geçerli kalır.
| Claim | Ad | Açıklama | Örnek |
|---|---|---|---|
| iss | Issuer | Who issued the token | "auth.example.com" |
| sub | Subject | Who the token represents | "user-123" |
| aud | Audience | Intended recipient service | "api.example.com" |
| exp | Expiration | Unix timestamp — token invalid after this time | 1717203600 |
| nbf | Not Before | Unix timestamp — token invalid before this time | 1717200000 |
| iat | Issued At | Unix timestamp when the token was created | 1717200000 |
| jti | JWT ID | Unique token identifier for revocation tracking | "a1b2c3d4" |
Kodda JWT Kodlama
Bu örnekler JWT'lerin programatik olarak nasıl oluşturulup imzalanacağını göstermektedir. Her kod parçacığı geçerli bir HS256 imzalı token üretir. Üretim sistemlerinde her zaman exp claim'ini ayarlayın ve en az 256 bit uzunluğunda kriptografik olarak rastgele bir gizli anahtar kullanın.
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..."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}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: ... }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...
}