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.