

JSON Web Token (JWT), iki taraf arasında güvenli bir şekilde bilgi alışverişini sağlamak amacıyla kullanılan açık bir standarttır. Bu standart, bir JSON nesnesinin dijital imza ile doğrulanabilir hale getirilmesi prensibine dayanır. JWT’ler genellikle kimlik doğrulama ve yetkilendirme işlemleri için kullanılır.
JWT’nin Yapısı
JWT üç ana bileşenden oluşur:
- Header (Başlık): Algoritma türü ve token tipi gibi bilgileri içerir.
- Payload (Yük): Kullanıcı bilgileri, yetkilendirme bilgileri gibi token’ın taşıyacağı verileri içerir.
- Signature (İmza): Header ve Payload’un base64url formatında kodlanmış halinin, belirli bir gizli anahtar kullanılarak hash fonksiyonu ile imzalanmış halidir.
JWT’nin tipik bir yapısı şu şekildedir:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWT Nasıl Çalışır?
JWT, istemci tarafında (client-side) oluşturulan ve saklanan bir token olup, bir kullanıcıyı doğrulamak veya yetkilendirmek amacıyla kullanılır. Kullanıcı sisteme giriş yaptığında, sunucu JWT’yi oluşturur ve istemciye geri gönderir. Bu token daha sonra her istek ile birlikte sunucuya gönderilir ve sunucu bu token’ı doğrulayarak isteği işler.
PHP ile Kütüphane Kullanılmadan JWT Nasıl Oluşturulur ve Doğrulanır?
JWT token’ları oluşturmak ve doğrulamak için genellikle kütüphaneler kullanılır, ancak bazı durumlarda kütüphane kullanmadan da bu işlemleri gerçekleştirmek isteyebilirsiniz. Aşağıda, PHP kullanarak JWT oluşturma ve doğrulama işlemlerini kütüphane olmadan nasıl yapabileceğinizi gösteren bir örnek bulunmaktadır.
JWT Token Oluşturma
JWT oluşturmak için önce bir header ve payload oluşturulur. Ardından bu veriler base64url formatında kodlanır ve birleştirilir. Son olarak, bu birleşim bir gizli anahtar ile HMAC-SHA256 algoritması kullanılarak imzalanır.
function base64UrlEncode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
function createJWT($header, $payload, $secretKey) {
$headerEncoded = base64UrlEncode(json_encode($header));
$payloadEncoded = base64UrlEncode(json_encode($payload));
$signature = hash_hmac('sha256', "$headerEncoded.$payloadEncoded", $secretKey, true);
$signatureEncoded = base64UrlEncode($signature);
return "$headerEncoded.$payloadEncoded.$signatureEncoded";
}
// Kullanım Örneği
$header = [
'alg' => 'HS256',
'typ' => 'JWT'
];
$payload = [
'userId' => 123,
'iat' => time(),
'exp' => time() + 3600
];
$secretKey = 'your-secret-key';
$jwt = createJWT($header, $payload, $secretKey);
echo "JWT Token: " . $jwt;
JWT Token Doğrulama
JWT doğrulama işlemi, token’ın parçalarını ayırmayı, imzayı yeniden hesaplamayı ve token’ın geçerlilik süresini kontrol etmeyi içerir.
function base64UrlDecode($data) {
return base64_decode(strtr($data, '-_', '+/') . str_repeat('=', 3 - (3 + strlen($data)) % 4));
}
function verifyJWT($jwt, $secretKey) {
list($headerEncoded, $payloadEncoded, $signatureEncoded) = explode('.', $jwt);
$header = json_decode(base64UrlDecode($headerEncoded), true);
$payload = json_decode(base64UrlDecode($payloadEncoded), true);
$signature = base64UrlDecode($signatureEncoded);
$validSignature = hash_hmac('sha256', "$headerEncoded.$payloadEncoded", $secretKey, true);
if (hash_equals($validSignature, $signature)) {
// Token'ın süresini kontrol et
if ($payload['exp'] >= time()) {
return $payload;
}
}
return false;
}
// Kullanım Örneği
$jwt = "your.jwt.token.here";
$secretKey = 'supersecretkey';
$decodedPayload = verifyJWT($jwt, $secretKey);
if ($decodedPayload) {
echo "JWT Doğrulandı! Kullanıcı ID: " . $decodedPayload['userId'];
} else {
echo "JWT geçersiz veya süresi dolmuş.";
}
JWT, modern web uygulamalarında kimlik doğrulama ve yetkilendirme için etkili bir çözüm sunar. PHP ile kütüphane kullanmadan JWT oluşturmak ve doğrulamak mümkündür, ancak bu yaklaşım daha basit ve özelleştirilmiş ihtiyaçlar için uygundur. Üretim ortamlarında güvenliği artırmak ve hata yönetimini daha iyi sağlamak için genellikle bir kütüphane kullanılması önerilir.
Bu temel örnekler, JWT token’larının kütüphane kullanmadan nasıl oluşturulabileceği ve doğrulanabileceği konusunda bir başlangıç sağlar.
Bunları da beğenebilirsiniz

Mikroservis Ödeme Akışlarında Çift Çekim (Double-Charge) Sızıntılarını Önlemek: Kafka Outbox ve Redis Idempotency
Dağıtık ödeme mimarilerinde çift çekim hatalarını sıfıra indirmek için PostgreSQL 15, Kafka Outbox Pattern ve Redis 7.2 ile idempotent tasarım stratejileri.

HNSW vs IVFFlat: pgvector İndeksleme Stratejisinde Sorgu Gecikmesi ve Bellek Tüketimi Dengesi
pgvector 0.5.0+ sürümlerinde 5 milyon+ kayıtlı RAG sistemleri için HNSW ve IVFFlat algoritmalarının p99 gecikme, recall oranları ve bellek maliyeti analizi.

Kritik Sistemlerde Teknik Borcu Azaltmak: Yapay Zeka Ajanları ile Mimari Refactoring
Bu blog yazısı, kritik sistemlerde biriken teknik borcun yarattığı zorlukları ve bu sorunla mücadelede yapay zeka ajanlarının repo düzeyinde mimari refactoring süreçlerine nasıl entegre edilebileceğini derinlemesine inceliyor. Teknik borcu azaltmak, sistem performansını artırmak ve geliştirme süreçlerini hızlandırmak için yenilikçi stratejiler sunulmaktadır.