BFF'de Güvenlik ve Alternatifler — Token Handler, GraphQL, Gateway
Önce şunu oku: BFF — Backend for Frontend
30 saniyede özet
Tarayıcıda bir script'in okuyabildiği her anahtarı (token) sayfaya sızan kötü bir script de okur. Token handler BFF anahtarı sunucuda tutar, tarayıcıya yalnızca script'in dokunamadığı bir cookie verir.
Bir yorum alanındaki küçük bir açık, sayfaya saldırganın script’ini yerleştirdi. Kullanıcının giriş anahtarı da aynı sayfada, localStorage’da duruyordu.
-
Bayt: Yorum alanından sayfaya yabancı bir script sızmış!
-
Sen: Sayfayı kapatırız, olur biter.
-
Bayt: Kullanıcının giriş anahtarı da localStorage'daydı...
-
Bayt: Otel kartını masada mı bırakmalı, resepsiyonda mı tutmalı?
Anahtar tarayıcıda nerede duruyor?
Access token localStorage'da. Sayfaya bir XSS script'i enjekte edildi. Script token'la ne yapabilir? Cevabı göster
Okuyup saldırganın sunucusuna gönderebilir. Token süresi dolana kadar her yerden kullanılır; sayfayı kapatmak saldırıyı durdurmaz.
Adım adım oku
- Token localStorage'daysa sayfadaki her script onu okuyabilir, sitenin kendi kodu da, sızan kötü script de.
- Sızan script token'ı okuyup saldırganın sunucusuna yollar; saldırgan artık her yerden giriş yapabilir.
- Token handler kalıbında token BFF'te, yani sunucuda kalır; arka servislere onu BFF ekler.
- Tarayıcı yalnızca HttpOnly bir cookie taşır; script onu okuyamaz, bu yüzden dışarı da yollayamaz.
XSSCross-site scripting: saldırganın script'inin bir sayfada o sitenin kendi kodu gibi çalışması. Script'in erişebildiği her şeye, localStorage dahil, erişir.Sözlükte gör →, saldırganın script’inin sitenin kendi kodu gibi çalışmasıdır. Script’in erişebildiği her depolamaya o da erişir. Token’ı yalnızca JavaScript belleğinde tutmak bunu zorlaştırır, ama sayfa yenilenince oturum düşer.
Kafam karıştı, daha basit anlat
Anahtarı tarayıcıda saklarsan, sayfaya sızan kötü bir kod da onu bulabilir. Anahtarı cebinden alıp götürür, sen sayfayı kapatsan bile kullanmaya devam eder.
Bir SPA access token'ı localStorage'da tutuyor. En büyük risk ne?
Token'ı yalnızca JavaScript belleğinde tutmak XSS'e karşı localStorage'dan daha iyidir. Pratikteki en büyük bedeli ne?
Token handler: token sunucuda, cookie tarayıcıda
token handlerTarayıcı uygulamasının OAuth token'larını BFF'in sunucu tarafında tutması; tarayıcıya yalnızca HttpOnly bir oturum cookie'si verilir ve BFF token'ı arka servislere kendisi ekler.Sözlükte gör → kalıbında OAuth akışını BFF tamamlar ve token’ları kendi tarafında saklar. Tarayıcı yalnızca bir HttpOnly cookieJavaScript'in okuyamadığı, yalnızca tarayıcının isteklere otomatik eklediği cookie. XSS bu cookie'nin değerini çalamaz; ama sayfa açıkken istek atabilir.Sözlükte gör → taşır; BFF arka servislere token’ı kendisi ekler.
spring.cloud.gateway.routes: - id: orders uri: lb://orders predicates: [ Path=/api/orders/** ] filters: [ TokenRelay= ] # oturumdaki token'ı Authorization başlığına koyarBedeli CSRF’tir. Cookie’ler kendiliğinden gönderilir; CSRFTarayıcının isteğe otomatik eklediği kimlik bilgilerini başka bir sitenin sömürmesi. Token elle eklenen bir başlıktaysa bu saldırı yüzeyi yoktur; cookie'deyse vardır.Sözlükte gör → için SameSite=Lax/Strict ve state değiştiren isteklerde bir CSRF token gerekir.
Bir internet bankacılığı sitesinde bu kalıbın nasıl durduğuna küçük bir örnekle bakalım. İyi haber: havale gönderen sayfa token’ı hiç görmüyor.
Derinleş · İnternet bankacılığı: token BFF'te, cookie tarayıcıda 4 dosya · ~82 satır · ilk okumada atlayabilirsin
Kafam karıştı, daha basit anlat
Anahtar sunucuda, kasada durur. Tarayıcıya sadece bir vestiyer fişi verilir. Sayfadaki kötü kod bu fişi okuyamaz, tarayıcı onu yalnızca bu siteye giden isteklere ekler.
Token handler (BFF) kalıbında access token nerede durur ve tarayıcı ne taşır?
Token handler ile oturum artık bir cookie'ye bağlı. Hangi yeni risk ortaya çıkar ve nasıl kapatılır?
Kendin gör
Token nerede durmalı — tarayıcıda mı, BFF'te mi?
Tohum 290229SPA: localStorage
Tarayıcı
access_token (localStorage)
BFF
—
Arka servisler
Authorization: Bearer …
- Oynat ya da adımla.
Şu an ne oldu?
SPA: localStorage
Bir olay gerçekleşmek üzere.
Görevler0/4
Bir XSS ile token'ı saldırganın sunucusuna taşıaçık
İpucu
Script'in doğrudan okuyabildiği bir depolama.
Sayfa yenilemesiyle kullanıcıyı oturumdan düşüraçık
İpucu
Token hiçbir kalıcı yerde durmuyorsa?
Başka bir siteden gelen sahte bir isteği başarılı kılaçık
İpucu
Cookie'ler kendiliğinden gönderilir — tarayıcıya bunu yasaklamadıysan.
Token handler ile sahte isteği reddetaçık
İpucu
BFF ve doğru cookie ayarı.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Olayı XSS yap. localStorage: token çalındı.
- Belleğe geç. Token dışarı çıkmadı; olayı “sayfa yenilendi” yap — oturum düştü.
- BFF seç, olayı XSS yap. Sayfa içinde istek atılabiliyor, ama token çalınamıyor.
- Olayı CSRF yap, SameSite kapalı. Sahte istek geçti. SameSite’ı aç.
Token handler'a geçtin. XSS riski tamamen ortadan kalktı mı?
BFF, GraphQL, gateway: hangisi ne zaman?
| Yapı | Cevapladığı soru | Riski |
|---|---|---|
| Gateway | Bütün istemciler için ortak işler nerede? | İş mantığı girerse darboğaz |
| BFF | Bu istemcinin ekranı ve güvenliği için ne gerekiyor? | İstemci sayısıyla çoğalır |
| GraphQL | İstemci hangi alanları istediğini kendisi söylesin mi? | Pahalı sorgular, N+1 |
Üçü birbirinin rakibi değil. Önde bir gateway, web için token handler bir BFF, istemciler çeşitlendikçe bir GraphQL katmanı birlikte durabilir.
Her ihtiyacı en uygun yapıyla eşleştir.
Tuzaklar
SameSite=None bir oturum cookie’si. Başka sitelerden gelen isteklere de eklenir.
Pod belleğinde token. İstek başka pod’a düşünce oturum kaybolur; Redis gibi paylaşılan bir depo gerekir.
XSS’i çözülmüş sanmak. Token handler hasarı sınırlar; XSS’i önlemek CSP ve doğru çıktı kodlamanın işi.
Arka servise geniş kapsamlı token. Her servis yalnızca ihtiyacı olan kapsamı görmeli.
BFF'in oturum cookie'si böyle ayarlanmış. Güvenlik incelemesinde hangi satırlar işaretlenir?
Kendini sına
localStorage'daki bir değeri sayfaya sızan kötü bir script de okuyabilir.
Token handler BFF üç pod'la çalışıyor ve token'ları her pod kendi belleğinde tutuyor. Ne olur?
Aklında kalacak üç şey
- 1 localStorage'daki bir token'ı sayfaya sızan bir script okuyup dışarı taşıyabilir. Bellekte tutmak bunu zorlaştırır, ama sayfa yenilenince oturum düşer.
- 2 Token handler'da token'lar BFF'te durur, tarayıcı yalnızca HttpOnly bir cookie taşır. Kötü script hâlâ zarar verebilir, ama token'ı çalamaz.
- 3 Cookie ile çalışan oturum CSRF riskini geri getirir: SameSite=Lax/Strict ve gerekirse CSRF token şarttır.
4 kart sonraki derste seni bekliyor