JWT(JSON Web Token) Nedir?
Web projelerimizi yetkisiz erişimlerden korumak ve yetkili kullanıcı erişimleri için çeşitli yöntemler kullanırız. Yaygın yöntem olarak token kullanmaktır. JWT (JSON Web Token), kullanıcı kimlik doğrulaması ve güvenli bir şekilde bilgi taşımamızı sağlayan bir metot sunar. JWT, bir RFC7519 endüstri standartıdır.
Üç temel bölümden oluşur:
- Başlık (Header): Token’ın tipini (JWT olduğunu) ve kullanılan imza veya şifreleme algoritmasını belirten JSON nesnesidir.
- Yük (Payload): Token içinde taşınan, iddia (claim) adı verilen bilgileri içeren JSON nesnesidir. Bu iddialar, kullanıcı bilgileri, token’ın son kullanma tarihi gibi bilgileri içerebilir.
- İmza (Signature): Başlık ve yük bölümlerinin birleştirilip, belirtilen algoritma kullanılarak imzalanmasıyla oluşur. Bu imza, token’ın bütünlüğünü ve doğruluğunu korumak için kullanılır.
Aşağıdaki görselde, JWT.IO sitesinde temel olarak nasıl oluşturulduğu gösterilmiş. Buradaki veriler yapımıza göre değişkenlikler gösterebilir.
Kaynak: https://jwt.io/
Hangi durumlarda JWTʼye ihtiyaç duyarız?
Aşağıda belli başlı karşılaşabileceğimiz durumların sırlamasını bulabilirsiniz.
- Kimlik Doğrulama (Authentication): Genellikle kullanıcıların bir web uygulamasına veya API’ye güvenli bir şekilde giriş yapmasını sağlamak için kullanılır. Bu süreç, kullanıcının kimlik bilgilerini sunucuya göndermesiyle başlar. Sunucu, bu bilgileri doğruladıktan sonra, kullanıcının kimliği ve diğer ilgili bilgileri içeren bir JWT oluşturur. Bu token, bir başlık, bir yük (kullanıcı bilgileri, son kullanma tarihi gibi) ve bir imzadan oluşur. Sunucu, oluşturduğu JWT’yi kullanıcıya geri gönderir. Kullanıcı, sonraki isteklerinde bu token’ı, genellikle HTTP isteklerinin “Authorization” başlığında gönderir. Sunucu, her isteği aldığında, gelen token’ı doğrular ve içerdiği bilgilere dayanarak kullanıcıya erişim izni verir veya vermez. Bu mekanizma, kullanıcıların kimliklerinin doğrulanmasını ve sunucunun kaynaklarına güvenli erişimini sağlar. JWT’nin güvenliği, token’ın doğru bir şekilde oluşturulması, iletilmesi ve doğrulanmasına bağlıdır.
- Tek Oturum Açma (Single Sign-On – SSO) Uygulamaları: Tek oturum açma sistemleri, kullanıcıların bir kez giriş yaparak birden fazla bağımsız sistemde veya uygulamada otomatik olarak oturum açmasını sağlar. JWT, kullanıcı kimliğinin çeşitli sistemler ve uygulamalar arasında güvenli bir şekilde aktarılması için kullanılabilir.
- Mikroservisler Arası İletişim: Mikroservis mimarilerinde, birbirinden bağımsız çalışan mikroservisler arası güvenli veri alışverişi gereklidir. JWT, mikroservisler arasında yetkilendirme ve kimlik doğrulama bilgilerinin taşınması için bir araç olarak kullanılır. Bu, her servisin kullanıcıyı bağımsız olarak doğrulamasına olanak tanır.
- API Güvenliği: RESTful API’lar ve GraphQL gibi modern API teknolojileri, istemci ve sunucu arasındaki etkileşim için merkezi bir rol oynar. JWT, API anahtarları veya OAuth token’ları ile birlikte, API isteklerini güvenli bir şekilde yetkilendirmek için kullanılabilir. Böylece, API üzerinden yapılan işlemlerin yetkilendirilmiş kullanıcılar tarafından yapıldığından emin olunabilir.
- Bilgi Güvenliği ve Yetkilendirme: Farklı kullanıcıların sistem üzerindeki farklı kaynaklara erişim seviyeleri olabilir. JWT, kullanıcı yetkilerini kodlayabilir, böylece sunucu, kullanıcıya hangi işlemleri gerçekleştirebileceğini belirlemek için token’i kontrol edebilir.
- Cihazlar Arası Oturum Devamlılığı: Kullanıcılar birden fazla cihaz kullanırken (örneğin, bilgisayar, tablet, akıllı telefon), uygulamalar arasında oturum devamlılığını sağlamak önemlidir. JWT, kullanıcının oturum bilgilerini farklı cihazlar ve platformlar arasında güvenli bir şekilde taşımak için kullanılabilir.
- Durumsuz Oturum Yönetimi: Web uygulamaları ve API’ler, yüksek ölçeklenebilirlik ve performans gereksinimleri nedeniyle durumsuz mimarilere yönelmiştir. JWT, sunucunun oturum bilgilerini tutmasına gerek kalmadan kullanıcı oturumlarını yönetebilmesini sağlar.
JWT Süre Kavramı
JWT (JSON Web Token) kullanımında süre kavramı ve Refresh Token mekanizması, güvenlik ve kullanıcı deneyimini optimize etmek için önemlidir. İşte bu kavramlar ve örneklerle açıklamaları:
Süre Kavramı: iat ve exp
JWT’de süre kavramı, token’ın ne zaman oluşturulduğunu (iat – Issued At) ve ne zaman sona ereceğini (exp – Expiration Time) belirleyen iki temel claim ile yönetilir.
iat – Issued At): Token’ın oluşturulma zamanını UNIX zaman damgası formatında belirtir. Bu, token’ın ne zaman oluşturulduğunu belirlemek için kullanılır. exp – Expiration Time): Token’ın son kullanma zamanını UNIX zaman damgası formatında belirtir. Bu zaman damgası geçtiğinde, token artık geçerli değildir ve kullanıcıdan yeni bir token alınması veya mevcut token’ın yenilenmesi gerekir.
- iat – Issued At): Token’ın oluşturulma zamanını UNIX zaman damgası formatında belirtir. Bu, token’ın ne zaman oluşturulduğunu belirlemek için kullanılır.
- exp – Expiration Time): Token’ın son kullanma zamanını UNIX zaman damgası formatında belirtir. Bu zaman damgası geçtiğinde, token artık geçerli değildir ve kullanıcıdan yeni bir token alınması veya mevcut token’ın yenilenmesi gerekir.
//Örnek JWT Payload:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"iat": 1516239022, // oluşturulma zamanı
"exp": 1516242622 // son kullanma zamanı
}
Bu örnekte, iat 1516239022 olarak belirtilmiş, yani token oluşturulduğunda UNIX zaman damgası bu değeri gösteriyordu. exp ise 1516242622, yani token’ın son kullanma zamanı bu UNIX zaman damgasına karşılık geliyor. Eğer mevcut zaman, exp değerini geçtiyse, token artık geçerli değildir.
Access Token ve Refresh Token Kavramları
JWT (JSON Web Token), genellikle Access Token olarak kullanılan, yetkilendirme ve bilgi alışverişi amacıyla kullanılan bir standardı ifade eder. Access Token ve Refresh Token, modern kimlik doğrulama sistemlerinde yaygın olarak kullanılan iki farklı türde token’dır. Bu token’lar, kullanıcıların sisteme güvenli bir şekilde erişimini sağlar ve kullanıcı oturumlarını yönetir. İkisinin arasındaki temel farklar ve kullanım amaçları şunlardır:
Access Token
Bir kullanıcının API’ye erişim izni olduğunu gösteren, genellikle JWT formatında olan bir kimlik doğrulama ve yetkilendirme aracıdır. Kullanıcının kim olduğunu, hangi kaynaklara erişebileceğini ve token’ın geçerlilik süresini belirtir. Amacı, kullanıcının sisteme başarıyla giriş yapmasının ardından, kullanıcı adına kaynaklara erişimde bulunmak için kullanılır. API çağrıları sırasında genellikle HTTP isteklerinin Authorization (yetkilendirme) başlığında taşınır. Kısa ömürlüdür (örneğin, 15 dakika ila birkaç saat arası) ve güvenlik sebebiyle süre kısıtlamasına sahiptir. Eğer bir Access Token ele geçirilirse, kısa süreli geçerliliği, olası zararı sınırlar.
Refresh Token
Token, mevcut Access Token’ın süresi dolduğunda, kullanıcı adına yeni bir Access Token elde etmek için kullanılan daha uzun ömürlü bir tokendir. Genellikle, Access Token ile birlikte verilir ancak nadiren doğrudan kaynaklara erişimde kullanılmaz.
Amacı, kullanıcının oturum süresini uzatmak ve sürekli olarak kullanıcı adı ve şifre ile oturum açma işleminin tekrarlamasını önlemek için kullanılır. Bu, özellikle mobil uygulamalar ve web uygulamaları için verimli bir kullanıcı deneyimi sağlar.
Uzun ömürlüdür (örneğin, birkaç gün, hafta veya daha fazla) ve yalnızca yeni bir Access Token elde etmek için kullanılır. Güvenlik açısından, bu token’lar daha hassas olarak ele alınır çünkü uzun süreli erişim imkanı sağlarlar.
JWT’ye göre, bir Access Token’ın kendisi bir JWT olabilir ve JWT’nin sahip olduğu tüm özelliklere (imza, süre sonu gibi) sahip olur. Refresh Token ise genellikle JWT formatında olmayabilir ve yalnızca yetkilendirme sunucusu tarafından anlaşılır bir şekilde saklanır ve yönetilir. Her iki token türü de modern kimlik doğrulama akışlarının vazgeçilmez parçalarıdır ve birlikte çalışarak güvenli, esnek ve kullanıcı dostu yetkilendirme mekanizmaları oluştururlar.
Access ve Refresh token kavramlarının işleyiş mekanizmasının anlaşılması için daha detaylı bir örnek vererek açıklayabiliriz.
Senaryo: Alice isminde bir kullanıcı , bir fotoğraf paylaşım uygulamasına giriş yapmak istiyor.
Adım 1: Kullanıcı Girişi
- Alice uygulamaya kullanıcı adı ve şifresi ile giriş yapar.
- Sunucu, Alice’in kimliğini doğrular ve iki token oluşturur:
- Access Token: Bu, kısa ömürlü (örneğin, 15 dakika) bir token’dır ve Alice’in API isteklerinde kimlik doğrulaması için kullanılır.
- Refresh Token: Bu, uzun ömürlü (örneğin, 7 gün) bir token’dır ve yalnızca yeni bir Access Token almak için kullanılır.
Adım 2: API İstekleri
- Alice, fotoğraflarını yüklemek ve arkadaşlarının fotoğraflarını görmek için Access Token’ı kullanarak uygulama üzerinden API istekleri yapar.
- Her istekte, Access Token HTTP isteğinin Authorization başlığında gönderilir.
Adım 3: Access Token Süresinin Dolması
- 15 dakika sonra, Access Token’ın süresi dolmuştur.
- Alice, bir sonraki API isteğini gönderdiğinde, sunucu Access Token’ın süresinin dolduğunu belirtir ve isteği reddeder.
Adım 4: Yeni Access Token Alma
- Uygulama, kullanıcının etkileşimi olmaksızın, Refresh Token’ı kullanarak sunucuya otomatik bir istek gönderir ve yeni bir Access Token talep eder.
- Sunucu, Refresh Token’ı doğrular ve geçerliyse yeni bir Access Token ve Refresh Token çifti üretir. Bu, eski Refresh Token’ın geçersiz kılınması ve güvenliğin artırılması anlamına gelir.
Adım 5: Yenilenen Token ile Devam
- Uygulama, yeni Access Token’ı alır ve Alice’in API isteklerini bu yeni token kullanarak yapmaya devam eder.
- Alice, bu süreçten etkilenmez ve uygulamayı kesintisiz bir şekilde kullanmaya devam eder.
Bu süreç, kullanıcı deneyimini bozmadan güvenlik ve erişim kontrolünü sağlar. Access Token’ın kısa ömürlü olması, olası bir güvenlik ihlalinde riski minimize ederken, Refresh Token mekanizması kullanıcıların sık sık yeniden oturum açma zahmetinden kurtulmalarını sağlar. Bu şekilde, hem kullanıcı deneyimi korunur hem de uygulamanın güvenliği artırılır.
JWT’nin Avantajları
Avantajı | Açıklama |
Devletsiz Doğrulama (Stateless Authentication) | JWT, kullanıcı durumunu sunucu tarafında saklamaya gerek duymadan doğrulama sağlar. Bu, uygulamaların ölçeklenebilirliğini artırır. |
Hız ve Performans | Sunucunun oturum durumunu saklamasına gerek kalmadan doğrulama yapılabilir, bu da daha hızlı yanıt süreleri sağlar. |
Esneklik | JWT, birçok farklı türdeki kimlik doğrulama ve yetkilendirme sistemleri ile kolayca entegre edilebilir. |
Kendini İçerir | JWT, gereken tüm kullanıcı bilgilerini içerir, bu da ek veri tabanı sorgularının yapılmasını gereksiz kılar. |
Çapraz Platform Desteği | Web, mobil ve diğer platformlar arasında kolayca kullanılabilir ve taşınabilir. |
Güvenlik | JWT, verilerin bütünlüğünü korumak için dijital imzalar kullanır. |
JWT’nin Dezavantajları
Avantajı | Açıklama |
Token Boyutu | JWT, çoğu oturum tanımlama bilgisine kıyasla daha büyük olabilir, bu da bant genişliği kullanımını artırabilir. |
Depolama ve Güvenlik Sorunları | Güvenli olmayan bir şekilde saklanırsa, JWT hassas kullanıcı bilgilerini ifşa edebilir. |
Yenileme ve Geçersiz Kılma Sorunları | JWT’lerin geçersiz kılınması veya yenilenmesi zor olabilir, bu da potansiyel güvenlik açıklarına yol açabilir. |
Sınırlı Oturum Kontrolü | JWT, oturum süresinin sunucu tarafından dinamik olarak kontrol edilmesine izin vermez. |
Güvenlik Yapılandırması | Güvenli kullanım için doğru şekilde yapılandırılması gerekir, aksi takdirde güvenlik açıklarına yol açabilir. |
Yaygın Standartlara Bağımlılık | JWT’nin güvenliği, kullanılan şifreleme algoritmalarının gücüne ve güvenliğine bağlıdır. |
JWT kullanımının avantajları ve dezavantajları, uygulamanın ihtiyaçlarına ve güvenlik gereksinimlerine bağlı olarak dikkatlice değerlendirilmelidir. Uygun durumlarda, JWT’nin sunduğu esneklik ve ölçeklenebilirlik, modern uygulamalar için değerli bir çözüm sunabilir. Bununla birlikte, potansiyel güvenlik risklerini azaltmak için uygun güvenlik önlemlerinin alınması önemlidir.
JSON Web Token Yerine Neleri Kullanabiliriz?
1. OAuth 2.0
OAuth 2.0, kullanıcıların bir uygulamaya (örneğin, bir web sitesi) üçüncü taraf servislerin (örneğin, Facebook veya Google) üzerinden kimlik doğrulama yapmasına olanak tanır. Bu, uygulamanın kullanıcı adı ve şifre gibi hassas bilgileri yönetmesine gerek kalmadan güvenli bir şekilde erişim sağlar.
2. OpenID Connect (OIDC)
OpenID Connect, OAuth 2.0 üzerine inşa edilmiş bir kimlik katmanıdır ve kullanıcı kimliğini doğrulama konusunda daha fazla özellik sunar. OIDC, kullanıcı bilgilerini güvenli bir şekilde alışverişini sağlayarak uygulamaların kullanıcı kimliklerini yönetmesine olanak tanır.
3. SAML (Security Assertion Markup Language)
SAML, özellikle kurumsal çözümler için popüler bir kimlik doğrulama ve yetkilendirme protokolüdür. Tekli oturum açma (SSO) yetenekleri sunar ve uygulamalar arası kimlik doğrulama ve yetkilendirmeyi kolaylaştırır. Genellikle büyük ve karmaşık kurumsal sistemlerde kullanılır.
4. Session Cookies
Geleneksel oturum yönetimi, kullanıcı durumunu sunucu tarafında saklayarak çalışır. Bu yöntem, kullanıcıyı bir oturum çerezi aracılığıyla tanımlar ve çerezin sunucu tarafındaki bir oturum referansıyla eşleştirilmesini sağlar. Güvenlik ve ölçeklenebilirlik ihtiyaçlarına bağlı olarak, modern web uygulamaları için hala geçerli bir seçenek olabilir.
5. API Keys
Basit kimlik doğrulama senaryoları için, API anahtarları kullanılabilir. API anahtarları, genellikle bir kullanıcıya veya uygulamaya özgü statik bir token sağlar. Bu yöntem, özellikle sunucu-sunucu iletişimi için kullanışlıdır ancak tek başına kullanıldığında düşük güvenlik seviyesi sunar.
6. Mutual TLS (mTLS)
mTLS, hem istemcinin hem de sunucunun birbirini SSL/TLS sertifikaları aracılığıyla doğruladığı iki yönlü bir SSL el sıkışması yöntemidir. Özellikle, güvenliği yüksek ve kurumsal sistemlerde tercih edilir.
Seçiminiz, uygulamanın güvenlik gereksinimleri, kullanım kolaylığı, ölçeklenebilirlik ve entegrasyon ihtiyaçları gibi faktörlere bağlı olarak değişiklik gösterecektir. Önemli olan, seçilen yöntemin uygulamanın güvenlik standartlarını karşılaması ve kullanıcı deneyimini olumsuz etkilememesidir.
Özet Olarak;
Bu yazımızda, JSON Web Token (JWT)ʼnin ne olduğu, nasıl çalıştığı, kullanım alanları, avantajları ve dezavantajları üzerine detaylı bir inceleme gerçekleştirilmiştir. JWT’nin web tabanlı uygulamalarda kimlik doğrulama ve güvenlik sağlama konularında önemli bir role sahip olduğunu gördük. Teknolojinin sağladığı esneklik ve ölçeklenebilirlik, modern uygulamaların ihtiyaçlarına yanıt verirken, sunduğu güvenlik avantajları, geliştiricilerin ve sistem yöneticilerinin işlerini kolaylaştırmaktadır.
Ancak, her teknolojik çözümde olduğu gibi, JWT kullanımının da kendi zorlukları ve dikkat edilmesi gereken güvenlik hususları bulunmaktadır. Özellikle tokenʼların güvenli bir şekilde saklanması, iletilmesi ve doğrulanması, güvenlik ihlallerinin önlenmesi açısından hayati öneme sahiptir. Bu nedenle, JWT uygulamalarında güncel güvenlik önerilerine ve en iyi uygulama standartlarına uyulması gerekmektedir.
JWT ve alternatif çözümlerin değerlendirilmesi, uygulamanın gereksinimlerine, kullanım senaryolarına ve güvenlik ihtiyaçlarına göre yapılmalıdır. Özellikle, güvenlik, ölçeklenebilirlik ve kullanıcı deneyimi gibi faktörler, teknoloji seçiminde belirleyici olmalıdır.
Son olarak, teknoloji sürekli olarak gelişmekte ve değişmektedir. Bu dinamik
ortamda, JWT ve web güvenliği alanındaki yenilikleri takip etmek, geliştiricilerin ve
teknoloji profesyonellerinin önünde duran önemli bir görevdir. Sürekli öğrenme ve
gelişim, bu alandaki zorlukların üstesinden gelmenin ve güvenli, etkili web
uygulamaları geliştirmenin anahtarıdır.