İçeriğe atla

JSON Web Token

JSON Web Token
KısaltmaJWT
DurumTeklif Edilen Standart
İlk yayınlanma28 Aralık 2010 (13 yıl önce) (2010-12-28)
Son sürümRFC 7519
Mayıs 2015
OrganizasyonIETF
KomisyonIEGS
Yazar(lar)
  • Michael B. Jones
  • Microsoft
  • John Bradley
  • Ping Identity
  • Nat Sakimura
  • NRI
Temel standartlar
  • JSON
  • JSON Web Encryption (JWE)
  • JSON Web Signature (JWS)
Etki AlanıVeri alışverişi
Websitesidatatracker.ietf.org/doc/html/rfc7519

JSON Web Token (JWT), tarafların birbirleri arasındaki veri alışverişini ve bunun doğrulamasını sağlayan JSON tabanlı RFC 7519'de tanımlanmış açık bir standarttır. Örneğin bir sunucu, kullanıcının yönetici ayrıcalıklarına sahip olduğunu belirten bir anahtar (token) oluşturabilir ve bunu kullanıcıya gönderebilir. Kullanıcı daha sonra bu anahtar ile kendisine tanımlanmış olan yönetici yetkisini bir istemcide kullanabilir ve bütün taraflar tarafından yetkisi doğrulanabilir.[1]

Yapı

JSON Web Token'ları genellikle üç bölümden oluşur; header (başlık), payload (yük) ve signature (imza). Header, oluşturulacak imzada hangi algoritmanın kullanılacağını belirtir.[2]

header = '{"alg":"HS256","typ":"JWT"}'

HS256 algoritmanın HMAC-SHA256 ile imzalandığını gösterir.

Payload, taraflar arasındaki benzersiz bilgileri içerir.

payload = '{"loggedInAs":"admin","iat":1422779638}'

iat, anahtarın oluşturulma zamanını içeren bilgiyi taşır ve JWT'de önerilen bir kullanımdır.

Signature ise header ve payload'ın base64url (RFC 4648 §5) ile kodlanıp nokta simgesiyle bir araya getirilmesinin ardından bir gizli anahtarla şifrelenmesiyle ortaya çıkar.

key           = 'secretkey'
unsignedToken = encodeBase64Url(header) + '.' + encodeBase64Url(payload)
signature     = HMAC-SHA256(key, unsignedToken)

Son olarak üç bölümün bir araya gelip, signature'ün de base64url ile kodlanmasıyla anahtar (token) ortaya çıkar.

token = encodeBase64Url(header) + '.' + encodeBase64Url(payload) + '.' + encodeBase64Url(signature) # oluşan anahtar: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

Çıktısı HTML ve HTTP ortamlarına kolayca entegre edilebilen, base64url ile kodlanmış güvenilir karakterlerden oluşmaktadır. Tipik kriptografik algoritmaları olarak HMAC ile birlikte SHA-256 (HS256) ve RSA ile birlikte SHA-256 (RS256) kullanılmaktadır.

Kullanım

Kimlik doğrulaması sırasında, kullanıcının gönderdiği bilgiler de doğrulandıysa bir anahtar (token) oluşturulup kullanıcıya döndürülür ve bu lokalde saklanır (örneğin çerezler ya da web storage).

Kullanıcı doğrulaması gerektiren durumlarda, istemci tarafından sunucuya Bearer şemasına sahip Authorization header'ı gönderilir. Header içeriği aşağıdaki gibi görünecektir:

 Authorization: Bearer eyJhbGci...<snip>...yu5CSpyHI

Bu durumsuz (stateless) kimlik doğrulama yöntemidir ve kullanıcı durumu asla sunucu belleğine kaydedilmez. Sunucu daima Authorization header'ından gönderilen JWT'nin geçerli olup olmadığını kontrol eder ve geçerliyse kullanıcının korumalı kaynaklara erişmesine izin verilir. Tüm bilgiler JWT'nin içerisinde olduğundan veritabanının birden fazla sorgulanma ihtiyacını azaltır.

Standart etiketler

Aşağıda JWT'nin IETF taslağında belirtilen, JWT'nin payload kısmında doğrulama amacıyla kullanılabilecek, önerilen standart etiketler bulunmaktadır:

etiket isim açıklama
issVerici ("issuer") JWT'yi oluşturan/veren kuruluşun adı.
subAlıcı ("subject") JWT'nin alıcısını belirten eşsiz değer.
audHedef kitle ("audience") JWT'yi yürütecek tarafı belirten değer. Eğer değer yürütmeciyle eşleşmiyorsa JWT reddedilir.
expBitiş zamanı ("expiration") JWT'nin hangi süreye kadar geçerli olduğunu belirten değer. Sayısal formatta olmalıdır.[3]
nbfÖncesi olamaz ("not before") JWT'nin hangi süreden önce geçerli olamayacağını belirtir. Sayısal formatta olmalıdır.
iatOluşturulma zamanı ("issued at") Anahtarın oluşturulma zamanını içeren bilgiyi taşır. Sayısal formatta olmalıdır.
jtiJWT ID Büyük/küçük harfe duyarlı, JWT'yi tanımlayan eşsiz anahtar kodu.

Geçersiz Hale Getirme

JWT'ler aslında birkaç şekilde uzaktan geçersiz hale getirilebilir. Bu yöntemlerden ilki jeton için bir ömür tanımlamaktır. Bu süre dolduğunda anahtar reddedilir ve geçerliliğini yitirmiş olur. Eğer sistem kullanıcısı, kendisi için önceden oluşturulmuş bir anahtarın artık işe yaramaması gerektiğine karar verirse bunu uzaktan etkisiz hale getirebilmek isteyecektir. Böyle bir senaryoda anahtarlar için oldukça kısa ömür tanımlanmalıdır. Anahtar ömrü dolunca, client mekanizması, yenileme amacıyla eski anahtarı da ileterek server tarafından bir anahtar ister. Server, eski anahtarın geçerliliğini kontrol eder. Güvenilirse kara listesinde olup olmadığına bakar. Kara listede değilse aynı anahtardan yeni bir tane oluşturup gönderir. Böyle bir işleyişte, kullanıcı sisteme başka bir cihazdan erişip bir anahtarı kara listeye gönderecek olursa anahtar bir sonraki yenileme periyodunda artık yenilenmez ve geçersiz hale gelmiş olur. Bu yöntemde bir anahtar en kötü ihtimalle ömrü kadar (veya daha kısa) bir süre sonra uzaktan geçersiz kılınabilir.

Avantajlar

  • JWT'ler durumsuz (stateless) oldukları için kullanıcı durumlarının elde edilmesi için veritabanı sorgulamasına gerek kalmaz.
  • Oturum yönetimi, çerezler kullanılmaksızın yapılabilir.
  • Tek bir anahtar, birden fazla arka uçta (backend) kullanılabilir.
  • Veritabanı sorgulaması ya da dosya sistemi kullanımı gerektirmediği için performanslıdır.

Dezavantajlar

  • JWT'ler durumsuz oldukları için, sunucuda durum tutulmadığı sürece anahtarları gerektiğinde geçersiz kılmanın bir yolu yoktur.
  • JWT gizli anahtarı yeterince güçlü değil ise, kırılması daha kolay olur.

Kaynakça

  1. ^ "JSON Web Token (JWT)". ietf.org. 27 Mart 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Mart 2019. 
  2. ^ "Introduction to JSON Web Tokens". 20 Ocak 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 8 Mart 2019. 
  3. ^ John, Bradley,; Nat, Sakimura,; Michael, Jones,. "JSON Web Token (JWT)". tools.ietf.org (İngilizce). 16 Haziran 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 20 Aralık 2017. 

Dış bağlantılar

  • jwt.io, JWT için araçlar ve kaynaklar sunan bir website. (İngilizce)

İlgili Araştırma Makaleleri

<span class="mw-page-title-main">HTTP</span> iletişim protokolü

HTTP bir kaynaktan dağıtılan ve ortak kullanıma açık olan hiperortam bilgi sistemleri için uygulama seviyesinde bir iletişim protokolüdür. HTTP, World Wide Web için veri iletişiminin temelidir; burada köprü metni belgeleri, örneğin bir fare tıklamasıyla veya bir web tarayıcısında ekrana dokunarak kullanıcının kolayca erişebileceği diğer kaynaklara köprüler içerir.

SMTP, bir e-posta göndermek için sunucu ile istemci arasındaki iletişim şeklini belirleyen protokoldür. Farklı işletim sistemleri için geliştirilmiş e-posta protokolleri bulunmaktadır. Bu e-posta protokollerinin SMTP'ye geçit yolu (gateway) vardır. SMTP, Aktarım Temsilcisi ve Kullanıcı Temsilcisi yazılımları arasındaki iletişimi sağlar. TCP'nin üst katmanında çalışır.

Bilgi işlemde, İnternet Mesaj Erişim Protokolü (IMAP), e-posta istemcilerinin bir TCP/IP bağlantısı üzerinden bir posta sunucusundan e-posta mesajları almak için kullandığı bir İnternet standart protokolüdür. IMAP, RFC 9051 tarafından tanımlanır.

HTTPS bir bilgisayar ağı üzerinden güvenli iletişim için internet üzerinde yaygın olarak kullanılan bir HTTP uzantısıdır. HTTPS'te, iletişim protokolü Taşıma Katmanı Güvenliği (TLS) veya öncesinde, onun öncülü/selefi olan Güvenli Soket Katmanı (SSL) ile şifrelenir. Bu nedenle protokol sık sık TLS üzerinden HTTP veya SSL üzerinden HTTP olarak da adlandırılır.

<span class="mw-page-title-main">Transport Layer Security</span> Internet Şifreleme Protokolü

Taşıma Katmanı Güvenliği (TLS) ve onun öncülü/selefi olan Güvenli Soket Katmanı (SSL), bilgisayar ağı üzerinden güvenli haberleşmeyi sağlamak için tasarlanmış kriptolama protokolleridir. X.509 sertifikalarını kullanırlar ve bundan dolayı karşı tarafla iletişime geçeceklerin kimlik doğrulaması asimetrik şifreleme ile yapılır ve bir simetrik anahtar üzerinde anlaşılır. Bu oturum anahtarı daha sonra taraflar arasındaki veri akışını şifrelemek için kullanılır. Bu, mesaj/veri gizliliğine ve mesaj kimlik doğrulama kodları için mesaj bütünlüğüne izin verir. Protokollerin birçok versiyonu ağ tarama, elektronik mail, İnternet üzerinden faks, anlık mesajlaşma ve İnternet üzerinden sesli iletişim gibi uygulamalarda yaygın olarak kullanılmaktadır. Bu durumda/içerikte/bağlamda en önemli özellik iletme gizliliğidir. Bundan dolayı kısa süreli oturum anahtarı, uzun süreli gizli simetrik anahtardan türetilememelidir.

<span class="mw-page-title-main">Kerberos (iletişim kuralı)</span>

Kerberos / kərbərəs / güvenli olmayan bir ağ üzerinde haberleşen kaynakların, bilet mantığını kullanarak kendi kimliklerini ispatlamak suretiyle iletişim kurmalarını sağlayan bir bilgisayar ağı kimlik doğrulama protokolüdür. Protokolün tasarımcıları, ilk başta istemci-sunucu modelini hedef almış ve bu doğrultuda hem kullanıcının hem de sunucunun birbirlerinin kimliklerini doğrulamasını sağlayan karşılıklı kimlik doğrulama özelliğini sunmuşlardır. Kerberos protokol mesajları, izinsiz dinlemelere ve yansıtma ataklarına karşı dayanıklıdır.

İnternet Protokolü Güvenliği (IPsec), Internet Protokolü (IP) kullanılarak sağlanan iletişimlerde her paket için doğrulama ve şifreleme kullanarak koruma sağlayan bir protokol paketidir. IPsec, içinde bulundurduğu protokoller sayesinde, oturum başlarken karşılıklı doğrulama ve oturum sırasında anahtar değişimlerini gerçekleştirme yetkisine sahiptir. İki bilgisayar arasında (host-to-host), iki güvenlik kapısı arasında(network-to-network), bir güvenlik kapısı ve bir bilgisayar arasında(network-to-host) sağlanan bağlantıdaki veri akışını korumak için kullanılır. IPsec kriptografik güvenlik servislerini kullanarak IP protokolü ile gerçekleştirilen bağlantıları korumak için kullanılır. Ağ seviyesinde doğrulama veri kaynağı doğrulama,veri bütünlüğü, şifreleme ve replay saldırılarına karşı koruma görevlerini üstlenir.

<span class="mw-page-title-main">OAuth</span> kimlik doğrulama protokolü

OAuth açık standartlı bir yetkilendirme protokolüdür, genellikle internet kullanıcıları tarafından kendi Google, Microsoft, Facebook, Twitter, One Network vb. hesaplarının şifrelerini açığa çıkarmadan third party web sitelerine erişmek için kullanılır. Genellikle OAuth kaynağın sahibi adına, kullanıcılara sunucu kaynakları için "güvenli temsili erişim" sağlıyor. Kaynak sahipleri için bir süreç başlatıyor. Bu süreçte kaynak sahiplerinin sunucu kaynaklarına herhangi bir kimlik paylaşımı olmadan üçüncü taraf erişim yetkisi sağlanıyor. Spesifik olarak Hypertext Transfer Protocol (HTTP) ile çalışması için tasarlanmış, OAuth temelde yetkili sunucu ile ve kaynak sahibinin onayı ile access tokenslerinin third-party kullanıcılarına verilmesine izin veriyor. Daha sonra third party, kaynak sunucudaki korumalı kaynaklara erişmek için access tokenlarını kullanıyor.

<span class="mw-page-title-main">WebSocket</span> bilgisayar iletişim protokolü

WebSocket, tek bir TCP bağlantısı üzerinden tam çift yönlü iletişim kanalı sağlayan bir bilgisayar iletişim protokolüdür. WebSocket protokolü IETF tarafından 2011 yılında RFC 6455 ile standart hale getirilmiş ve WebIDL içerisindeki WebSocket API W3C tarafından standart hale getirilmektedir.

Siteler arası betik çalıştırma, genellikle web uygulamalarında görülen, genellikle HTML enjeksiyonu zafiyetiyle birlikte ortaya çıkan veya Java Script kullanan bazı aplikasyonlarda bulunan bir güvenlik açıklığıdır. XSS, diğer kullanıcılar tarafından görüntülenen web sayfalarına istemci taraflı Java Script kodunun enjekte edilmesine imkân verir. Siteler arası betik çalıştırma açıklığı, saldırganlar tarafından aynı kök politikası gibi bazı erişim kontrollerini atlatmak ve hedef adresin oturum katmanını ele geçirmek için kullanılabilmektedir. Web sayfaları üzerinde gerçekleştirilen siteler arası betik çalıştırma saldırıları, 2007 itibarıyla Symantec'in raporladığı tüm güvenlik açıklıklarının yaklaşık olarak %84'ünü oluşturmaktadır. Zafiyet içeren sitenin işlediği verinin hassasiyetine ve site sahibi tarafından uygulanan güvenlik tedbirlerine bağlı olarak, etkisi ufak bir aksamadan önemli bir güvenlik riskine kadar değişebilmektedir.

Aynı kök politikası web uygulamaları güvenlik modelinde önemli bir unsurdur. Bu politikaya göre, bir web tarayıcısı, bir web sayfasında yer alan betiklerin ikinci bir web sayfası üzerindeki veriye erişimine sadece bu iki sayfa aynı köke sahipse izin vermektedir. Bir kök, URI şeması, hostname ve port numarasının bir kombinasyonu olarak tanımlanmaktadır. Bu politika, bir sayfada bulunan kötücül betiğin başka bir sayfada bulunan hassas verilere erişimini, o sayfanın Belge Nesnesi Modeli aracılığıyla engellemektedir.

DNSSEC, İnternet Protokolü (IP) ağlarında kullanılan Alan Adı Sistemi (DNS) tarafından sağlanan belirli türdeki bilgilerin güvenliğini sağlamaya yönelik bir İnternet Mühendisliği Görev Grubu (IETF) dokümanıdır. DNS istemcilerine (çözümleyicilerine), DNS verilerinin köken kimlik doğrulaması, kimlik doğrulaması reddi ve veri bütünlüğünü sağlayan, ancak kullanılabilirlik veya gizlilik sağlamayan bir DNS eklentisidir.

Güvenli kabuk,, ağ hizmetlerinin güvenli olmayan bir ağ üzerinde güvenli şekilde çalıştırılması için kullanılan bir kriptografik ağ protokolüdür. En iyi bilinen örnek uygulaması bilgisayar sistemlerine uzaktan oturum açmak için olandır.

Kriptografide, X.509 açık anahtar sertifikalarının formatını tanımlayan bir standarttır. X.509 sertifikaları, internette gezinmek için güvenli protokol olan HTTPS'nin temeli olan TLS/SSL dahil olmak üzere birçok internet protokolünde kullanılmaktadır. Elektronik imzalar gibi çevrimdışı uygulamalarda da kullanılırlar. Bir X.509 sertifikası bir açık anahtar ve bir kimlik içerir ve bir sertifika yetkilisi tarafından imzalanır veya kendinden imzalı olarak imzalanır. Sertifika güvenilir bir sertifika yetkilisi tarafından imzalandığında veya başka yollarla doğrulandığında, bu sertifikayı tutan biri, başka bir tarafla güvenli iletişim kurmak için sertifikanın içerdiği açık anahtara güvenebilir veya ilgili özel anahtar ile dijital olarak imzalanmış belgeleri doğrulayabilir.

Alan adı Anahtarlarıyla Tanımlanmış E-Posta (DKIM) e-posta sahteciliğini algılamak için tasarlanmış bir [Email authentication e-posta kimlik doğrulama] yöntemidir. Alıcının, belirli bir alandan geldiği iddia edilen bir e-postanın gerçekten bu alanın sahibi tarafından yetkilendirildiğini kontrol etmesini sağlar. Bu yöntemle e-postalarda sahte gönderici adresleriyle yemleme ve yığın e-posta gibi saldırıları önlemek amaçlanmıştır.

<span class="mw-page-title-main">Açık anahtar sertifikası</span>

Açık anahtar sertifikası ya da bilinen diğer adıyla dijital sertifika, açık anahtar sahipliğinin kanıtlanmasında kullanılan bir elektronik dokümandır. Sertifika, anahtar hakkında bilgiler, sahibinin kimliği hakkında bilgiler ve sertifikanın içeriğini doğrulayan bir varlığın dijital imzasını içerir. İmza geçerliyse ve yazılım, incelediği sertifikanın sağlayıcısına güveniyorsa, sertifikanın öznesi ile güvenli bir şekilde iletişim kurmak için bu anahtarı kullanabilir. E-posta şifreleme, kod imzalama ve elektronik imza sistemlerinde özne genelde bir kişi ya da kuruluştur. Ancak, Transport Layer Security (TLS)’de özne genelde bir bilgisayar ya da farklı aygıt olmasına rağmen TLS sertifikaları, cihazları tanımlamasındaki temel rollerine ek olarak kuruluşları ya da bireyleri tanımlayabilir. Bazen eski adı olan Secure Sockets Layer (SSL) olarak da anılan TLS, web’de güvenli gezinme için bir iletişim protokolü olan HTTPS’nin önemli bir parçasıdır.

Tekrarlama saldırısı, geçerli bir veri iletiminin kötü niyetlilik veya sahtekarlıkla tekrarlandığı veya geciktirildiği bir ağ saldırısıdır. Bu saldırı, orijinal veri iletimcisi tarafından ya da veri iletimini IP paketi değişimi içeren bir aldatma saldırısı kullanarak kesen ve yeniden ileten bir saldırgan tarafından gerçekleştirilir. Bu, ortadaki adam saldırısının alt kademe versiyonlarından biridir.

HTTP Katı Taşıma Güvenliği (HSTS), web sitelerini protokol indirgeme ve oturum çalma saldırılarına karşı korumaya yardımcı olan bir web güvenlik politikası mekanizmasıdır. Web sunucuları, kendisine gönderilen isteklerin yalnızca HTTPS üzerinden olması gerektiğini web tarayıcılarına bu mekanizma ile belirtir. Bu sayede kullanıcı, herhangi bir güvenlik çözümü sunmayan HTTP yerine Taşıma Katmanı Güvenliği (TLS/SSL) sağlayan HTTPS kullanarak ilgili web sitesine erişim sağlar. HSTS, RFC 6797 ile detaylandırılan bir IETF Standards Track protokolüdür.

<span class="mw-page-title-main">İnternet güvenliği</span>

Internet güvenliği, yalnızca Internet, sıkça tarayıcı güvenliği ve World Wide Web ile ilgili değil, aynı zamanda Ağ Güvenliği, uygulama ve işletim sistemleri sistemleri ile bir bütün olarak ilgilidir. Amacı, internet üzerinden saldırılara karşı kullanılacak kurallar ve önlemler oluşturmaktır. İnternet, bilgi alışverişi için güvenli olmayan bir kanalı temsil eder; bu da kimlik avı, çevrimiçi virüsler, truva atları, solucanlar ve daha fazlası gibi yüksek bir saldırı veya dolandırıcılık riskine yol açar.

HTTP 403, istenen kaynağa erişimin yasak olduğu anlamına gelen bir HTTP durum kodudur. Bu kodun gösterilmesinin anlamı: sunucu isteği anladı, ancak yerine getirmeyecek.