Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-20.S02

BFF, SSR, hydration ve server actions

Browser’a gönderilen veriyle server’da kalan context’i ayır. Önceki render, sonraki action için permission değildir.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

SSR görünümü

  1. SSR isteği hazır

    Client note-A için ilk SSR görünümünü ister. Server henüz public HTML’i ve ilk title’ı üretmemiştir.

    Client view
    SSR görünüm isteği hazır
    BFF / entry
    Henüz değerlendirilmedi
    Public catalog
    Sabit public kayıt hazır
  2. Server request’i aldı

    Request server’a ulaşır. Kaynak izni ve güncel context bundan sonra ayrı değerlendirilir.

    Client view
    SSR görünüm isteği hazır
    BFF / entry
    SSR isteği geldi; data gate bekliyor
    Public catalog
    Sabit public kayıt hazır
  3. Güncel entry kabul edildi

    Doğrulanmış current actor ve object/action permission kabul edilir. Public catalog read hazırlanır.

    Client view
    SSR görünüm isteği hazır
    BFF / entry
    Current actor/object/action kabul; catalog read hazır
    Public catalog
    Sabit public kayıt hazır
  4. Catalog request’i aldı

    Catalog note-A okuma isteğini alır. Sabit public title response’u hazırlanır; gerçek network ölçümü yapılmaz.

    Client view
    SSR görünüm isteği hazır
    BFF / entry
    Current actor/object/action kabul; catalog read hazır
    Public catalog
    İstek geldi; public yanıt hazır
  5. Title server’a ulaştı

    Server public catalog title’ını alır. Public projection henüz hazırlanmamıştır.

    Client view
    SSR görünüm isteği hazır
    BFF / entry
    Public kayıt geldi; projection bekliyor
    Public catalog
    İstek geldi; public yanıt hazır
  6. Public projection hazır

    Server yalnız title alanını public yanıt için seçer. Server context’in diğer alanları response’a dahil edilmez.

    Client view
    SSR görünüm isteği hazır
    BFF / entry
    Title seçildi; HTML/initial DTO hazır
    Public catalog
    İstek geldi; public yanıt hazır
  7. Public görünüm client’ta

    Client Tea & Bread yanıtını alır. Bu title verisi, sonraki action için permission belgesi değildir.

    Client view
    Public HTML/DTO geldi; initial view bekliyor
    BFF / entry
    Title seçildi; HTML/initial DTO hazır
    Public catalog
    İstek geldi; public yanıt hazır
  8. Client title’ı kullandı

    Client ilk görünümündeki title ile aynı DTO title’ını eşleştirir. Bu sonlu veri karşılaştırması gerçek React hydration değildir; sonraki action için server yeni karar verir.

    Client view
    Initial title eşleşti; actual hydration yok
    BFF / entry
    Title seçildi; HTML/initial DTO hazır
    Public catalog
    İstek geldi; public yanıt hazır

Action okuma

  1. Action isteği hazır

    Client readTitle action isteğini hazırlar. Önceki render current operation için permission değildir.

    Client view
    readTitle action intent hazır
    BFF / entry
    Henüz değerlendirilmedi
    Public catalog
    Sabit public kayıt hazır
  2. Server request’i aldı

    Request server’a ulaşır. Kaynak izni ve güncel context bundan sonra ayrı değerlendirilir.

    Client view
    readTitle action intent hazır
    BFF / entry
    Action intent geldi; current gate bekliyor
    Public catalog
    Sabit public kayıt hazır
  3. Güncel action kabul edildi

    Doğrulanmış current actor ve object/action permission kabul edilir. Public catalog read hazırlanır.

    Client view
    readTitle action intent hazır
    BFF / entry
    Current actor/object/action kabul; catalog read hazır
    Public catalog
    Sabit public kayıt hazır
  4. Catalog request’i aldı

    Catalog note-A okuma isteğini alır. Sabit public title response’u hazırlanır; gerçek network ölçümü yapılmaz.

    Client view
    readTitle action intent hazır
    BFF / entry
    Current actor/object/action kabul; catalog read hazır
    Public catalog
    İstek geldi; public yanıt hazır
  5. Title server’a ulaştı

    Server public catalog title’ını alır. Public projection henüz hazırlanmamıştır.

    Client view
    readTitle action intent hazır
    BFF / entry
    Public kayıt geldi; projection bekliyor
    Public catalog
    İstek geldi; public yanıt hazır
  6. Public projection hazır

    Server yalnız title alanını public yanıt için seçer. Server context’in diğer alanları response’a dahil edilmez.

    Client view
    readTitle action intent hazır
    BFF / entry
    Title seçildi; action JSON yanıt hazır
    Public catalog
    İstek geldi; public yanıt hazır
  7. Public görünüm client’ta

    Client Tea & Bread yanıtını alır. Bu title verisi, sonraki action için permission belgesi değildir.

    Client view
    Action title JSON geldi: Tea & Bread
    BFF / entry
    Title seçildi; action JSON yanıt hazır
    Public catalog
    İstek geldi; public yanıt hazır
  8. Client title’ı kullandı

    Client public title sonucunu yerel state’ine alır. Sonraki işlem için server’da yeni karar gerekir.

    Client view
    Action sonucu yerel kayda alındı
    BFF / entry
    Title seçildi; action JSON yanıt hazır
    Public catalog
    İstek geldi; public yanıt hazır

Entry ret

  1. Action isteği hazır

    Client readTitle action isteğini hazırlar. Önceki render current operation için permission değildir.

    Client view
    readTitle action intent hazır
    BFF / entry
    Henüz değerlendirilmedi
    Public catalog
    Sabit public kayıt hazır
  2. Server request’i aldı

    Request server’a ulaşır. Kaynak izni ve güncel context bundan sonra ayrı değerlendirilir.

    Client view
    readTitle action intent hazır
    BFF / entry
    Action intent geldi; current gate bekliyor
    Public catalog
    Sabit public kayıt hazır
  3. Action reddedildi

    Page daha önce render edilmiş olsa da current action permission reddedilir. Catalog dispatch ve result body hazırlanmaz.

    Client view
    readTitle action intent hazır
    BFF / entry
    Action permission ret; ret hazır; body yok
    Public catalog
    Sabit public kayıt hazır
  4. Client ret sonucunu aldı

    Client ret kararını alır. Catalog dispatch, public title body ve write oluşmaz.

    Client view
    Ret geldi; body/delivery/write yok
    BFF / entry
    Action permission ret; ret hazır; body yok
    Public catalog
    Sabit public kayıt hazır

Context eksik

  1. Action isteği hazır

    Client readTitle action isteğini hazırlar. Önceki render current operation için permission değildir.

    Client view
    readTitle action intent hazır
    BFF / entry
    Henüz değerlendirilmedi
    Public catalog
    Sabit public kayıt hazır
  2. Server request’i aldı

    Request server’a ulaşır. Kaynak izni ve güncel context bundan sonra ayrı değerlendirilir.

    Client view
    readTitle action intent hazır
    BFF / entry
    Action intent geldi; current gate bekliyor
    Public catalog
    Sabit public kayıt hazır
  3. Current actor bilgisi eksik

    Önceki rendered page identity yerine kullanılmaz. Current actor bilgisi eksikken dispatch ve result body hazırlanmaz.

    Client view
    readTitle action intent hazır
    BFF / entry
    Actor evidence unknown; ret hazır; body yok
    Public catalog
    Sabit public kayıt hazır
  4. Client ret sonucunu aldı

    Client ret kararını alır. Catalog dispatch, public title body ve write oluşmaz.

    Client view
    Ret geldi; body/delivery/write yok
    BFF / entry
    Actor evidence unknown; ret hazır; body yok
    Public catalog
    Sabit public kayıt hazır

ROLLER · STATE · VERİ AKIŞI

SPA, BFF ve SSR farklı işler yapar

SPA client’ın navigation ve view state’ini yönetebilir; BFF o interface’e uygun server adapter’dır. SSR ilk HTML’i server’da oluşturur. Bu üç rol aynı deployment’ta bulunsa da biri diğerinin zorunlu adı değildir. Public notlar örneğinde BFF, catalog record’dan yalnız title seçer; mobil ve web interface’in ayrı ihtiyaçları varsa projection’ları farklı olabilir. Ortak domain permission yine ilgili service contract’ının parçasıdır.

BFF ek bir network hop, failure boundary ve context taşıma kararı getirir. Browser actor ile BFF service identity aynı özne değildir. Bir service BFF’den çağrı alırken hangi iş bağlamını ve hangi kullanıcı yetkisini kabul ettiğini açık tanımlar. Bu derste context-A harmless bir alias’tır; credential taşınmaz. BFF pattern tek bir OAuth storage yöntemi zorunlu kılmaz; framework veya GraphQL seçimi de business permission ihtiyacını kaldırmaz.

Server’da üretilen veri ne zaman public olur?

Server record title, internalReviewState ve serverOnlyContextAlias içerir. Son iki değer bu örnekte sır değildir; yine de public contract’ın dışındadır. Public projection açıkça {title: Tea & Bread} seçer. Bütün record’u serialize edip UI’da bazı alanları gizlemek aynı sınırı sağlamaz: browser’a giden alan browser verisi olmuştur. Server’da hesaplanmış olması delivered props’u yeniden private yapmaz.

SSR çıktısı sabit HTML text context’inde <h1>Tea &amp; Bread</h1> olur. JSON projection ayrı veri olarak {"title":"Tea & Bread"} taşır. HTML text escaping ile JSON serialization farklı formatların kurallarıdır; JSON.stringify tek başına her HTML veya inline-script context’i için encoder değildir. Burada inline script yoktur. Hydration ilk client görünümünün server title ile eşleşmesini bekleyen ayrı aşamadır; React hydrateRoot bu davranış için bir örnektir, bütün SSR mimarilerinin zorunlu runtime’ı değildir.

Server action yeni bir entry point’tir

Sayfanın daha önce render edilmiş olması sonraki operation’ın current permission kanıtı değildir. Modern framework’lerde client’ın çağırdığı server function veya action, kendi input ve identity context’iyle server boundary’den yeniden geçer. Next.js guide bu ayrımı action içinde authn ve object permission ile açıklar. Bir action identifier, UI düğmesi veya client bundle’da görünürlük permission belgesi olarak kullanılmaz.

Artifact’te readTitle action sıradan public okuma contract’ıdır; gerçek Next action endpoint’i kurulmaz. Verified actor, current action permission ve current object permission ayrı supplied gate’lerdir. PagePreviouslyRendered bütün satırlarda true iken action ret veya context eksikliği body üretmez. Yazma action’ı varsa server-owned state transition ve current domain koşulları bu gate’lere eklenir; read örneğinin write=false sonucu mutation güvenliğinin genel testi sayılmaz.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Action ret

  1. Önceki sayfa oluşturulmuş

    Entry-denied row pagePreviouslyRendered=true taşır. Bu alan geçmiş render’ı anlatır; yeni action’ın güncel koşullarını değerlendirmez.

    Entry / UI
    pagePreviouslyRendered=true
    Güncel karar
    mode=action
    Güven sınırı
    Güncel karar henüz okunmadı
  2. Actor ve object olumlu

    VerifiedActorDeclared=true ve currentObjectPermissionDeclared=true verilmiş. Action permission henüz bu iki alanla belirlenmez.

    Entry / UI
    verifiedActorDeclared=true
    Güncel karar
    currentObjectPermissionDeclared=true
    Güven sınırı
    Action ayrıca gerekir
  3. Güncel action kararı ret

    CurrentActionPermissionDeclared=false. Önceki render’ın olumlu olması bu yeni entry için action kararını true yapmaz.

    Entry / UI
    currentActionPermissionDeclared=false
    Güncel karar
    pagePreviouslyRendered=true
    Güven sınırı
    Geçmiş render != güncel action izni
  4. Dispatch ve body yok

    ExpectedDispatch=false, expectedDelivery=false ve expectedBody=null. Row başka entry’nin title sonucunu kullanarak başarılı yapılmaz.

    Entry / UI
    expectedDispatch=false
    Güncel karar
    expectedBody=null
    Güven sınırı
    Action entry’de durdu
  5. Button veya ID yetki vermez

    ClientButtonIsPermission=false ve actionIdIsPermission=false. UI’de control bulunması veya action identifier’ın bilinmesi server kararının yerine geçmez.

    Entry / UI
    clientButtonIsPermission=false
    Güncel karar
    actionIdIsPermission=false
    Güven sınırı
    Karar server entry’de gerekir
  6. Kabul kapsamını genişletme

    RenderAdmissionCoversAction=false bu ayrımı özetler. Öğrenci hangi entry’nin hangi anda hangi action’ı kabul ettiğini sorar.

    Entry / UI
    mode=action / action permission=false
    Güncel karar
    renderAdmissionCoversAction=false
    Güven sınırı
    Her entry kendi koşuluyla

Public projection

  1. Server record daha geniş

    ServerRecord title, internalReviewState ve serverOnlyContextAlias taşır. Bir object’in server’da var olması bütün alanlarının client’a verileceği anlamına gelmez.

    Entry / UI
    serverRecord.title=Tea & Bread
    Güncel karar
    serverOnlyContextAlias=context-A
    Güven sınırı
    Public seçim henüz incelenmedi
  2. Public alan açıkça seçilir

    PublicProjection yalnız title içerir. Bu örnekte internalReviewState ve serverOnlyContextAlias public DTO’ya dahil değildir.

    Entry / UI
    publicProjection: title only
    Güncel karar
    title=Tea & Bread
    Güven sınırı
    Dar DTO
  3. JSON ayrı representation

    SerializedPublicJSON title alanını JSON formatında taşır. JSON serialization veriyi server-only tutmaz; teslim edilirse client tarafından okunabilir.

    Entry / UI
    serialized JSON: title only
    Güncel karar
    deliveredDataRemainsServerOnly=false
    Güven sınırı
    Serialization gizlilik sağlamaz
  4. HTML text farklı context

    PublicHTML Tea &amp; Bread text’ini h1 içinde gösterir. Bu HTML text-context encoding’i JSON string escaping ile aynı işlem değildir.

    Entry / UI
    htmlTextContext=true
    Güncel karar
    inlineScriptUsed=false
    Güven sınırı
    Enclosing context ayrı
  5. JSON evrensel HTML güvenliği değildir

    JSONEncodingIsUniversalHTMLSafety=false. Bu sabit text örneğinin encoding’i başka enclosing context’lere otomatik genellenmez.

    Entry / UI
    JSONEncodingIsUniversalHTMLSafety=false
    Güncel karar
    publicHTML=<h1>Tea &amp; Bread</h1>
    Güven sınırı
    Context’e uygun encoding gerekir
  6. Teslim edilen title client verisidir

    Server’ın title’ı üretmesi veya server-only record’dan seçmesi title’ı client’tan saklamaz. Sınır client’a hiç verilmeyen alanlarda kurulmuştur.

    Entry / UI
    publicProjection.title=Tea & Bread
    Güncel karar
    serverOnlyContextAlias excluded
    Güven sınırı
    Verilmeyen alan ve delivered alan ayrı

VARSAYIM · SINIR · KONTROL

Bozulan varsayım: server üretimi private kalır

Red incelemesi önce record’un projection’a geçerken ne kaybettiğini sorar. Tea & Bread görünümünü göstermek için internal review alanı veya service context alias’ı gerekmiyor. Eğer bu alanlar serializer’a dahil edilirse son kullanıcıya gösterilmemeleri veri boundary’sini geri getirmez. Burada karşılaştırılan iki object tamamen harmless’tır; gerçek secret çıkarma veya browser’dan başka sisteme taşıma yoktur.

Hydration mismatch satırı server title Tea & Bread iken client title Book Club olduğunda initial-view contract’ının bozulduğunu gösterir. Bu yerel string eşitliği actual DOM hydration sonucu değildir. Bir framework’ün recoverable hata davranışı bütün attribute’ları otomatik onaracağı anlamına gelmez. Görünümün tutarlılığı ile authorization doğru çalıştı iddiası ayrı kalmalıdır; title eşitliği actor doğrulamaz.

Bozulan varsayım: entry point önceki gate’i miras alır

Bir sayfa için verilmiş permission kararının kapsamı o anki render talebidir. Action-read ve entry-denied aynı pagePreviouslyRendered değerini taşır ama farklı current action permission sonucuna sahiptir. İkinci satırda catalog’a mesaj gönderilmez. Current context eksikse önceki page state ile identity tahmin edilmez; bilinmeyen kanıt görünür biçimde null kalır ve delivery durur.

İnceleme UI’daki düğmeyi kaldırmayı server-side fix diye yazmaz. Gerekli kontrol operation’ın subject, object, action ve current context’ini server’ın değerlendirmesidir. Etki iddiası da yalnız bu sınırda gözlenen dispatch/body ile ölçülür. Action security konusunda bu ders inert kabul/ret fixture sunar; endpoint çağrı yöntemi, action keşfi, identifier toplama veya framework vulnerability reproduction anlatmaz.

3. Blue · Güvenli geliştirme ve savunma

Hareket olmadan bütün senaryoları oku

Actor bilinmiyor

  1. Eski render yine var

    Bu kaydın üreticileri yerel JSON serializer, HTML bağlamına uygun encoder ve ilk title karşılaştırmasıdır; action gate alanları seçilmiş policy girdileridir. Gerçek React hydration veya server framework log’u ölçülmez. Context-missing row pagePreviouslyRendered=true taşır. Güncel action’ın actor bilgisi için aynı render kaydı kullanılmaz.

    Render kaydı
    pagePreviouslyRendered=true
    Context / initial view
    mode=action
    Kanıt sınırı
    Current actor henüz incelenmedi
  2. Actor predicate null

    VerifiedActorDeclared=null. Kimliği doğrulanmış actor bu row’da bilinmiyor; null false olarak da true olarak da yeniden adlandırılmaz.

    Render kaydı
    verifiedActorDeclared=null
    Context / initial view
    currentActionPermissionDeclared=true
    Kanıt sınırı
    Actor bilgisi UNKNOWN
  3. Object true eksik actor’ı doldurmaz

    CurrentObjectPermissionDeclared=true başka bir supplied girdidir. Actor context’i eksikken iki olumlu permission alanı doğrulanmış actor oluşturmaz.

    Render kaydı
    currentObjectPermissionDeclared=true
    Context / initial view
    verifiedActorDeclared=null
    Kanıt sınırı
    Girdiler birbirini yerine koymaz
  4. Bu entry dispatch yapmaz

    ExpectedDispatch=false ve expectedBody=null. Fail-closed sonuç, kimlik doğrulama servisinin kesin ret verdiği anlamına gelmez; burada bilgi eksik.

    Render kaydı
    expectedDispatch=false
    Context / initial view
    expectedBody=null
    Kanıt sınırı
    Eksik context nedeniyle durdu
  5. Ret ile unknown ayrı

    Entry-denied action=false taşır; context-missing actor=null taşır. Eşit no-delivery sonuçlarına rağmen kararın nedeni farklıdır.

    Render kaydı
    actor=null / action=true
    Context / initial view
    delivery=false
    Kanıt sınırı
    Eksik actor evidence
  6. Aynı entry’nin current context’ini ara

    Gereken gözlem yeni action çağrısının actor context’idir. Önceki HTML, button veya başka request’in başarı kaydı bu alanın yerine geçmez.

    Render kaydı
    current actor evidence required
    Context / initial view
    renderAdmissionCoversAction=false
    Kanıt sınırı
    Kanıt güncel entry’ye ait olmalı

Initial title

  1. Server initial title belirli

    Bu kaydın üreticileri yerel JSON serializer, HTML bağlamına uygun encoder ve ilk title karşılaştırmasıdır; action gate alanları seçilmiş policy girdileridir. Gerçek React hydration veya server framework log’u ölçülmez. HydrationLedger serverInitialTitle=Tea & Bread taşır. Bu field yalnız initial view girdisidir; permission kararı değildir.

    Render kaydı
    serverInitialTitle=Tea & Bread
    Context / initial view
    Client initial title henüz incelenmedi
    Kanıt sınırı
    Initial view girdisi
  2. Aynı title beklenen eşleşme

    ClientInitialTitle=Tea & Bread olan row expectedMatch=true taşır. Eşleşme title consistency’sidir; event handler’ın gerçek browser’da bağlandığı gösterilmez.

    Render kaydı
    server=Tea & Bread / client=Tea & Bread
    Context / initial view
    expectedMatch=true
    Kanıt sınırı
    Consistency gözlendi
  3. Diğer row farklı title taşır

    ClientInitialTitle=Book Club olan row expectedMatch=false. Bir row’un eşleşmesi diğer row’u başarılı yapmaz.

    Render kaydı
    server=Tea & Bread / client=Book Club
    Context / initial view
    expectedMatch=false
    Kanıt sınırı
    İki row ayrı
  4. Framework çalıştırılmadı

    ActualHydration=false ve actualFramework=false. Sabit title karşılaştırması React hydration runtime’ının sonucu diye sunulmaz.

    Render kaydı
    actualHydration=false
    Context / initial view
    actualFramework=false
    Kanıt sınırı
    Beklenen model eşleşmesi
  5. View eşleşmesi private cache sınırını çözmez

    Private projection için viewer context partition gerekir. Title eşleşmesi başka viewer’ın representation’ını kullanma izni vermez.

    Render kaydı
    viewerContextPartitionRequiredForPrivateProjection=true
    Context / initial view
    actualPrivateCache=false
    Kanıt sınırı
    View ve privacy scope ayrı
  6. Gözlenen scope’u raporla

    Rapor initial title karşılaştırmasını ve framework çalıştırılmadığını birlikte belirtir. UI görünümü, permission ve actual hydration için ayrı gözlemler gerekir.

    Render kaydı
    one expectedMatch=true / one=false
    Context / initial view
    actualBrowser=false
    Kanıt sınırı
    Title consistency kadar kanıt

UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA

Minimal projection ve eşleşen initial state

Bu kaydın üreticileri yerel JSON serializer, HTML bağlamına uygun encoder ve ilk title karşılaştırmasıdır; action gate alanları seçilmiş policy girdileridir. Gerçek React hydration veya server framework log’u ölçülmez. Blue contract server record ile public DTO’yu ayrı tutar. Public title projection’ı allowlist alanlarla oluşturulur; generic spread veya bütün record serialization yerine bu dar contract tercih edilir. Private projection kullanılan gerçek sistemde viewer context’e göre cache ayrımı gerekir; public title örneğinde private cache uygulanmaz. Cache’de yanlış actor’a ait hazır projection bulmak yeni permission yerine geçmez.

SSR text output kendi HTML context encoder’ıyla, JSON output kendi serializer’ıyla üretilir. İlk client state aynı approved DTO’dan türetilirse title tutarlılığı açıklanabilir. Ayrı formatların byte çıktıları birbirine karıştırılmaz ve inline script bu örneğe eklenmez. Native gözlem sabit Tea & Bread title projection’ı, JSON roundtrip’i ve text escaping’i doğrular; gerçek browser parse, React attach veya hydration recovery çalıştırılmaz.

Her operation için güncel karar kaydı

Action contract’ı input schema, verified actor, action permission, object permission ve domain koşulları olarak yazılır. Sayfa render’ından gelen “zaten giriş yaptı” varsayımı bu listeyi kısaltmaz. Context yoksa no-dispatch; permission ret ise no-dispatch; kabul edilen public read yalnız title body üretir. Bu üç sonuç regression fixture’da ayrı reason ve evidence alanlarıyla izlenir.

Test bir previous-page flag true iken current action ret’in body üretmediğini göstermelidir. Başarılı ordinary read ise yalnız public projection’ı döndürür, internalReviewState ve context alias’ı dışarı çıkmaz. Shared reducer mesaj hareketi sırasında önceki receiver snapshot’ını tutar; varışta receiver güncellenir. Bu görsel kanıt action framework runtime’ının güvenlik testi yerine kullanılmaz. Gerçek uygulama kendi entry point, session ve cache implementation’ında bu contract’ı ayrıca sınar.

ŞİMDİ VAKAYA UYGULA

Önceki render kararı yeni action çağrısını yetkilendirir mi?

Atlas Tea & Bread başlığını public bir projection ile gösterir. Render ve action ayrı entry’lerdir; aynı title taşımaları aynı permission kararını paylaştıkları anlamına gelmez.

Vakadaki response’a hangi component’ler katkıda bulunuyor? UI, service, platform ve dış provider sonuçlarının hangi hop’ta tamamlandığını ayrı göster.

Bağlı vaka dosyasını aç ↗

ÖRNEĞİ BİRLİKTE OKUYALIM

Public projection ve action kararı

Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.

Ham kaydı ve alan açıklamalarını oku
{
  "profile": {
    "title": "Tea & Bread",
    "resource": "note-A",
    "action": "readTitle",
    "actualFramework": false,
    "actualBrowser": false,
    "actualHydration": false,
    "actualNetwork": false
  },
  "rows": [
    {
      "case": "normal",
      "label": [
        "SSR görünümü",
        "SSR view"
      ],
      "mode": "render",
      "verifiedActorDeclared": true,
      "currentActionPermissionDeclared": true,
      "currentObjectPermissionDeclared": true,
      "pagePreviouslyRendered": true,
      "expectedDelivery": true,
      "expectedDispatch": true,
      "expectedWrite": false,
      "expectedBody": {
        "title": "Tea & Bread"
      }
    },
    {
      "case": "action-read",
      "label": [
        "Action okuma",
        "Action read"
      ],
      "mode": "action",
      "verifiedActorDeclared": true,
      "currentActionPermissionDeclared": true,
      "currentObjectPermissionDeclared": true,
      "pagePreviouslyRendered": true,
      "expectedDelivery": true,
      "expectedDispatch": true,
      "expectedWrite": false,
      "expectedBody": {
        "title": "Tea & Bread"
      }
    },
    {
      "case": "entry-denied",
      "label": [
        "Entry ret",
        "Entry denied"
      ],
      "mode": "action",
      "verifiedActorDeclared": true,
      "currentActionPermissionDeclared": false,
      "currentObjectPermissionDeclared": true,
      "pagePreviouslyRendered": true,
      "expectedDelivery": false,
      "expectedDispatch": false,
      "expectedWrite": false,
      "expectedBody": null
    },
    {
      "case": "context-missing",
      "label": [
        "Context eksik",
        "Context missing"
      ],
      "mode": "action",
      "verifiedActorDeclared": null,
      "currentActionPermissionDeclared": true,
      "currentObjectPermissionDeclared": true,
      "pagePreviouslyRendered": true,
      "expectedDelivery": false,
      "expectedDispatch": false,
      "expectedWrite": false,
      "expectedBody": null
    }
  ],
  "serverRecord": {
    "title": "Tea & Bread",
    "internalReviewState": "draft",
    "serverOnlyContextAlias": "context-A"
  },
  "publicProjection": {
    "title": "Tea & Bread"
  },
  "serializedPublicJSON": "{\"title\":\"Tea & Bread\"}",
  "publicHTML": "<h1>Tea &amp; Bread</h1>",
  "serializationBoundary": {
    "htmlTextContext": true,
    "inlineScriptUsed": false,
    "JSONEncodingIsUniversalHTMLSafety": false
  },
  "hydrationLedger": [
    {
      "serverInitialTitle": "Tea & Bread",
      "clientInitialTitle": "Tea & Bread",
      "expectedMatch": true
    },
    {
      "serverInitialTitle": "Tea & Bread",
      "clientInitialTitle": "Book Club",
      "expectedMatch": false
    }
  ],
  "architecture": {
    "SPA": "client-side view management",
    "BFF": "interface-specific server adapter",
    "SSR": "server creates initial markup",
    "hydration": "client attaches behavior to matching initial markup",
    "serverAction": "separate server entry requiring current gates"
  },
  "cacheBoundary": {
    "viewerContextPartitionRequiredForPrivateProjection": true,
    "actualPrivateCache": false
  },
  "boundaries": {
    "clientButtonIsPermission": false,
    "actionIdIsPermission": false,
    "renderAdmissionCoversAction": false,
    "deliveredDataRemainsServerOnly": false
  }
}
profile
Public title okumasının kapsamını gösterir. Gerçek framework, browser veya hydration çalıştırma kaydı değildir.
rows
Render ve action entry’lerinde güncel actor, object ve action koşulları değerlendirilir; geçmiş render sonucu yeterli değildir.
serverRecord
Server record’ın bütün alanları public DTO’ya dahil edilmez. Internal context ile client’a verilecek title ayrı tutulur.
publicProjection
Client’a yalnız title alanı verilir; dar projection diğer server alanlarını dışarıda bırakır.
serializedPublicJSON
Public DTO’nun JSON representation’ıdır. Serialization client’a teslim edilen veriyi server-only yapmaz.
publicHTML
Title sabit HTML text context’inde gösterilir. HTML escaping ile JSON escaping aynı encoding değildir.
serializationBoundary
Encoding enclosing context’e bağlıdır. Bu örnek inline script kullanmaz ve JSON’u evrensel HTML güvenliği saymaz.
hydrationLedger
Server ve client initial title’ları karşılaştırılır. Bu eşitlik gerçek React hydration sonucu değildir.
architecture
SPA, BFF, SSR, hydration ve server action farklı sorumlulukları anlatır.
cacheBoundary
Private projection yeniden kullanılacaksa viewer context ayrımı gerekir. Bu örnekte gerçek private cache yoktur.
boundaries
Button, action ID ve önceki render current permission değildir; teslim edilen veri artık client tarafından okunabilir.

Sabit HTML/JSON ve supplied action gates; gerçek Next, React, browser veya server action endpoint’i yok.

İki yanlış kanı

Server’da hesaplanan prop private kalır.

Client’a serialize edilen alan delivered veridir; public projection önceden daraltılır.

Page login action iznini de kanıtlar.

Action ayrı entry point’tir; current actor ve object/action permission yeniden değerlendirilir.

SIRA SENDE

Bu hikâyeyi sen çöz.

Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.

Page daha önce render edilmiş, fakat server action için currentActionPermissionDeclared=false. Action dispatch yapılır mı?

  1. Hayır. Dispatch yok; body=null.
  2. Evet. Render edilmiş page sonraki action’lara kalıcı grant verir.
Gerekçeli cevabı oku

Hayır. Dispatch yok; body=null. — entry-denied branch’i güncel action iznini ister. Button veya action ID’sinin elde olması permission değildir.

Server record’daki internalReviewState ve serverOnlyContextAlias neden public JSON/HTML’de yok?

Dersten seçilen artifact alanları; öğretim örneği

serverRecord
{"title":"Tea & Bread","internalReviewState":"draft","serverOnlyContextAlias":"context-A"}
publicProjection
{"title":"Tea & Bread"}
serializedPublicJSON
{"title":"Tea & Bread"}
publicHTML
<h1>Tea &amp; Bread</h1>
  1. JSON serialization bütün server field’larını otomatik gizler.
  2. Explicit public projection yalnız title taşır.
Gerekçeli cevabı oku

Explicit public projection yalnız title taşır. — Server’da bulunması her field’ın serialize edileceği anlamına gelmez. Bir field client’a teslim edilirse artık server-only değildir.

Server initial title Tea & Bread, client initial title Book Club. Hydration mismatch neden permission problemiyle aynı değil? JSON output neden her HTML context’inde güvenli encoder değil?

Gerekçeli cevabı oku

Hydration initial markup ile client’ın beklediği state’in eşleşmesini ister; bu örnekte farklı title’lar expectedMatch=false üretir. Mismatch kullanıcı/object izni vermez veya kaldırmaz. JSON serialization data representation’ıdır; inline script veya her HTML context’i için güvenli encoding değildir. Bu örnekte publicHTML, HTML text encoding kullanır; inline script içermez. Gerçek framework, browser veya hydration çalıştırılmaz.

□ Hydration uyumunu authorization sonucundan ayırdım.

□ JSON serialization’ı universal HTML encoder saymadım.

Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç

Kaynaklar ve kapsam

  • Microsoft Backends for Frontends patternContext and problem; Solution; Problems and considerations: interface tailoring and additional hop
  • React hydrateRoot referenceReference / hydrateRoot: attach to existing server-rendered HTML; Caveats: initial content consistency and mismatch limits
  • Next.js Data Security guideData Access Layer: authorization and minimal DTOs; Component-level data access: explicit client props · Mutating Data / Built-in Server Actions Security features; Authentication and authorization: action is a separate entry point
  • RFC 8259 JSON§7 Strings: quotation/backslash/control escaping; §12 Security Considerations: JSON text is data
  • OWASP XSS Prevention: output contextsOutput Encoding for HTML Contexts: fixed element text and HTML entities · Output Encoding for JavaScript Contexts: different enclosing-context requirements