JSON Web Token (JWT) Nedir ve PHP ile Nasıl Kullanılır?
Blog'a Dön

JSON Web Token (JWT) Nedir ve PHP ile Nasıl Kullanılır?

Buğra Şıkel

json web token
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:

  1. Header (Başlık): Algoritma türü ve token tipi gibi bilgileri içerir.
  2. Payload (Yük): Kullanıcı bilgileri, yetkilendirme bilgileri gibi token’ın taşıyacağı verileri içerir.
  3. 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

PHP ile Brute Force (Kaba Kuvvet) Saldırısına Karşı Önlem Alma
8 Aralık 2022

PHP ile Brute Force (Kaba Kuvvet) Saldırısına Karşı Önlem Alma

PHP ile kullanıcılarımızın oturum açmalarını içeren sistemler kuruyoruz. Bu sistemlerde alabileceğimiz saldırılardan en yaygın olanlardan birisi Brute Force yani kaba kuvvet saldırısıdır. Brute Force saldırısı,…

Devamını Oku
PHP ile Merkez Bankası Kurlarını Çekmek
15 Haziran 2023

PHP ile Merkez Bankası Kurlarını Çekmek

Merhabalar, web uygulamaları geliştirirken, çeşitli finansal verilere ihtiyaç duyabiliriz. Özellikle, kullanıcılarımızın döviz kurlarına erişebilmesini sağlamak istediğimiz durumlar olabilir. Bu noktada, Merkez Bankası’nın sağladığı güncel kurları…

Devamını Oku
PHP ile IMAP Kullanarak Mail Okuma: Adım Adım Rehber
14 Ağustos 2024

PHP ile IMAP Kullanarak Mail Okuma: Adım Adım Rehber

IMAP (Internet Message Access Protocol), e-posta mesajlarını bir sunucudan almanızı sağlayan bir protokoldür. PHP’de IMAP kullanarak, bir e-posta sunucusundan gelen mesajları okuyabilir ve bunları uygulamanızda…

Devamını Oku
AI Asistan