Koder JWT

Twórz i podpisuj JSON Web Tokens za pomocą HS256, HS384, HS512

Nagłówek

Działa lokalnie · Bezpieczne do wklejania sekretów

Ładunek

Działa lokalnie · Bezpieczne do wklejania sekretów

Klucz tajny

Działa lokalnie · Bezpieczne do wklejania sekretów

Zakodowany JWT

Output will appear here…

Twój klucz tajny nigdy nie opuszcza przeglądarki. Całe podpisywanie odbywa się po stronie klienta.

Wypróbuj też:Dekoder JWT

Czym jest kodowanie JWT?

Kodowanie JWT to proces tworzenia JSON Web Token — kompaktnego, bezpiecznego dla adresu URL ciągu zawierającego zestaw oświadczeń podpisanych kluczem kryptograficznym. Wynikiem jest trójczęściowy token (nagłówek.ładunek.podpis) zdefiniowany w RFC 7519, który serwery mogą weryfikować bez utrzymywania stanu sesji.

Nagłówek deklaruje algorytm podpisywania (np. HS256) i typ tokenu. Ładunek zawiera claims — pary klucz-wartość, takie jak podmiot (sub), czas wygaśnięcia (exp) oraz dowolne dane niestandardowe potrzebne aplikacji. Obie części są serializowane jako JSON, a następnie kodowane w formacie base64url. Podpis jest obliczany na podstawie zakodowanego nagłówka i ładunku przy użyciu klucza tajnego, wiążąc wszystkie trzy segmenty razem.

W odróżnieniu od sesyjnych ciasteczek JWT są samowystarczalne: weryfikator nie musi odpytywać bazy danych ani wywoływać zewnętrznej usługi. To sprawia, że uwierzytelnianie oparte na JWT jest popularne w REST API, mikroserwisach i aplikacjach jednostronicowych, gdzie bezstanowa autoryzacja zmniejsza opóźnienia i upraszcza skalowanie poziome.

Po co używać kodera JWT?

Ręczne generowanie JWT wymaga kodowania base64url, serializacji JSON i obliczania HMAC. To narzędzie wykonuje wszystkie trzy kroki natychmiastowo, dzięki czemu możesz skupić się na poprawnym ustawieniu claims.

Natychmiastowe generowanie tokenów
Edytuj nagłówek, ładunek i klucz tajny — podpisany JWT aktualizuje się w czasie rzeczywistym. Bez kroków kompilacji, instalacji bibliotek ani kodu szablonowego.
🔒
Wiele algorytmów HMAC
Przełączaj między HS256, HS384 i HS512 jednym kliknięciem. Nagłówek aktualizuje się automatycznie, a podpis jest natychmiast przeliczany.
🛡️
Przetwarzanie z poszanowaniem prywatności
Całe podpisywanie odbywa się w przeglądarce przy użyciu Web Crypto API. Twój klucz tajny i dane ładunku nigdy nie opuszczają urządzenia — bez serwera, bez logów, bez ryzyka.
📋
Pomocniki claims jednym kliknięciem
Dodaj znaczniki czasu iat, exp+1h lub exp+24h jednym przyciskiem. Nie trzeba ręcznie obliczać znaczników Unix ani wyszukiwać aktualnego czasu epoch.

Przypadki użycia kodera JWT

Testowanie uwierzytelniania w interfejsie frontend
Generuj tokeny z określonymi claims i czasami wygaśnięcia, aby testować przepływy logowania, logikę odświeżania tokenów i zabezpieczenia tras — bez uruchamiania backendowego serwera uwierzytelniającego.
Tworzenie backendowego API
Twórz tokeny testowe z niestandardowymi claims sub, aud i scope, aby testować oprogramowanie pośredniczące autoryzacji, kontrolę dostępu opartą na rolach i sprawdzanie uprawnień podczas lokalnego tworzenia oprogramowania.
Potoki DevOps i CI/CD
Generuj krótkotrwałe tokeny serwisowe dla skryptów wdrożeniowych, testów integracyjnych lub komunikacji między serwisami, gdzie pełny przepływ OAuth dodawałby zbędną złożoność.
Testowanie manualne i QA
Buduj tokeny z granicznymi claims — wygasłe tokeny, brakujące pola, nieprawidłowe odbiorcy — aby sprawdzić, czy API zwraca poprawne odpowiedzi HTTP 401 lub 403.
Audyt bezpieczeństwa
Twórz tokeny podpisane różnymi algorytmami i kluczami o różnej długości, aby sprawdzić, czy logika weryfikacji poprawnie odrzuca słabe lub niedopasowane podpisy.
Nauka i prototypowanie
Studenci i programiści dopiero poznający JWT mogą eksperymentować z polami nagłówka, strukturami claims i algorytmami podpisywania, aby zrozumieć, jak działa każda część tokenu.

HS256 vs HS384 vs HS512: porównanie algorytmów HMAC

Wszystkie trzy algorytmy używają HMAC (Hash-based Message Authentication Code) z kluczem wspólnym. Różnica tkwi w funkcji skrótu, która wpływa na długość podpisu i margines bezpieczeństwa. Dla większości zastosowań HS256 zapewnia wystarczające bezpieczeństwo. Wybierz HS384 lub HS512, gdy wymagania zgodności (np. FIPS-140) wymagają silniejszego skrótu lub gdy tokeny zawierają decyzje autoryzacyjne o wysokiej wartości.

AlgorytmSkrótPodpisSzybkośćTypowe zastosowanie
HS256SHA-25632 BFastestGeneral purpose, default for most libraries
HS384SHA-38448 BFastHigher security margin, FIPS-140 compliant
HS512SHA-51264 BFastMaximum HMAC security, large payloads

Informacje o standardowych claims JWT

RFC 7519 definiuje siedem zarejestrowanych claims. Żaden nie jest wymagany, ale ich poprawne stosowanie poprawia interoperacyjność i bezpieczeństwo. Claim exp jest szczególnie ważny — tokeny bez czasu wygaśnięcia są ważne bezterminowo, jeśli klucz tajny nie jest rotowany.

ClaimNazwaOpisPrzykład
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"

Kodowanie JWT w kodzie

Te przykłady pokazują, jak programowo tworzyć i podpisywać JWT. Każdy fragment kodu tworzy prawidłowy token podpisany HS256. W systemach produkcyjnych zawsze ustawiaj claim exp i używaj kryptograficznie losowego klucza tajnego o długości co najmniej 256 bitów.

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...
}

Często zadawane pytania

Jaka jest różnica między kodowaniem a dekodowaniem JWT?
Kodowanie JWT tworzy podpisany token na podstawie nagłówka, ładunku i klucza tajnego. Dekodowanie JWT odwraca ten proces — odczytuje zakodowane w base64url nagłówek i ładunek z powrotem do formatu JSON. Dekodowanie nie wymaga klucza tajnego; kodowanie zawsze go wymaga, ponieważ podpis musi zostać obliczony.
Jak długi powinien być mój klucz tajny JWT?
Dla HS256 używaj klucza o długości co najmniej 256 bitów (32 bajty). Dla HS384 co najmniej 384 bity (48 bajtów). Dla HS512 co najmniej 512 bitów (64 bajty). Krótsze klucze są technicznie akceptowane przez większość bibliotek, ale obniżają rzeczywiste bezpieczeństwo podpisu HMAC. Generuj klucze przy użyciu kryptograficznie bezpiecznego generatora losowego, a nie hasła wybranego przez człowieka.
Czy bezpieczne jest używanie tego narzędzia z prawdziwymi kluczami tajnymi?
To narzędzie przetwarza wszystko w przeglądarce przy użyciu Web Crypto API — żadne dane nie są wysyłane na żaden serwer. Mimo to, jako ogólna zasada bezpieczeństwa, unikaj wklejania produkcyjnych kluczy tajnych do jakichkolwiek narzędzi webowych. W zarządzaniu kluczami produkcyjnymi używaj zmiennych środowiskowych lub menedżera sekretów, takiego jak HashiCorp Vault lub AWS Secrets Manager.
Czy powinienem używać HS256 czy RS256 w mojej aplikacji?
Używaj HS256, gdy ta sama usługa zarówno tworzy, jak i weryfikuje tokeny — jest szybszy i prostszy. Używaj RS256 (asymetrycznego), gdy usługi zewnętrzne muszą weryfikować Twoje tokeny bez możliwości ich tworzenia. RS256 jest powszechny u dostawców OAuth 2.0, OpenID Connect i w architekturach SaaS z wieloma najemcami.
Dlaczego mój JWT wygasa natychmiast po utworzeniu?
Claim exp używa znaczników czasu Unix w sekundach, nie w milisekundach. Jeśli ustawisz exp na Date.now() (który zwraca milisekundy), token będzie wyglądał na wygasający za tysiące lat — lub jeśli przypadkowo użyjesz wartości w milisekundach tam, gdzie oczekiwane są sekundy, biblioteki mogą zinterpretować go jako już wygasły. Zawsze używaj Math.floor(Date.now() / 1000) w JavaScript lub int(time.time()) w Pythonie.
Czy mogę umieszczać poufne dane w ładunku JWT?
Możesz, ale nie powinieneś. Ładunek JWT jest kodowany w formacie base64url, a nie szyfrowany — każdy posiadający token może odczytać claims. Nie przechowuj haseł, numerów kart kredytowych ani danych osobowych w ładunku. Jeśli musisz zawrzeć poufne informacje, użyj JWE (JSON Web Encryption) zdefiniowanego w RFC 7516, który szyfruje cały ładunek.
Co się stanie, jeśli zmienię ładunek po podpisaniu?
Podpis staje się nieważny. Podpis HMAC jest obliczany na podstawie dokładnych bajtów zakodowanego nagłówka i ładunku. Jakakolwiek zmiana — nawet dodanie spacji lub zmiana jednego znaku — powoduje powstanie zupełnie innego podpisu. Prawidłowo zaimplementowany weryfikator odrzuci token z błędem niezgodności podpisu.