Taşıyıcı jetonlar nedir?
Taşıyıcı jetonların ne olduğunu, OAuth 2.0 ve JWT'de nasıl çalıştıklarını, erişim jetonlarından farklarını ve en iyi uygulamaları öğrenin.
Taşıyıcı jetonların ne olduğunu, OAuth 2.0 ve JWT'de nasıl çalıştıklarını, erişim jetonlarından farklarını ve en iyi uygulamaları öğrenin.
Hemen hemen tüm modern uygulama girişlerinin veya API isteklerinin arkasında sessiz bir işçi bulunur: taşıyıcı jeton. Farkına varmasan da, her hizmeti bağladığında, giriş yaptığında veya buluttan veri çekerken o oradadır.
Bu rehber, taşıyıcı jetonların ne işe yaradığını, neden önemli olduklarını ve onları nasıl güvenli bir şekilde ele alabileceğini anlatır.
Bir taşıyıcı jeton, genellikle karakterlerden oluşan bir veri parçasıdır ve elinde bulunduranın bir kaynağa erişmeye yetkili olduğunu kanıtlar. Önemli olan, kime verilmiş olursa olsun jetonu taşıyanın (bearer), ek bir kanıt sunmasına gerek olmadan onu kullanabilmesidir.
Bir uçak biniş kartını düşün. Elindeyse, güvenlikten geçebilir ve uçağa binebilirsin. Kart geçerliyse kimse tekrar kimliğini sormaz. Aynı şekilde, bir taşıyıcı jeton da uygulamanın her seferinde kimliğini tekrar kontrol etmeden “API'ye binmesine” izin verir.
Mesela, telefonda Spotify'a giriş yaptıktan sonra, her şarkı çalmak istediğinde tekrar parola girmen gerekmez. Bunun yerine, uygulama bir taşıyıcı jeton saklar ve Spotify sunucularına "bu istek yetkili bir kullanıcıdan geliyor" der.
Taşıyıcı jetonların akışı birkaç adıma ayrılabilir:
Kullanıcı giriş yapar
Diyelim ki bir bankacılık uygulamasına kullanıcı adı ve şifreyle giriş yapıyorsun.
Kimlik sağlayıcısı jeton üretir
Bilgiler doğrulandıktan sonra, kimlik doğrulama sunucusu sana bir taşıyıcı jeton gönderir. Örneğin:
İstemci jetonu kullanır
“Bakiye Sorgula” veya “Para Transferi” gibi işlemlerde, uygulama HTTP isteğine jetonu ekler:
API doğrulama yapar
Sunucu jetonun hâlâ geçerli (süresi dolmamış ve gerekli izinleri içeriyor, örn. read:balance veya write:transfer) olup olmadığını kontrol eder.
Erişim verilir
Tüm kontroller geçerse, sunucu istenen bilgileri gönderir.
Bu model, geliştiricilerin sürekli olarak kullanıcı adı ve parola girmek yerine taşıyıcı jeton ile doğrulandığı GitHub API’leri gibi hizmetlerde yaygın olarak kullanılır.
Taşıyıcı jetonlar, internet güvenliğinde yaygın sorunları çözdükleri için öne çıktı. Sunucu tabanlı oturumlardan farklı olarak, her oturumda bir kullanıcı verisi saklamaya gerek yoktur. Bunun yerine, jetonun kendisi sunucunun gelen istekleri doğrulaması için yeterli bilgiyi içerir.
Örneğin, onlarca mikroservisin birbirleriyle iletişim kurduğu bir mimaride merkezi oturum saklamak karmaşık ve verimsiz olurdu. Taşıyıcı jetonlarla her hizmet isteği bağımsız olarak doğrulayabilir, sistemi hem hafif hem de ölçeklenebilir hale getirir.
Somut bir örnek: Slack’in API’leri yoğun olarak taşıyıcı jetonları kullanır. Slack botu oluşturduğunda, her kullanıcı için oturum saklamadan botunun Slack uç noktalarına erişmesini sağlayan bir jeton alırsın.
Birçok taşıyıcı jeton, JWT (JSON Web Token) olarak uygulanır. Bunlar, kullanıcı hakkında ve sahip olduğu izinlerle ilgili bilgileri içeren kodlanmış karakter dizileridir.
Bir örnek JWT’yi açalım:
Bu şu anlama gelir:
sub: Kullanıcının benzersiz kimliği.name: Kullanıcının adı.iat: Jetonun oluşturulma zamanı (timestamp).exp: Son kullanma zamanı (jetonun geçerliliği bittiği an).scope: İzinler, burada hem mesajları okuma hem de yazma izni var.Örneğin, Jane’in jetonunda sadece read:messages olsaydı, uygulama yalnızca onun mesajlarını çekebilir, onun adına yeni mesaj gönderemezdi.
Taşıyıcı jeton ve erişim jetonu terimleri sıkça bir arada geçse de, tamamıyla aynı değildirler.
Bir erişim jetonu, bir kullanıcının kaynağa erişim yetkisini temsil eden bir kimlik bilgisidir. Şu bilgileri taşır:
Bunu, okul müdürünün imzaladığı izin kâğıdı gibi düşünebilirsin. Öğretmene (API'ye), senin geziye katılmana (kaynağa erişmene) izinli olduğunu söyler.
Örneğin, bulut depolama servisine giriş yaptığında, read:files kapsamına sahip bir erişim jetonu verilir. Bu jeton, depolama API’sine “Bu kullanıcı sadece dosya okuyabilir, silemez” mesajı taşır.
Taşıyıcı jeton, erişim jetonlarının bir çeşididir. Taşıyıcı terimi, jetonun nasıl kullanılacağını tanımlar: kim jetonu sunarsa, ek bir kimlik kanıtı sunmadan, onu "taşıyarak” kaynağa erişim sağlayabilir.
Yani:
Başka jeton türleri de vardır: anahtar taşıyan jetonlar (holder-of-key tokens) gibi. Bunlar, jetonun yanında istemcinin bir şifreleme anahtarı sahibi olduğunu da kanıtlamasını ister. Taşıyıcı jetonlar bu ek adımı atlar; bu da onları daha basit ama çalınırsa daha riskli yapar.
<token> başlığında kullanılacak bir erişim jetonu döndürür.Yani OAuth dökümantasyonunda “erişim jetonu” görürsen, görüntü aksi belirtilmedikçe genelde taşıyıcı bir jetondan bahsediyordur.
Daha net olması için, taşıyıcı jetonları diğer yaygın jeton türleriyle karşılaştıralım:
Taşıyıcı jetonlar ve erişim jetonları birbirinin alternatifi değildir — kapsam olarak ilişkilidirler:
Bir taşıyıcı jetonu doğrulamak, API’nizi yetkisiz erişime karşı koruyan şeydir. Jetonunuz JWT ise doğrulama yerel ve hızlıdır. API, her seferinde veren tarafa (issuer) danışmadan jetonu kontrol edebilir.
Bir API gateway'i veya ara yazılımı kurarken bu listeyi kullanabilirsin.
İmza
Başlıktaki algoritmayı kullanarak (örn. RS256), imzayı doğrula. Sağlayıcının JWKS uç noktasından anahtarları çek, uygun kid ile olanı seç ve önbelleğe al.
Sağlayıcı (iss)
Jetonun iss değerini, güvenilir sağlayıcı URL’inle tam ve doğru şekilde karşılaştır.
Hedef (aud)
Jetonun senin API’nin için olup olmadığını kontrol et. Örneğin https://api.example.com veya mantıksal bir hedef dizesiyle karşılaştır.
Süre sonu (exp) ve Başlangıç zamanı (nbf)
Süresi dolmuş jetonları reddet. nbf ile jetonlar erken kullanılmasın. Küçük saat farklarına (clock skew), genellikle 30-60 sn izin ver.
Oluşturulma zamanı (iat)
Hata ayıklama ve bazı sıkı sistemlerde eski jetonları reddetmek için kullanışlıdır.
Jeton türü
Gerçekten bir erişim jetonu olduğundan emin ol. Bazı sağlayıcılar typ: "at+jwt" veya benzeri kullanır. API erişimi için kimlik jetonlarını kabul etme.
Kapsamlar / izinler
scope veya sağlayıcıya özel talepleri (permissions, roles) oku. En az ayrıcalık (least privilege) ilkesini her uç noktada uygula.
Konu (sub)
Kullanıcı veya istemci ID'si. Kaynakları ilişkilendirmek ve denetim için kullanılır.
Tekrar kullanma ve iptal (isteğe bağlı ama akıllıca)
Hassas noktalarda kısa ömürlü bir jti kara listesini (denylist) kontrol et veya aktif oturum kaydı doğrula. Bu, çıkış yapılınca veya güvenlik ihlali şüphesinde faydalıdır.
Taşıyıcı jetonlar “kimde olursa o kullanır” mantığıyla çalıştığı için, ev anahtarı gibi değerli görülmelidir. Anahtarın çalınırsa kapı kilidini değiştirene kadar biri kapını açabilir.
Yaygın riskler:
Bazı geliştiriciler yanlışlıkla taşıyıcı jetonları herkese açık GitHub depolarında paylaşınca gerçek dünyada ihlaller oldu. Saldırganlar bu jetonları arayıp hemen yetkisiz erişim elde edebilir.
Taşıyıcı jetonları güvenli kullanmak için birkaç en iyi uygulamayı izlemek gerekir. İşte örneklerle:
Her zaman HTTPS kullan
Jetonu halka açık bir kafedeki Wi-Fi’da düz HTTP üzerinden ilettiğini düşün. Ağ dinleyen biri jetonu kopyalayıp senin yerine giriş yapabilir.
Kısa ömürlü erişim jetonları kullan
Çoğu platformda jetonlar bir saat içinde geçersiz hale gelir. Örneğin, Google OAuth jetonları tipik olarak bir saat sonra yenilenmeli.
Yenileme jetonlarını dikkatli kullan
Yenileme jetonu, kullanıcıyı tekrar giriş yaptırmadan yeni erişim jetonu almaya yarar. Ama bunlar istemci tarafında değil, sunucuda şifreli bir veritabanında tutulmalı.
Jeton izinlerini en az yetkiye göre sınırla
Eğer uygulaman sadece bir kullanıcının takvimini okuması gerekiyorsa, "write:calendar" isteme. Jeton ele geçerse zararı azaltır.
Gerektiğinde jetonları iptal et
Çoğu SaaS uygulaması, kullanıcıların aktif oturumları görüp iptal etmesine imkân verir. Örneğin, GitHub kişisel erişim jetonlarını istediğin zaman iptal etmene olanak tanır.
Kullanımı izle
Jeton kullanımının loglanması, şüpheli aktiviteleri ortaya çıkarabilir. Aynı jeton birkaç dakika arayla hem Londra'dan hem New York’tan kullanılınca buna dikkat etmelisin.
Taşıyıcı jetonları diğer yöntemlerle karşılaştırmak faydalıdır:
Çerezler & Oturumlar
Klasik siteler, cookie ile tanımlanan sunucu saklı oturuma dayanır. Bu, browser uygulamaları için iyi çalışır; API’ler veya mobil uygulamalar içinse daha az verimlidir. Örneğin, Facebook masaüstünde çerez kullanır, mobil API’lerinde ise jeton kullanır.
API Anahtarları
API anahtarı, uygulamayı kimliklendiren sabit bir dizedir; kullanıcıyı değil. Örneğin, hava durumu uygulaması veri almak için API anahtarı kullanır ama bu anahtar hangi kullanıcının tahmini istediğini sunucuya söylemez. Taşıyıcı jetonlar, kullanıcıya özel bilgi de taşıyabilir; bu da onları daha esnek kılar.
Karşılıklı TLS (mTLS)
Bazı yüksek güvenlikli sistemler hem istemci hem sunucuda sertifika kullanır. Daha güvenli olsa da büyük ölçekte dağıtımı zordur. Çoğu SaaS platformu için taşıyıcı jetonlar, kullanılabilirlik ve güvenlik arasında ideal dengeyi sağlar.