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.
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.
Taşıyıcı jeton nedir?
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 pratikte nasıl çalışır?
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
veyawrite: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 neden popüler oldu?
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.
Taşıyıcı jetonun içinde ne var?
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 farkı nedir?
Taşıyıcı jeton ve erişim jetonu terimleri sıkça bir arada geçse de, tamamıyla aynı değildirler.
Erişim jetonu: “İzin Kağıdı”
Bir erişim jetonu, bir kullanıcının kaynağa erişim yetkisini temsil eden bir kimlik bilgisidir. Şu bilgileri taşır:
- Kullanıcı kim (ID’si)
- Neleri yapmaya yetkili (kapsam/izinler)
- Jetonun geçerliliği ne zaman bitecek
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: “Teslimat Biçimi”
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:
- Her taşıyıcı jeton bir erişim jetonudur.
- Ama her erişim jetonu taşıyıcı olmak zorunda değildir.
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.
Pratikte örnek
- Erişim jetonu (genel): İmzalı bir veri parçası olabilir. İstemcinin ek olarak gizli bir anahtara sahip olduğunu kanıtlaması gerekebilir.
- Taşıyıcı jeton (özel): Günümüzde çoğu OAuth 2.0 uygulaması erişim jetonunu taşıyıcı biçimde verir. Örneğin, Google OAuth, Authorization: Bearer
<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.
Diğer jeton türleriyle kıyaslama
Daha net olması için, taşıyıcı jetonları diğer yaygın jeton türleriyle karşılaştıralım:
- Yenileme jetonu (refresh token): Eski erişim jetonu süresi dolunca yenisini almak için kullanılır. Genellikle taşıyıcı jeton değildir, zira sadece yetkilendirme sunucusuyla güvenli olarak değiştirilir, doğrudan API’ye gönderilmez.
- Kimlik jetonu (ID token): Kimlik doğrulama için, yetkilendirme için değil. (Kullanıcının e-posta, ad veya kullanıcı ID’si gibi bilgilerini içerir.) Sisteme bağlı olarak bir kimlik jetonu, taşıyıcı jeton da olabilir; fakat amacı erişim jetonundan farklıdır.
- API anahtarı: Çağrı yapan uygulamayı tanımlayan daha basit bir kimlik bilgisi formu. Çoğu durumda API anahtarları, taşıyıcı jeton gibi davranır; anahtarı olan API'yi çağırabilir.
Taşıyıcı jetonlar ve erişim jetonları birbirinin alternatifi değildir — kapsam olarak ilişkilidirler:
- Çoğu erişim jetonu taşıyıcı jetondur.
- Taşıyıcı jeton, bir jetonun nasıl kullanıldığını tanımlar (erişim için sunulur).
- Günlük kullanımdaysa, “erişim jetonu” ve “taşıyıcı jeton” terimleri çoğunlukla birbirinin yerine kullanılır; teknik olarak farklı yönleri vurgularlar.
JWT erişim jetonu (Taşıyıcı jeton) nasıl doğrulanır?
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.
Temel fikir
- Jetonu ayrıştır.
- İmzasını sağlayıcının (issuer) halka açık anahtarıyla doğrula.
- Sağa uygun talepleri (claims) kontrol et: issuer, audience, expire, not-before.
- Uygulamanın kurallarına göre kapsamlar (scopes), roller ve jeton türünü kontrol et.
- Gerekirse, yüksek riskli işlemlerde engelleme listelerini (revocation) veya oturum durumunu (session state) kontrol et.
Doğrulama kontrol listesi (JWT)
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ın güvenlik riskleri
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:
- Jeton hırsızlığı – Bir hacker, jetonun saklandığı tarayıcı localStorage'a ulaşırsa kullanıcıyı taklit edebilir. 2018’de bazı tarayıcı eklentileri, localStorage’dan jetonları çalıp sattı.
- Tekrar oynatma saldırıları – Saldırgan bir jetonu ele geçirirse, süresi dolana kadar tekrar tekrar kullanabilir. HTTPS olmadan şaşırtıcı derecede kolaydır.
- Uzun ömürlü jetonlar – Geçerliliği haftalar veya aylar süren bir jeton, saldırganlar için fırsat penceresini büyütür.
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 için en iyi uygulamalar
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 ve diğer kimlik doğrulama yöntemleri
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.
Temel çıkarımlar
- Taşıyıcı jetonlar basit ama güçlüdür: kimde jeton varsa kaynağa erişebilir.
- OAuth 2.0 ve OIDC akışlarında, özellikle API’ler ve mobil uygulamalarda yaygın olarak kullanılırlar.
- Güvenlik, onlarla nasıl baş ettiğine bağlıdır: kısa ömür, kapsam, HTTPS ve iptal önemli unsurlardır.
- Her zaman en iyi tercih olmayabilirler ancak çoğu SaaS ve API bağlamında güvenlik ve kullanılabilirlik arasında iyi bir denge sunarlar.