WEB / WEB-14.03
JWT claims ve token lifecycle
JWT, claims taşıyan bir representation’dır; güven, cryptographic doğrulama ve uygulamanın acceptance policy’sinden gelir. Access token, refresh token ve authenticated session farklı lifetime kararlarına sahiptir.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Doğru profile ve resource
- Access alias hazır
Client access-token alias’ını resource API’ye sunmaya hazırlanır. Alias yalnız biçimi ve state ilişkisini gösterir; credential bytes içermez.
- Client
- Access alias; refresh token değil
- Resource server
- Request yok
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- İzinli issuer/key/algorithm/profile
- Resource request ulaştı
Resource server encoded-token alias’ını almıştır. Decoded claims henüz doğrulanmamış data’dır; identity veya permission kabulü değildir.
- Client
- Bekliyor
- Resource server
- Claims okundu; henüz kabul edilmedi
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- İzinli issuer/key/algorithm/profile
- Cryptographic koşul olumlu
İzinli algorithm/key ve önceden verilen signatureValid koşulu olumlu. Gerçek crypto çalıştırılmaz; audience ve time kararı hâlâ gereklidir.
- Client
- Bekliyor
- Resource server
- Signature koşulu olumlu; policy bekliyor
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- İzinli issuer/key/algorithm/profile
- Profile ve action kararı
Issuer, audience, type, required claims ve time policy geçer. Bu örnekte subject’in kendi note’u için action policy ayrıca allow verir.
- Client
- Bekliyor
- Resource server
- ACCEPT: profile geçerli; action izinli
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- Policy: profile geçerli; action izinli
- Karar Client’a ulaştı
Client, subject-duru için izin verilen own-note representation’ını aldı. Signature koşulundan sonra issuer, audience, token türü ve time policy geçmiş; bu note için action izni ayrıca verilmiştir. Bu yanıt başka resource için grant oluşturmaz.
- Client
- Subject’in kendi note’u teslim edildi
- Resource server
- Response: izin verildi
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- Policy: profile geçerli; action izinli
Audience mismatch
- Access alias hazır
Client access-token alias’ını resource API’ye sunmaya hazırlanır. Alias yalnız biçimi ve state ilişkisini gösterir; credential bytes içermez.
- Client
- Access alias; refresh token değil
- Resource server
- Request yok
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- İzinli issuer/key/algorithm/profile
- Resource request ulaştı
Resource server encoded-token alias’ını almıştır. Decoded claims henüz doğrulanmamış data’dır; identity veya permission kabulü değildir.
- Client
- Bekliyor
- Resource server
- Claims okundu; henüz kabul edilmedi
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- İzinli issuer/key/algorithm/profile
- Cryptographic koşul olumlu
İzinli algorithm/key ve önceden verilen signatureValid koşulu olumlu. Gerçek crypto çalıştırılmaz; audience ve time kararı hâlâ gereklidir.
- Client
- Bekliyor
- Resource server
- Signature koşulu olumlu; policy bekliyor
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- İzinli issuer/key/algorithm/profile
- Profile ve action kararı
Audience bu resource server’ı içermez. Signature koşulunun olumlu olması yanlış recipient için kullanımı geçerli yapmaz.
- Client
- Bekliyor
- Resource server
- REJECT: audience uyuşmuyor
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- Policy: audience uyuşmuyor
- Karar Client’a ulaştı
Client token reddini aldı; private representation hazırlanmadı. Signature koşulu olumlu olsa da audience bu resource server’ı içermediği için token acceptance durdu. Bu ret, signature’ın bozuk olduğu anlamına gelmez.
- Client
- Token reddedildi; private representation yok
- Resource server
- Response: token kabul edilmedi
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- Policy: audience uyuşmuyor
Expiry boundary
- Access alias hazır
Client access-token alias’ını resource API’ye sunmaya hazırlanır. Alias yalnız biçimi ve state ilişkisini gösterir; credential bytes içermez.
- Client
- Access alias; refresh token değil
- Resource server
- Request yok
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- İzinli issuer/key/algorithm/profile
- Resource request ulaştı
Resource server encoded-token alias’ını almıştır. Decoded claims henüz doğrulanmamış data’dır; identity veya permission kabulü değildir.
- Client
- Bekliyor
- Resource server
- Claims okundu; henüz kabul edilmedi
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- İzinli issuer/key/algorithm/profile
- Cryptographic koşul olumlu
İzinli algorithm/key ve önceden verilen signatureValid koşulu olumlu. Gerçek crypto çalıştırılmaz; audience ve time kararı hâlâ gereklidir.
- Client
- Bekliyor
- Resource server
- Signature koşulu olumlu; policy bekliyor
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- İzinli issuer/key/algorithm/profile
- Profile ve action kararı
Örnekte now=1200 ve exp=1200’dür. Clock skew toleransı kabul edilmediğinden equality anında token reddedilir.
- Client
- Bekliyor
- Resource server
- REJECT: expiry sınırı; now == exp
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- Policy: expiry sınırı; now == exp
- Karar Client’a ulaştı
Client token reddini aldı; private representation hazırlanmadı. now=1200, exp=1200 ve leeway=0 olduğundan expiry sınırına ulaşılmıştır. Olumlu signature ve audience koşulları bu time kararını değiştirmez.
- Client
- Token reddedildi; private representation yok
- Resource server
- Response: token kabul edilmedi
- Authorization server
- Beklemede; token endpoint çağrısı yok
- Güvenilen policy / family
- Policy: expiry sınırı; now == exp
Stale refresh reuse
- Rotation zaten tamamlandı
AS önceki refresh alias’ını invalid, successor’ını active yapmıştır. Stale client component’i hâlâ eski alias’ı tutar.
- Client
- Stale component: refresh-old
- Resource server
- Önceki access alias burada tekrar doğrulanmadı
- Authorization server
- Henüz refresh request yok
- Güvenilen policy / family
- Family: eski alias invalid; current active
- Refresh request AS’ye ulaştı
Eski refresh alias’ı AS token endpoint’ine ulaşmıştır. Bu request resource server’a gitmez; refresh ve access token farklı recipient’lara aittir.
- Client
- Refresh sonucunu bekliyor
- Resource server
- Önceki access alias burada tekrar doğrulanmadı
- Authorization server
- Eski refresh alias alındı; validation bekliyor
- Güvenilen policy / family
- Family: eski alias invalid; current active
- Reuse policy family’yi kapatır
Eski alias zaten invalid’dır. Reuse policy family’yi revoke eder ve yeni access grant üretmez; alias’ı sunan actor’ın kimliği kesinleşmez.
- Client
- Refresh sonucunu bekliyor
- Resource server
- Önceki access alias burada tekrar doğrulanmadı
- Authorization server
- Reuse görüldü; yeni access üretilmedi
- Güvenilen policy / family
- Family revoked; active successor yok
- Refresh failure Client’a ulaştı
Client refresh reddini almıştır ve yeniden authorization gerekir. Önceden issued access token’ın bütün API’lerde anında revoked olduğu sonucu çıkmaz.
- Client
- Refresh reddedildi; yeniden authorization gerekli
- Resource server
- Önceki access alias burada tekrar doğrulanmadı
- Authorization server
- Response: refresh reddedildi
- Güvenilen policy / family
- Family revoked; active successor yok
ROLLER · STATE · VERİ AKIŞI
JWT bir claims representation’ıdır
JWT, bir subject hakkında claim taşıyan compact representation ailesidir. Sık görülen signed JWS Compact biçiminde üç bölüm bulunur: protected header, payload ve signature/MAC. Noktalarla ayrılan bu bölümler Base64url ile temsil edilir. Header alg gibi cryptographic metadata, payload ise claims taşır.
Bu anlatım signed JWS Compact örneğine odaklanır. JWT ayrıca encrypted JWE veya nested representation ile kullanılabilir; bütün JWT’leri “üç parça ve plaintext payload” kalıbına indirgeme. Signed JWS payload’ı encryption sağlamaz; signature integrity/authenticity ile confidentiality farklı ihtiyaçlardır.
HEADER_ALIAS.PAYLOAD_ALIAS.SIGNATURE_ALIAS bu dersin inert biçim çizimidir; gerçek JWT değildir. JSON artifact decoded görünümleri öğretir. Dışarıdaki bir token’ı decode etmek, onun hangi key ile hangi amaç için trusted olduğunu kanıtlamaz.
Claim isimleri hangi soruları yanıtlar?
iss issuer’ı, sub subject’i, aud intended recipient’ları belirtir. Subject değeri issuer bağlamında unique olabilir; aynı sub metni iki issuer’da aynı kişi anlamına gelmeyebilir. aud tek string veya array olabilir ve recipient kendi identifier’ını beklenen audience içinde bulmalıdır.
exp, token’ın kabul edilemeyeceği sınırı; nbf, kabulün başlayabileceği zamanı belirtir. NumericDate değerleri epoch’tan saniye birimindedir. iat issuance zamanıdır; tek başına expiry değildir. jti token identifier/correlation için kullanılabilir; kendiliğinden revoke listesi veya replay protection uygulamaz.
RFC 7519 registered claim’lerini bütün application’lar için zorunlu ilan etmez. Required claim set’i profile belirler. Bu fixture OAuth access token için RFC 9068 profile’ını seçer: iss, exp, aud, sub, client_id, iat ve jti gereklidir; typ access-token türünü bildirir. Uygulamaya özel tenant gibi claim varsa anlamı producer/consumer sözleşmesinde tanımlanır.
Decode sonrası claims hâlâ tentative’tir
Parser JSON alanlarını okuyabilir; bu aşamadaki sub ve scope trusted policy input değildir. Cryptographic validation doğru key, uygun algorithm ve bütün required cryptographic operation’ları doğrulamalıdır. Herhangi bir required doğrulama başarısızsa token kabul edilmez.
Allowed algorithm set’i server configuration’dan gelir; token’ın alg alanı bu set’i genişletemez. Key’in expected issuer’a ait olduğu trusted configuration/discovery ilişkisiyle doğrulanır. kid mevcut approved key set’inde selector olabilir; token metadata’sını key trust veya arbitrary remote fetch talimatı sayma.
Bu access-token profile’ı signature gerektirir ve none kabul etmez. Library’nin verification sonucu, izinli algorithm ve key policy’siyle birlikte değerlendirilir. Sahne signatureValid değerini önceden verilmiş bir koşul olarak kullanır; gerçek signature bytes veya key materyali işlemez. Bu nedenle sahnedeki olumlu değer, çalıştırılmış bir RSA verification sonucu değildir.
Valid signature, doğru kullanım demek değildir
Cryptographic doğrulama geçse bile exact issuer, intended audience, required claim set, token purpose ve time koşulları uygulanır. RFC 9068 için typ at+jwt veya application/at+jwt olmalıdır. Bir ID token’ın farklı amacını access-token validation kurallarıyla ayır; “signed JWT” ortaklığı type sınırını kaldırmaz.
Fixture expected issuer’ı https://identity.atlas.example, audience’ı https://api.atlas.example olarak seçer. Wrong-audience branch’te signature valid olsa da token başka recipient’a aittir ve kabul edilmez. Resource action için scope ve subject/resource policy de ayrı uygulanır.
exp sınırında now < exp gerekir; now == exp bu fixture’ın zero-leeway politikasında expired’dır. nbf varsa now >= nbf gerekir. Gerçek clock skew toleransı küçük ve explicit policy olmalıdır; fixture’daki 1000/1200 değerleri sentetik epoch saniyeleridir, önerilen TTL veya ölçülmüş saat değildir.
Access ve refresh token farklı hedeflere gider
OAuth access token protected resource server için credential’dır. Refresh token yeni access token almak için authorization server’a sunulur; resource API’ye gönderilmez. Refresh token issuance optional’dır ve token biçimi JWT olmak zorunda değildir.
Refresh akışı original grant’i aşan permission yaratmamalıdır; client binding, scope/resource sınırları ve validity değerlendirilir. Refresh token’ı “daha uzun yaşayan access token” gibi aynı endpoint’e vermek amaç sınırını bozar.
RFC 9700 public client refresh-token replay detection için sender constraint veya rotation ister. Rotation branch’inde yeni refresh token üretilirken önceki invalid olur ve family ilişkisi tutulur. Sonradan eski token’ın yeniden görülmesi, kimin sunduğunu kesin söylemeden bir risk işareti oluşturur; active family revocation ve fresh authorization gerekebilir.
Fixture rotation’ı tamamlanmış family ile başlar: refresh-old invalid, refresh-current active. Stale client component’i eski alias’ı sunar; AS reuse’u fark edip family’yi revoke eder. Bu sırada önceden issued access token’ın her resource server’da anında invalid olduğu iddia edilmez.
Stateless validation, stateless lifecycle değildir
Self-contained signed access token, resource server’ın her request’te issuer’a lookup yapmadan signature/claim policy değerlendirmesine izin verebilir. Bu, logout, revocation veya permission change’in bütün server’lara otomatik yayıldığı anlamına gelmez.
Immediate revocation gerekiyorsa denylist/session generation/introspection gibi trusted state veya back-end coordination tasarımı gerekebilir. Short-lived access token ve protected refresh lifecycle başka bir trade-off sunar. JWT formatı tek başına hangi yaklaşımın doğru olduğunu belirlemez.
Client’ın token’ı silmesi yerel cleanup’tır; AS’de refresh family revocation ve resource server’da access-token acceptance policy ayrı sonuçlardır. Key rotation da bütün kullanıcı session’ları için hassas logout primitive’inin otomatik eşdeğeri değildir. Expiry, revocation ve current authorization expectation birlikte tasarlanır.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Audience farklı
- Validation profile seçildi
Bu fixture signed JWS ile RFC 9068 OAuth access-token profile’ını kullanır. Shape alias gerçek encoded JWT değildir; decoded claim’in görünmesi acceptance sayılmaz.
- Token profile
- wrong-audience
- Validation gates
- Claims değerlendirilmedi
- Action boundary
- Action grant yok
- Key ve signature sınırı ayrıldı
Allowed algorithm RS256, typ at+jwt ve issuer-bound key source policy’den gelir. Bu branch signatureValid=true predicate’ini verir; cryptographic library çalıştırıldığı sonucu eklenmez.
- Token profile
- wrong-audience
- Validation gates
- Signature predicate=true
- Action boundary
- Action grant yok
- Recipient veya purpose kontrol edildi
Expected audience https://api.atlas.example için audienceValid=false’tur. Issuer ve signature true olsa da başka recipient için authority burada kabul edilmez.
- Token profile
- wrong-audience
- Validation gates
- audienceValid=false
- Action boundary
- Action grant yok
- Geçerli time sonucu yeterli sayılmadı
nowSeconds=1000 ve expSeconds=1200 olduğu için bu satır expiry sınırında değildir. Time geçerliliği, failed audience gate’ini telafi etmez.
- Token profile
- wrong-audience
- Validation gates
- Time uygun; profile reddedildi
- Action boundary
- Action grant yok
- Token acceptance kapandı
tokenAccepted=false ve actionAllowed=false kalır. Readable sub=subject-duru alanı artık trusted policy input’u gibi kullanılmaz; credential üretimi veya header değişikliği gösterilmez.
- Token profile
- wrong-audience
- Validation gates
- Token accepted=false
- Action boundary
- Action allowed=false
- Authority kapsamı korunuyor
Bu negatif case signature-valid sonuç ile recipient mismatch arasındaki boundary’yi gösterir. Başka resource, issuer veya token profile’ı için başarı veya failure sonucu çıkarılmaz.
- Token profile
- wrong-audience
- Validation gates
- Profile acceptance yok
- Action boundary
- Trusted action context yok
Purpose farklı
- Validation profile seçildi
Bu fixture signed JWS ile RFC 9068 OAuth access-token profile’ını kullanır. Shape alias gerçek encoded JWT değildir; decoded claim’in görünmesi acceptance sayılmaz.
- Token profile
- wrong-purpose
- Validation gates
- Claims değerlendirilmedi
- Action boundary
- Action grant yok
- Key ve signature sınırı ayrıldı
Allowed algorithm RS256, typ at+jwt ve issuer-bound key source policy’den gelir. Bu branch signatureValid=true predicate’ini verir; cryptographic library çalıştırıldığı sonucu eklenmez.
- Token profile
- wrong-purpose
- Validation gates
- Signature predicate=true
- Action boundary
- Action grant yok
- Recipient veya purpose kontrol edildi
purposeValid=false olduğundan seçilen access-token profile’ı kabul edilmez. Başka bir token türü için signature success, bu kullanımın validation rule’larını tamamlamaz.
- Token profile
- wrong-purpose
- Validation gates
- purposeValid=false
- Action boundary
- Action grant yok
- Geçerli time sonucu yeterli sayılmadı
nowSeconds=1000 ve expSeconds=1200 olduğu için bu satır expiry sınırında değildir. Time geçerliliği, failed purpose gate’ini telafi etmez.
- Token profile
- wrong-purpose
- Validation gates
- Time uygun; profile reddedildi
- Action boundary
- Action grant yok
- Token acceptance kapandı
tokenAccepted=false ve actionAllowed=false kalır. Readable sub=subject-duru alanı artık trusted policy input’u gibi kullanılmaz; credential üretimi veya header değişikliği gösterilmez.
- Token profile
- wrong-purpose
- Validation gates
- Token accepted=false
- Action boundary
- Action allowed=false
- Authority kapsamı korunuyor
Bu negatif case signature-valid sonuç ile purpose mismatch arasındaki boundary’yi gösterir. Başka resource, issuer veya token profile’ı için başarı veya failure sonucu çıkarılmaz.
- Token profile
- wrong-purpose
- Validation gates
- Profile acceptance yok
- Action boundary
- Trusted action context yok
VARSAYIM · SINIR · KONTROL
Readable claim’i trusted claim sanma
İncelemede decoded, cryptographically verified, profile-valid ve action-authorized durumlarını ayrı izle. sub=subject-duru alanını okumak identity’nin kabul edildiğini göstermez. Signature doğrulaması olumlu olsa bile audience, purpose ve time koşulları henüz değerlendirilmemiş olabilir. Alanın okunabildiği aşamadan resource erişimine doğrudan geçmek, farklı gate’leri tek bir sonuçta birleştirir.
wrong-audience branch’inde token’ın signature koşulu olumlu, fakat recipient yanlıştır. expired branch’inde de signature koşulu değişmeden now == exp nedeniyle kabul durur. Bu iki kayıt, cryptographic doğruluk ile uygun kullanımın ayrı sorular olduğunu gösterir. Olumsuz token kararı private representation üretmez; bir claim’in varlığı veya signed olması bu sınırı açmaz.
Lifecycle’daki bağımsız state’leri izle
Browser’daki yerel cleanup, AS’deki refresh family state’i ve resource server’daki access-token acceptance aynı değişken değildir. Client alias’ı silmiş olabilir; AS’de family hâlâ active kalabilir. AS family’yi revoke etmiş olsa da önceden issued access token’ın bütün API’lerde aynı anda reddedildiği sonucu çıkmaz. Her bileşenin state’i kendi kaynağından izlenmelidir.
Eski refresh alias’ının yeniden görülmesi presenter’ın kimliğini kesinleştirmez. Stale client component’i veya eşzamanlı meşru refresh işlemleri de benzer gözlem üretebilir. Response policy riski ele alırken actor attribution için gereken ek kanıtı açık bırakır. Örnekteki refresh-old ve refresh-current yalnız state ilişkisini gösteren alias’lardır; gerçek credential içermez.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Expiry equality
- Expiry kaydı seçildi
Expired satırı signature, issuer, audience ve purpose için true taşır. İnceleme bu olumlu alanların time gate’ini otomatik geçirmediğini açıklamaya odaklanır.
- Token observation
- case=expired
- Policy/lifecycle review
- Time karşılaştırılmadı
- Acceptance hükmü
- Acceptance bilinmiyor
- NumericDate ve clock policy okundu
policy clockLeewaySeconds=0’dır. Satır nowSeconds=1200 ve expSeconds=1200 verir; bunlar örneğe ait NumericDate değerleridir, güncel saat veya önerilen lifetime değildir.
- Token observation
- case=expired
- Policy/lifecycle review
- now=1200; exp=1200; leeway=0
- Acceptance hükmü
- Acceptance bilinmiyor
- Equality sınırı değerlendirildi
Expiration için now < exp gereklidir. Equality anında time gate geçmez; diğer true predicate’ler bu koşulu override etmez.
- Token observation
- case=expired
- Policy/lifecycle review
- Time gate=false
- Acceptance hükmü
- Token accepted=false
- Action sonucu karşılaştırıldı
Satır actionAllowed=false sonucunu da taşır. Token acceptance ile resource authorization farklı kararlardır; rejected token’dan trusted action context’i kurulmaz.
- Token observation
- case=expired
- Policy/lifecycle review
- Token accepted=false
- Acceptance hükmü
- Action allowed=false
- Integrity selector’ı kapsamıyla okundu
Selector accepted=true iken time veya başka validation gate’i false satırları arar. Ana fixture count=0, ayrı positive fixture count=1 verir; bu gerçek JOSE verification sonucu değildir.
- Token observation
- case=expired
- Policy/lifecycle review
- Integrity count=0; positive=1
- Acceptance hükmü
- Expiry reason korunur
- Time hükmü genişletilmedi
Bu profile göre expiry denial bilinir. Başka leeway konfigürasyonu, clock senkronizasyonu veya token’ın gerçek cryptographic geçerliliği ayrı evidence olmadan eklenmez.
- Token observation
- case=expired
- Policy/lifecycle review
- Known expiry at equality
- Acceptance hükmü
- Yalnız seçilen time policy
Refresh family
- Refresh lifecycle kapsamı seçildi
grant-ledger-a correlation’ı refresh family’ye aittir. refresh-old ve refresh-current gerçek token değildir; önceki access alias’ının resource-server sonucu ayrı alanda sınırlandırılır.
- Token observation
- grant-ledger-a
- Policy/lifecycle review
- Before/after incelenmedi
- Acceptance hükmü
- Resource-server state bilinmiyor
- Rotation sonrası state okundu
beforeReuse içinde refresh-old önceki rotation ile invalidated, refresh-current active olarak verilmiştir. Bir family ilişkisinin bulunması browser veya resource-server state’ini göstermez.
- Token observation
- grant-ledger-a
- Policy/lifecycle review
- Old invalidated; current active
- Acceptance hükmü
- Resource-server state bilinmiyor
- Stale presentation sonucu okundu
Artifact stalePresentation=refresh-old alias sonucunu inceler. afterReuse içinde refresh-current revoked ve newAccessIssued=false’tur; bu policy observation’ı actor attribution yapmaz.
- Token observation
- grant-ledger-a
- Policy/lifecycle review
- Family revoked; no new access
- Acceptance hükmü
- Resource-server state bilinmiyor
- Refresh ile access kabulü ayrıldı
resourceServerObservation önceki access alias’ının burada revalidated olmadığını açıklar. Family revocation, bütün resource server’ların access token’ı anında reddettiği garantisi değildir.
- Token observation
- grant-ledger-a
- Policy/lifecycle review
- Refresh state biliniyor
- Acceptance hükmü
- UNKNOWN: previous access acceptance
- Sebep ataması durduruldu
Stale component, parallel legitimate refresh veya response loss gibi nedenler bu family satırından kesinleştirilmez. Reuse policy sonucu ile olayın nedeni ayrı kanıt gerektirir.
- Token observation
- grant-ledger-a
- Policy/lifecycle review
- Yeni access verilmedi
- Acceptance hükmü
- Actor/cause bilinmiyor
- Lifecycle kanıtı kendi owner’ında kaldı
AS family state’i bilinir; browser cleanup ve resource-server current acceptance UNKNOWN kalır. Logout veya client cleanup’tan bütün token lifecycle’ı tamamlandı sonucu çıkarılmaz.
- Token observation
- grant-ledger-a
- Policy/lifecycle review
- Known: family revoked
- Acceptance hükmü
- UNKNOWN: downstream acceptance
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Library ve profile sınırlarını birlikte uygula
Yerleşik bir JOSE/JWT library kullan; izinli algorithm’ları ve expected issuer’a bağlı trusted key set’ini açıkça yapılandır. Decode helper’ı verification API’si değildir. Token metadata’sını trust configuration yerine koymadan, profile’ın gerektirdiği header ve claim shape’ini doğrula.
Expected issuer, audience, purpose, required claims ve time policy’yi açık yapılandır. Access ve ID token gibi farklı JWT türleri için mutually exclusive validation rules kullan. Signature geçse de resource authorization’ını trusted policy’de tamamla.
Refresh lifecycle’da atomic rotation kur
Refresh token’ı yalnız doğru AS endpoint’inde ve protected transport/storage ile işle. Client/grant binding ve original scope’u koru. Rotation seçilmişse invalidate-old, issue-new ve family relationship güncellemesini tutarlı bir boundary’de yap; iki active successor’ı yanlışlıkla üretme.
Stale reuse branch’inde family revocation policy’si uygulanır ve yeni access grant üretilmez. Eşzamanlı meşru refresh veya response loss için recovery davranışını client/AS sözleşmesinde tanımla. Grace window veya TTL seçimini örnekteki sayılardan türetme; bu değerler uygulamanın risk ve lifetime beklentisine bağlıdır.
Revocation beklentisini ürün davranışına bağla
Logout sonrasında hangi access token ne kadar kabul edilebilir, hangi store/denylist kontrolü gerekir ve refresh family ne zaman kapatılır? Bu soruları JWT seçimiyle çözüldü sayma. Failover ve cache freshness etkisini current-authorization beklentisiyle birlikte düşün.
Audit için raw token yerine correlation alias, validation stage, reason ve issuer/audience/purpose sınıfını kullan. Sahnedeki signatureValid değeri önceden verilmiş bir koşuldur; cryptographic library’nin gerçekten hesapladığı verification sonucu ayrı bir gözlemdir. Token acceptance kararıyla bu gözlemin kaynağı birlikte korunmalıdır.
ŞİMDİ VAKAYA UYGULA
Signature, profile ve lifecycle hangi bağımsız sınırları kurar?
Access-token profile’ı issuer, recipient, purpose ve time koşullarını birlikte ister. Refresh family state’i başka bileşenin güncel kabulünü otomatik açıklamaz.
Vakadaki doğrulanmış actor, tenant ilişkisi ve requested action için gereken kararları ayır. Authentication veya proof başarısını object permission yerine kullanma.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
JWT validation ve refresh lifecycle defteri
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"shapeAlias": "HEADER_ALIAS.PAYLOAD_ALIAS.SIGNATURE_ALIAS (not an encoded JWT)",
"header": {
"typ": "at+jwt",
"alg": "RS256",
"kid": "atlas-key-alias-1"
},
"claims": {
"iss": "https://identity.atlas.example",
"sub": "subject-duru",
"aud": [
"https://api.atlas.example"
],
"exp": 1200,
"nbf": 900,
"iat": 800,
"jti": "token-ledger-a",
"client_id": "atlas-reader",
"scope": "read:own-note"
},
"policy": {
"profile": "RFC 9068 OAuth access token, signed JWS example",
"expectedIssuer": "https://identity.atlas.example",
"expectedAudience": "https://api.atlas.example",
"allowedAlgorithms": [
"RS256"
],
"allowedTypes": [
"at+jwt",
"application/at+jwt"
],
"requiredClaims": [
"iss",
"exp",
"aud",
"sub",
"client_id",
"iat",
"jti"
],
"approvedKeySource": "configured issuer-bound key aliases; no remote fetch",
"clockLeewaySeconds": 0,
"nowSeconds": 1000,
"timeValuesAre": "synthetic NumericDate fixture, not current clock or recommended lifetime"
},
"validationCases": [
{
"case": "normal",
"signatureValid": true,
"issuerValid": true,
"audienceValid": true,
"purposeValid": true,
"nowSeconds": 1000,
"expSeconds": 1200,
"tokenAccepted": true,
"actionAllowed": true
},
{
"case": "wrong-audience",
"signatureValid": true,
"issuerValid": true,
"audienceValid": false,
"purposeValid": true,
"nowSeconds": 1000,
"expSeconds": 1200,
"tokenAccepted": false,
"actionAllowed": false
},
{
"case": "expired",
"signatureValid": true,
"issuerValid": true,
"audienceValid": true,
"purposeValid": true,
"nowSeconds": 1200,
"expSeconds": 1200,
"tokenAccepted": false,
"actionAllowed": false
},
{
"case": "bad-signature",
"signatureValid": false,
"issuerValid": true,
"audienceValid": true,
"purposeValid": true,
"nowSeconds": 1000,
"expSeconds": 1200,
"tokenAccepted": false,
"actionAllowed": false
},
{
"case": "wrong-purpose",
"signatureValid": true,
"issuerValid": true,
"audienceValid": true,
"purposeValid": false,
"nowSeconds": 1000,
"expSeconds": 1200,
"tokenAccepted": false,
"actionAllowed": false
}
],
"refreshFamily": {
"correlation": "grant-ledger-a",
"aliasesAre": "not actual refresh tokens",
"beforeReuse": {
"refresh-old": "invalidated by prior rotation",
"refresh-current": "active"
},
"stalePresentation": "refresh-old alias",
"afterReuse": {
"refresh-old": "invalid",
"refresh-current": "revoked",
"newAccessIssued": false
},
"resourceServerObservation": "previous access alias not revalidated here; immediate revocation not implied"
},
"selector": {
"xml": "<tokens><decision case=\"normal\" accepted=\"true\" signature=\"true\" issuer=\"true\" audience=\"true\" purpose=\"true\" time=\"true\"/><decision case=\"wrong-audience\" accepted=\"false\" signature=\"true\" issuer=\"true\" audience=\"false\" purpose=\"true\" time=\"true\"/><decision case=\"expired\" accepted=\"false\" signature=\"true\" issuer=\"true\" audience=\"true\" purpose=\"true\" time=\"false\"/><decision case=\"bad-signature\" accepted=\"false\" signature=\"false\" issuer=\"true\" audience=\"true\" purpose=\"true\" time=\"true\"/><decision case=\"wrong-purpose\" accepted=\"false\" signature=\"true\" issuer=\"true\" audience=\"true\" purpose=\"false\" time=\"true\"/></tokens>",
"xpath": "count(/tokens/decision[@accepted=\"true\" and (@signature!=\"true\" or @issuer!=\"true\" or @audience!=\"true\" or @purpose!=\"true\" or @time!=\"true\")])",
"expected": 0,
"positiveFixtureXml": "<tokens><decision accepted=\"true\" signature=\"true\" issuer=\"true\" audience=\"false\" purpose=\"true\" time=\"true\"/></tokens>",
"positiveExpected": 1
}
}- header / claims
- Decoded görünüm; verification öncesi trusted authorization input değildir.
- policy
- Issuer/audience/type/algorithm ve required-claim seçimleri uygulamanın approved profile’ından gelir.
- signatureValid / tokenAccepted / actionAllowed
- Cryptographic predicate, profile acceptance ve resource permission ayrı durumlar.
- refreshFamily
- AS refresh state’i; resource server access-token revocation’ın otomatik kanıtı değildir.
Gerçek JWT, signature, key veya refresh token yoktur. NumericDate saatleri sentetik; zero-leeway yalnız fixture tercihi. Signature predicate supplied, cryptographic library çalıştırılmadı. RFC9068 seçilmiş profile; bütün JWT’lere genellenmez.
İki yanlış kanı
JWT decode oldu veya signature valid çıktıysa claims artık bu API’de authorized’dır.
Approved algorithm/key, issuer, audience, purpose, required claims ve time policy gerekir; resource authorization ayrıca uygulanır.
Refresh family revoke veya Browser token cleanup, issued JWT access token’ları bütün server’larda anında invalid yapar.
AS family state, client cleanup ve resource acceptance farklıdır. Immediate revocation için uygun trusted state/coordination gerekir; yalnız local validation yapan server expiry’ye kadar başka davranabilir.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
Signature geçerli, fakat audienceValid=false. Access token kabul edilir mi?
- Evet. Geçerli signature bütün API’lerde erişim iznidir.
- Hayır. Wrong-audience kontrolü tokenAccepted=false üretir.
Gerekçeli cevabı oku
Hayır. Wrong-audience kontrolü tokenAccepted=false üretir. — Signature, issuer/key bağlamında integrity ve authenticity koşulunu sağlar; başka resource server için grant oluşturmaz.
now=exp=1200 ve leeway=0. Token kabul edilir mi?
Dersten seçilen artifact alanları; öğretim örneği
- validationCases[2]
- {"case":"expired","signatureValid":true,"issuerValid":true,"audienceValid":true,"purposeValid":true,"nowSeconds":1200,"expSeconds":1200,"tokenAccepted":false,"actionAllowed":false}
- policy.clockLeewaySeconds
- 0
- Hayır. Expired branch’i reddeder.
- Evet. exp anı son geçerli saniye olarak dahil edilir.
Gerekçeli cevabı oku
Hayır. Expired branch’i reddeder. — Kabul için expiration anından önce olunmalıdır. Eşitlik ve zero-leeway bu time kontrolünü kapatır.
Refresh family revoked oldu. RS’nin önceki access alias’ını hemen reddettiği çıkarılabilir mi?
Gerekçeli cevabı oku
Family güncel refresh alias’ını revoke eder ve newAccessIssued=false kalır. Önceki access alias burada yeniden doğrulanmaz. RS’deki revocation propagation, introspection veya güncel policy için ayrıca kanıt gerekir. JTI veya decoded claim’ler kendi başlarına revocation mekanizması değildir.
□ Refresh family sonucu ile access token kabulünü ayırdım.
□ Gözlenmeyen resource server state’ini bilinmeyen olarak bıraktım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- RFC 7515 — JSON Web Signature2 Terminology: JWS Signature and Base64url · 3.1 JWS Compact Serialization Overview
- RFC 7519 — JSON Web Token3 JSON Web Token Overview · 4.1 Registered Claim Names · 4.1.1 iss · 4.1.2 sub · 4.1.3 aud · 4.1.4 exp · 4.1.5 nbf · 4.1.6 iat · 4.1.7 jti · 7.2 Validating a JWT
- RFC 8725 — JWT Best Current Practices3.1 Perform Algorithm Verification · 3.3 Validate All Cryptographic Operations · 3.8 Validate Issuer and Subject · 3.9 Use and Validate Audience · 3.10 Do Not Trust Received Claims · 3.11 Use Explicit Typing · 3.12 Use Mutually Exclusive Validation Rules for Different Kinds of JWTs
- RFC 9068 — JWT Profile for OAuth 2.0 Access Tokens2.1 Header · 2.2 Data Structure · 4 Validating JWT Access Tokens
- RFC 6749 — OAuth 2.01.4 Access Token · 1.5 Refresh Token · 6 Refreshing an Access Token
- RFC 9700 — OAuth 2.0 Security Best Current Practice4.14.1 Refresh Token Protection: Discussion · 4.14.2 Refresh Token Protection: Recommendations
- RFC 7009 — OAuth Token Revocation3 Implementation Note
- OWASP — Authorization Cheat SheetValidate the Permissions on Every Request