Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-07.05

Redirect, connection ve stateless HTTP

Bir redirect yeni request oluşturur; connection reuse ise mevcut taşıma kaynağını kullanır. Request context, application session ve resource state’in hangi sınırda korunduğunu izle.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

POST → 303 → GET

  1. POST hazır

    JSON body UTF-8 ile 16 byte’tır. Aynı origin’de routing ve content’in yeniden gönderilebilir olması bu örnekte verilmiştir.

    Browser / Duru
    POST /note-titles; 16 byte; response bekleniyor
    Atlas route ve policy
    Request yok
    Resource / connection / session
    Note yok; actionCount=0
  2. İlk POST ulaştı

    Initial method ve content Application’da; action henüz uygulanmadı.

    Browser / Duru
    POST /note-titles; 16 byte; response bekleniyor
    Atlas route ve policy
    POST alındı; content 16 byte
    Resource / connection / session
    Note yok; actionCount=0
  3. Server redirect kararı

    Title action bir kez uygulanır; read-only result için 303 seçilir.

    Browser / Duru
    Response bekleniyor
    Atlas route ve policy
    303 hazır; Location=/notes/atlas-1
    Resource / connection / session
    Note Çay; actionCount=1
  4. Redirect Browser’a ulaştı

    Status ve relative Location alındı; follow request henüz oluşmadı.

    Browser / Duru
    303 alındı; Location biliniyor
    Atlas route ve policy
    303 hazır; Location=/notes/atlas-1
    Resource / connection / session
    Note Çay; actionCount=1
  5. Yeni request context’i

    Location same-origin olarak çözülür; GET, null content; content headers çıkarılır.

    Browser / Duru
    GET /notes/atlas-1; body yok; final response bekleniyor
    Atlas route ve policy
    303 hazır; Location=/notes/atlas-1
    Resource / connection / session
    Note Çay; actionCount=1
  6. Follow request ulaştı

    Yeni request, yeni method/target bağlamıyla Application’a ulaşır; Host aynı reserved authority’dir.

    Browser / Duru
    GET /notes/atlas-1; body yok; final response bekleniyor
    Atlas route ve policy
    GET /notes/atlas-1 alındı
    Resource / connection / session
    Note Çay; actionCount=1
  7. Endpoint sonucu

    GET note representation’ını seçer; submission tekrarlanmaz.

    Browser / Duru
    Final response bekleniyor
    Atlas route ve policy
    200 hazır; text/plain Çay
    Resource / connection / session
    Note Çay; actionCount=1
  8. Final response ulaştı

    200 text/plain Çay alındı; intermediate redirect ve action state artifact’ta ayrı.

    Browser / Duru
    200: Çay; chain tamamlandı
    Atlas route ve policy
    200 hazır; text/plain Çay
    Resource / connection / session
    Note Çay; actionCount=1

POST → 307 → POST

  1. POST hazır

    JSON body UTF-8 ile 16 byte’tır. Aynı origin’de routing ve content’in yeniden gönderilebilir olması bu örnekte verilmiştir.

    Browser / Duru
    POST /note-titles; 16 byte; response bekleniyor
    Atlas route ve policy
    Request yok
    Resource / connection / session
    Note yok; actionCount=0
  2. İlk POST ulaştı

    Initial method ve content Application’da; action henüz uygulanmadı.

    Browser / Duru
    POST /note-titles; 16 byte; response bekleniyor
    Atlas route ve policy
    POST alındı; content 16 byte
    Resource / connection / session
    Note yok; actionCount=0
  3. Server redirect kararı

    Legacy route action uygulamadan 307 seçer.

    Browser / Duru
    Response bekleniyor
    Atlas route ve policy
    307 hazır; Location=/note-titles/new
    Resource / connection / session
    Note yok; actionCount=0
  4. Redirect Browser’a ulaştı

    Status ve relative Location alındı; follow request henüz oluşmadı.

    Browser / Duru
    307 alındı; Location biliniyor
    Atlas route ve policy
    307 hazır; Location=/note-titles/new
    Resource / connection / session
    Note yok; actionCount=0
  5. Yeni request context’i

    Location same-origin olarak çözülür; POST ve 16-byte body korunur.

    Browser / Duru
    POST /note-titles/new; 16 byte; final response bekleniyor
    Atlas route ve policy
    307 hazır; Location=/note-titles/new
    Resource / connection / session
    Note yok; actionCount=0
  6. Follow request ulaştı

    Yeni request, yeni method/target bağlamıyla Application’a ulaşır; Host aynı reserved authority’dir.

    Browser / Duru
    POST /note-titles/new; 16 byte; final response bekleniyor
    Atlas route ve policy
    POST /note-titles/new alındı
    Resource / connection / session
    Note yok; actionCount=0
  7. Endpoint sonucu

    Yeni endpoint bu senaryoda action’ı bir kez uygular. Bu sayı, 307 status’unun genel bir idempotency garantisi değildir.

    Browser / Duru
    Final response bekleniyor
    Atlas route ve policy
    200 hazır; text/plain Çay
    Resource / connection / session
    Note Çay; actionCount=1
  8. Final response ulaştı

    200 text/plain Çay alındı; intermediate redirect ve action state artifact’ta ayrı.

    Browser / Duru
    200: Çay; chain tamamlandı
    Atlas route ve policy
    200 hazır; text/plain Çay
    Resource / connection / session
    Note Çay; actionCount=1

Close ≠ logout

  1. conn-a ve session context

    Connection open; session eligibility henüz bu request için değerlendirilmedi.

    Browser / Duru
    GET hazır; SESSION_REF_ALIAS; response bekleniyor
    Atlas route ve policy
    Request yok
    Resource / connection / session
    conn-a open; session active
  2. Request conn-a’da ulaştı

    Alias context taşınır; connection identity yerine geçmez.

    Browser / Duru
    GET hazır; SESSION_REF_ALIAS; response bekleniyor
    Atlas route ve policy
    GET alındı; eligibility pending
    Resource / connection / session
    conn-a open; session active
  3. Request policy ve response

    Bu request için active-session ve permission kontrollerinin geçtiği verilmiştir. Tam response, Connection: close ile connection’ın kapanacağını bildirir.

    Browser / Duru
    Response bekleniyor
    Atlas route ve policy
    200 hazır; Connection: close
    Resource / connection / session
    conn-a open; session active
  4. Complete 200 ulaştı

    Content tamamen alındı; close option yeni persistence’ı sonlandırır.

    Browser / Duru
    200 alındı; close bildirildi
    Atlas route ve policy
    200 hazır; Connection: close
    Resource / connection / session
    conn-a open; session active
  5. Transport close event

    Connection’ın local olarak kapanması logout veya expiry değildir; session record active kalır.

    Browser / Duru
    conn-a closed; logout yok
    Atlas route ve policy
    İlk request tamamlandı
    Resource / connection / session
    conn-a closed; session active
  6. Yeni taşıma context’i

    conn-b açık olarak verilmiştir; handshake çizilmez. Aynı session reference yeni request’e eklenir.

    Browser / Duru
    Yeni GET hazır; conn-b; SESSION_REF_ALIAS; response bekleniyor
    Atlas route ve policy
    Yeni request yok
    Resource / connection / session
    conn-b open; session active
  7. Yeni request conn-b’de ulaştı

    Yeni GET ve SESSION_REF_ALIAS conn-b üzerinden Application’a ulaştı. Eligibility ve permission henüz değerlendirilmedi; bunlar sonraki yerel karardır.

    Browser / Duru
    Yeni GET hazır; conn-b; SESSION_REF_ALIAS; response bekleniyor
    Atlas route ve policy
    Yeni GET alındı; eligibility pending
    Resource / connection / session
    conn-b open; session active
  8. Fresh request eligibility

    Bu yeni request için güvenilen kontrol sonuçları active=true ve permission=true’dur; request kabul edilebilir. Browser henüz ikinci response’u almamıştır.

    Browser / Duru
    Yeni response bekleniyor
    Atlas route ve policy
    Eligibility tekrar checked; allowed
    Resource / connection / session
    conn-b open; session active

ROLLER · STATE · VERİ AKIŞI

Redirect, ikinci resource’u client’a seçtirir

Duru’nun Atlas title formu POST /note-titles ile {"title":"Çay"} gönderir. Normal branch action’ı uygular ve 303 See Other, Location: /notes/atlas-1 döndürür. Browser Location’ı mevcut URL bağlamında çözer ve sonucu GET ile ister. Bu ikinci request title işlemini tekrar yapmaz; created note representation’ını getirir. Artifact iki request’i ve ortadaki redirect response’u ayrı kayıt olarak gösterir.

307 Temporary Redirect başka bir durumdur: legacy form endpoint’i işlemi uygulamadan /note-titles/new adresine yönlendirir. Otomatik follow method’ü değiştirmez; bu repeatable content fixture’ında POST ve 16-byte JSON body korunur. Action yalnız yeni endpoint’te bir kez uygulanır. Redirect, server’ın içeride function çağırması veya Browser URL’sini ağsız değiştirmesi değildir.

301 permanent ve 302 temporary redirection’da genel HTTP semantics tarihsel sebeplerle POST→GET değişimine izin verir; her client’ın aynı optional tercihi yaptığı varsayılmaz. Browser Fetch algoritması POST için 301/302’de GET ve null body seçer. 303, Fetch’te GET/HEAD dışındaki method’leri GET’e çevirir; HEAD HEAD olarak kalır. 307/308 method-preserving ailesidir; 308 permanent’tır. Content’in repeatable olması, redirect mode ve diğer policy kapıları ayrıca önemlidir.

Fetch’in follow, error ve manual modları aynı gözlemi sağlamaz. error, redirect’i network-error yoluna götürür. manual ise normal script’e genellikle opaque-redirect filtered response verir; intermediate Location’ı okunabilir bir inspector kaydı gibi sunmaz. Sahne client davranışını bu ayrımla açıklar; DevTools trace veya çalıştırılmış Fetch sonucu değildir.

Referer ve User-Agent: context, identity değil

Referer field adı tarihsel tek-r yazımıyla kullanılır; Referrer-Policy farklı bir field’dır. Referer request’i başlatan sayfa bağlamını kısmen bildirebilir. Policy ve navigation context nedeniyle hiç gelmeyebilir, yalnız origin içerebilir veya path/query içerebilir; fragment ve userinfo taşınmaz. Eksik Referer tek başına kötü niyet veya direct navigation kanıtı değildir.

User-Agent client software hakkında character string metadata’dır. Reduction, aynı family’den birçok client’ın benzer veya aynı sınırlı değerleri taşımasına neden olabilir. Gerçek kişi, account, device ownership veya doğrulanmış client capability kanıtı değildir. Fixture HackerDirectoryFixture/1.0 adlı inert product token kullanır; gerçek Browser’dan ölçülmüş UA değildir.

Redirect sonrası context otomatik kopyalanmaz. Target authority, resource-specific headers ve referrer policy yeniden değerlendirilir. Cross-origin credential davranışı ayrıca browser ve API kurallarına bağlıdır. Buradaki iki redirect aynı HTTPS origin’de kalır; no-referrer policy başlangıç koşulu olarak verilmiştir. Credential forwarding gösterilmez.

Host hangi site’ye yöneldiğini anlatır

Bir origin server aynı address üzerinde birden fazla virtual host sunabilir. HTTP/1.1 Host, target URI’nin host/port bilgisini taşır; Application uygun host’un resource’larını seçebilir. HTTP/2–3’te :authority bu control-data rolünü üstlenebilir. TCP connection address’i ve TLS server identity doğrulaması farklı katmanlardır; public URL, Host ve certificate aynı nesne değildir.

Host: library.atlas.example, Duru’nun authenticated olduğunu veya Atlas tenant’ındaki her resource’a permission’ı olduğunu kanıtlamaz. Trusted routing configuration kabul edilecek authority’leri belirler; resource permission kararını ayrı boundary’de alır. Bu derste canonicalAuthority sabittir ve bütün benign fixture requests bu authority’yi hedefler; alternate-host bypass üretmez.

Location relative ise redirect target yeni URL resolution ile bulunur. Örneğimizde Host aynı kalır çünkü yeni path aynı origin’dedir. Farklı origin’e gidilse origin-specific context tekrar hesaplanmalıdır; eski Host’a körü körüne dayanılmaz. WEB-06 URL kurallarıyla buradaki HTTP control data birbirini tamamlar.

Connection persistence mesajlar arasında taşıma kaynağını korur

HTTP/1.1 default olarak persistent connection kullanabilir. Bir complete request/response pair sonrasında aynı connection yeni exchange taşıyabilir; Connection: close mevcut response sonrası persistence’ın bitmesini bildirir. Reuse için message boundary’nin anlaşılır olması ve önceki body’nin tüketilmesi önemlidir. Connection herhangi bir anda da kapanabilir; API connection pool bunun için kendi policy’sini uygular.

HTTP/1.0’da persistence explicit negotiation gerektirir; HTTP/1.1’de her response’a Keep-Alive eklemek default persistence’ın şartı değildir. Keep-Alive field timeout/max gibi connection-use hints verebilir ve legacy Connection: keep-alive ile ilişkilidir. Hint gerçek future availability garantisi veya application session idle-expiry süresi değildir. TCP keepalive probe da ayrı transport mekanizmasıdır.

Connection ve Keep-Alive HTTP/2–3 messages’ta connection-specific olduğu için üretilmemelidir. Bu version’lar connection üzerinde birden fazla stream ile exchanges taşıyabilir; HTTP/1.1 header’larını eklemek multiplexing’i açmaz. Sahne HTTP/1.1 conn-a/conn-b alias’ları kullanır; pool, TCP/TLS handshake veya HTTP/2–3 stream runtime’ı çalıştırmaz.

Stateless request semantics, stateful application

HTTP stateless, her request message’ın semantics’inin kendi context’iyle anlaşılabilmesini anlatır. Resource database, session store, cache veya audit’in hiç state tutmaması demek değildir. Browser’ın cookie/session reference’ı yeniden taşıması ve server’ın o reference’ı trusted store/policy ile değerlendirmesi application state continuity’sini sağlar.

Connection close branch’inde conn-a kapanırken session record active kalır; logout veya expiry action’ı verilmemiştir. Yeni conn-b üzerinde gelen request aynı inert SESSION_REF_ALIAS bağlamını tekrar taşır. Application bu yeni request için session eligibility ve permission sonuçlarını yine değerlendirir; connection reuse kimlik kararının yerini tutmaz.

İki request’in aynı connection’dan gelmesi genel olarak aynı user agent varsayımını bile garanti etmez; RFC secured ve o agent’a specific connection için bir qualification tanımlar. Bu fixture’da connection-level authentication kullanılmaz. Session record’un active olması da action permission’ının bütün resources için true olması demek değildir; WEB-13.03 ve authorization dersleri o kararları tamamlar.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Close/session

  1. Transport close kendi kaydında görüldü

    conn-a üzerinde tamamlanan response, Connection: close taşır; connection daha sonra closed olur. SESSION_REF_ALIAS ise active kalır. Bir transport kapanışı, ayrıca verilmemiş logout veya expiry event’inin yerine geçmez.

    Request context
    conn-a closed / session active
    Application policy
    Trusted karar bekliyor
    Session boundary
    Application sonucu yok
  2. Önceki connection yeni request’i kabul ettirmedi

    Sonraki request conn-b üzerinden session reference’ı taşır. Application eligibility’yi yeniden değerlendirir; eski connection’ın başarılı olması yeterli değildir. Resource permission, connection reuse hint’inden ayrı zorunlu karardır.

    Request context
    conn-a closed / session active
    Application policy
    Fresh eligibility and resource policy required
    Session boundary
    Application sonucu yok
  3. Active session kapsamı açık tutuldu

    Ledger, sessionEligibleSupplied ve resourcePermissionSupplied değerlerini true verir. Bu case’te kabulün dayanağı bu trusted sonuçlardır; conn-b etiketi değildir. Alias gerçek secret bytes içermez ve yeni session üretildiği anlamına gelmez.

    Request context
    conn-a closed / session active
    Application policy
    Fresh eligibility and resource policy required
    Session boundary
    Active / supplied eligibility=true / permission=true
  4. Close ile lifecycle event’leri ayrıldı

    logoutSupplied ve expirySupplied false’tur. Connection’ın closed oluşundan session’ın terminated olduğu sonucu çıkarılamaz. Tersi de geçerlidir: connection’ın açık kalması active session veya permission garantisi değildir.

    Request context
    Close observed / no supplied logout or expiry
    Application policy
    Fresh eligibility and resource policy required
    Session boundary
    Active / supplied eligibility=true / permission=true
  5. Authority request’in kendi koşulunda kaldı

    HTTP stateless semantics, application’ın session ledger tutamayacağı anlamına gelmez. Ancak her protected request’in trusted context’i kendi acceptance gate’inden geçer. Network connection’ı authenticated subject gibi kullanmak yanlış boundary kurar.

    Request context
    Close observed / no supplied logout or expiry
    Application policy
    Connection ≠ authenticated subject
    Session boundary
    Active / supplied eligibility=true / permission=true
  6. Sonuç transport ile karıştırılmadan verildi

    Bu normal ledger’da session close sonrasında active kalır ve daha sonra recheck yapılır. Gerçek session store, browser pool veya TCP/TLS ölçümü bulunmaz. Sonuç yalnız verilmiş lifecycle ve policy koşullarını açıklamakla sınırlıdır.

    Request context
    Close observed / no supplied logout or expiry
    Application policy
    Connection ≠ authenticated subject
    Session boundary
    Close ≠ logout / request policy rechecked

Metadata scope

  1. Client metadata routing context’i sundu

    Host library.atlas.example, User-Agent HackerDirectoryFixture/1.0 olarak verilmiştir. Referer null’dır; no-referrer policy seçilmiştir. Bu alanlar routing veya diagnostic context sağlar, doğrulanmış account kimliği sağlamaz.

    Request context
    Host/UA present / Referer null
    Application policy
    Trusted karar bekliyor
    Session boundary
    Application sonucu yok
  2. Routing ile identity kararı ayrı değerlendirildi

    Host doğru virtual host’u seçmeye yardım eder. Bu seçim resource’u hangi subject’in okuyabileceğini belirlemez. User-Agent’ın beklenen metni taşıması da trusted principal veya resource permission yerine kullanılmaz.

    Request context
    Host/UA present / Referer null
    Application policy
    Routing context only / trusted subject separate
    Session boundary
    Application sonucu yok
  3. Missing Referer normal koşul olarak korundu

    Referer null olması bu case’te seçilmiş policy’nin normal sonucudur. Bunu tek başına unauthenticated veya malicious olarak etiketlemek yanlış attribution olur. Session ve action authority, kendi trusted evidence’ıyla değerlendirilmelidir.

    Request context
    Host/UA present / Referer null
    Application policy
    Routing context only / trusted subject separate
    Session boundary
    Referer absent / authentication not inferred
  4. Relative Location action yetkisi sağlamadı

    303 Location /notes/atlas-1, 307 ise /note-titles/new verir. İki relative destination aynı reserved origin’de çözülür. Location’ın bulunması, destination contract veya action permission kontrolünü gereksiz yapmaz.

    Request context
    303 result route / 307 action route
    Application policy
    Routing context only / trusted subject separate
    Session boundary
    Referer absent / authentication not inferred
  5. Method ile işlemin uygulanma zamanı ayrıldı

    303 satırında actionCountAtRedirect 1’dir; follow GET sayıyı artırmaz. 307 satırında count önce 0, preserved POST sonrasında 1 olur. Redirect status tek başına önceki action’ın uygulanıp uygulanmadığını açıklamaz.

    Request context
    303 result route / 307 action route
    Application policy
    303: 1→1 / 307: 0→1
    Session boundary
    Referer absent / authentication not inferred
  6. Metadata ile permission karıştırılmadan kapandı

    Aynı final 200 iki farklı intermediate processing yolundan gelebilir. Client metadata, redirect ve connection context’i bu yolları açıklamaya yardım eder. Hiçbiri trusted identity veya resource grant’inin yerine geçirilmez.

    Request context
    303 result route / 307 action route
    Application policy
    303: 1→1 / 307: 0→1
    Session boundary
    Context known / authority must be checked

VARSAYIM · SINIR · KONTROL

Redirect destination ve action intent birlikte kontrol edilir

Normal 303 path’i completed submission’dan read-only result’a gider; 307 path’i pending POST’u yeni endpoint’e taşır. Yanlış method varsayımı duplicate action veya yanlış target processing yaratabilir. Özellikle action uygulanmış mı sorusu redirect status’tan tek başına çıkarılmaz; fixture’ın server decision state’i açıkça bunu bildirir.

Defensive policy allowed destination mapping, scheme/origin ve endpoint contract’ını açıklar; supplied relative Location string’i tek başına izin sayılmaz. Product ihtiyaçlarına göre destination’ın canonical trusted karşılığı seçilir, redirect cycle/failure de sınırlanır. Bu örnekler aynı origin’deki iki benign sabit route’u kullanır; dış hedef veya redirect bypass workflow içermez.

Client metadata ve connection identity yerine geçmesin

Referer, User-Agent ve Host context sağlar; bunlara authenticated subject anlamı yüklemek trusted boundary’yi yanlış yerde kurar. Bir protected request’in kabulü yalnız “bu connection daha önce başarılıydı” diye yapılamaz. Etki hangi protected read/action’a yanlış authority verildiğine bağlıdır.

Kontrol canonical routing, request context policy ve trusted session/resource authorization kararlarını ayrı tutmaktır. Reused connection veya missing Referer operational sinyal olabilir; kendi başlarına authenticated/unauthenticated kararı değildir. Application session lifecycle kapılarını transport hints ile değiştirme.

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

Hareket olmadan bütün senaryoları oku

303 result GET

  1. Initial request kendi content’iyle kaydedildi

    Normal satır POST /note-titles ile title Çay olan JSON body gönderimini tanımlar. Body 16 UTF-8 byte’tır. Review, final response’tan önce bu initial method ve content’i işaretler; bütün body’yi telemetry’ye kopyalamak gerekli değildir.

    Exchange ledger
    POST /note-titles / body 16
    Chain comparison
    Correlation bekliyor
    Evidence verdict
    Delivery verdict yok
  2. 303 sonrasında action sayısı kontrol edildi

    Redirect status 303 ve Location /notes/atlas-1 olduğunda actionCountAtRedirect 1’dir. İşlem bu ledger’da uygulanmıştır. Bunun kanıtı 303 kelimesi değil, ayrı action-count alanıdır.

    Exchange ledger
    POST /note-titles / body 16
    Chain comparison
    303 / actionCountAtRedirect=1
    Evidence verdict
    Delivery verdict yok
  3. Follow request ayrı exchange olarak okundu

    Follow method GET, followBody null ve followBodyOctets 0’dır. Initial POST body’si bu GET’e taşınmaz. Relative Location reserved origin içinde çözülür; bu metadata gerçek browser redirect ölçümü değildir.

    Exchange ledger
    GET /notes/atlas-1 / body 0
    Chain comparison
    303 / actionCountAtRedirect=1
    Evidence verdict
    Delivery verdict yok
  4. Read-only follow action sayısını korudu

    actionCountAfterFollow 1 olarak kalır ve finalStatus 200 olur. Final Çay body’si 4 UTF-8 byte taşır. Bu case’te follow GET yeniden submission değildir; method değişimini action count ile birlikte okumak bunu görünür kılar.

    Exchange ledger
    GET /notes/atlas-1 / body 0
    Chain comparison
    Final 200 / action count remains 1
    Evidence verdict
    Delivery verdict yok
  5. Chain gözlemi final status’a indirgenmedi

    Initial POST, 303, GET ve count 1→1 birbirini destekler. Yalnız final 200 gözlenseydi intermediate method veya action zamanı bilinmezdi. Tam authored ledger bu soruları yanıtlar; gerçek client delivery için ayrıca observation gerekir.

    Exchange ledger
    GET /notes/atlas-1 / body 0
    Chain comparison
    Final 200 / action count remains 1
    Evidence verdict
    303 chain consistent / real delivery unmeasured
  6. Regression normal method dönüşümünü korudu

    Bu regression hedefi POST submission’dan GET result’a geçiş ve count’un 1’de kalmasıdır. HEAD için 303 method’ü HEAD kalır; 301/302 POST satırları ise Fetch davranışını belirtir. Bu qualification bütün HTTP client’larına zorunlu rewrite diye genişletilmez.

    Exchange ledger
    GET /notes/atlas-1 / body 0
    Chain comparison
    Final 200 / action count remains 1
    Evidence verdict
    POST→GET verified in ledger / count 1→1

307 keeps POST

  1. Method-preserving chain için başlangıç seçildi

    preserve307 satırı aynı POST /note-titles ve 16 byte JSON content ile başlar. Bu case’te redirect anında actionCountAtRedirect 0’dır. Initial POST yapılmış diye action’ın tamamlandığı varsayılmaz.

    Exchange ledger
    POST initial / action count 0
    Chain comparison
    Correlation bekliyor
    Evidence verdict
    Delivery verdict yok
  2. 307 koşulu method ve content ile karşılaştırıldı

    Status 307, Location /note-titles/new ile method-preserving follow seçer. Follow method POST, followBodyOctets 16 ve Content-Type application/json kalır. Repeatable content bu fixture’da açıkça verilmiştir.

    Exchange ledger
    POST initial / action count 0
    Chain comparison
    307 / follow POST / body 16
    Evidence verdict
    Delivery verdict yok
  3. Yeni endpoint’in action sonucu ayrı kaydedildi

    Preserved POST sonrasında actionCountAfterFollow 1 olur ve finalStatus 200 döner. Normal 303 ile final text aynı Çay olsa da işlemin hangi exchange’de uygulandığı farklıdır. Bu fark yalnız final body’den çıkarılamaz.

    Exchange ledger
    Follow completed / count 0→1 / final 200
    Chain comparison
    307 / follow POST / body 16
    Evidence verdict
    Delivery verdict yok
  4. Positive control method uyumsuzluğunu seçti

    Selector’ın ayrı positive XML’i status 307 ve initialMethod POST için followMethod GET bildirir. XPath bunu bir tutarsız observation olarak seçer. Normal ledger’da count sıfırdır; bu positive kayıt gerçek browser hatası iddiası değildir.

    Exchange ledger
    Follow completed / count 0→1 / final 200
    Chain comparison
    Normal XPath 0 / positive control 1
    Evidence verdict
    Delivery verdict yok
  5. Missing intermediate kayıt hükmü sınırladı

    307 chain’in tamamı verilirse POST preservation ve count 0→1 doğrulanabilir. Follow method veya redirect observation eksikse zero match bu soruları çözmez. Final 200, görünmeyen intermediate stage’i doldurmak için kullanılmaz.

    Exchange ledger
    Follow completed / count 0→1 / final 200
    Chain comparison
    Normal XPath 0 / positive control 1
    Evidence verdict
    Complete chain supports / missing chain UNKNOWN
  6. Diagnostic scope minimum context ile tutuldu

    Client HTTP gözlemi initial method, redirect status/Location ve follow method/body metadata’sını ilişkilendirir. Action count ise server’daki işlemin kaydından gelir; aynı işlem için ayrı producer kanıtıdır. Final 200 veya eksik Referer bu iki kaydın yerine geçmez.

    Exchange ledger
    Follow completed / count 0→1 / final 200
    Chain comparison
    Normal XPath 0 / positive control 1
    Evidence verdict
    Record method/status/count; exclude secrets

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

Redirect chain’i method ve content ile oku

Manual exercise’de initial request, redirect status/Location ve follow-up request’i ayrı işaretle. Normal branch POST actionCount=1 ardından GET content=null verir; 307 branch önce actionCount=0, sonra preserved POST completion ile 1 olur. Final 200 her iki branch’in intermediate processing’inin aynı olduğunu göstermez.

Artifact followMethod/followBodyOctets alanları authored decision ledger’ıdır. XPath status=307, initialMethod=POST iken followMethod!=POST tutarsızlığını seçer. Negative 0, positive 1; missing event 0 olsa da chain doğrulandı sayılmaz. Gerçek Browser otomatik redirects intermediate response’u script’e farklı biçimde gizleyebilir; complete trace scope ayrıca gerekir.

Handler redirect status’unu sonraki işlemin anlamına göre seçmelidir. Note title POST’u tamamlandıktan sonra sonucu okumaya geçiş için örnekte 303 kullanılır; follow-up GET aynı değişikliği yeniden uygulamaz. Henüz uygulanmamış POST’u yeni adreste aynı method ve body ile sürdürme kararı ise 307 dalıdır. Bu iki yolu yalnız final 200’e bakarak aynı uygulama sanma; actionCount’un redirect öncesi ve sonrası değerlerini ve follow-up body’sini birlikte doğrula.

Connection event ile session decision’ı ayır

conn-a closed observation transport state’tir. SESSION_REF_ALIAS active observation logical session state’tir. Sahnedeki close branch bu ikisinin aynı anda farklı değerlerde olabileceğini gösterir; close step ağda logout request’i çizmez. Yeni request eligibility check’i local trusted-result assumption’dır.

Gerçek telemetry’de connection reuse, client request correlation, selected authority, sanitized user-agent family ve session decision reason farklı evidence’dır. Full Referer query’si, credential veya session secret loglama. Geçici close, user logout, expiry ve deny reason normal failure sınıflarıdır; her close veya 3xx kötü niyet sayılmaz.

ŞİMDİ VAKAYA UYGULA

Redirect, connection ve client metadata hangi kararları kanıtlayabilir?

Atlas route’unda 303, uygulanmış POST’tan GET result’a geçer; 307 ise POST’u yeni endpoint’e taşır. İki yol da Çay döndürür. conn-a kapanırken session active kalabilir; yeni request kendi eligibility ve resource policy kontrolünden geçer.

Vakadaki 200, media type ve parse error kayıtlarını ayrı değerlendir. Bu dersteki representation kurallarıyla usable data için henüz hangi koşulun gerektiğini açıkla.

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

ÖRNEĞİ BİRLİKTE OKUYALIM

Atlas route chain ve connection/session ledger

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

Ham kaydı ve alan açıklamalarını oku
{
  "canonicalAuthority": "library.atlas.example",
  "requestContext": {
    "Host": "library.atlas.example",
    "User-Agent": "HackerDirectoryFixture/1.0",
    "Referer": null,
    "referrerPolicy": "no-referrer",
    "scope": "Supplied benign same-origin client context; no credentials and no measured Browser UA"
  },
  "redirectRows": [
    {
      "case": "normal",
      "initialMethod": "POST",
      "initialUrl": "https://library.atlas.example/note-titles",
      "initialBody": "{\"title\":\"Çay\"}",
      "initialBodyOctets": 16,
      "redirectStatus": 303,
      "location": "/notes/atlas-1",
      "followUrl": "https://library.atlas.example/notes/atlas-1",
      "followMethod": "GET",
      "followBody": null,
      "followBodyOctets": 0,
      "followBodyHeaders": {},
      "actionCountAtRedirect": 1,
      "actionCountAfterFollow": 1,
      "finalStatus": 200,
      "finalBody": "Çay",
      "finalBodyOctets": 4
    },
    {
      "case": "preserve307",
      "initialMethod": "POST",
      "initialUrl": "https://library.atlas.example/note-titles",
      "initialBody": "{\"title\":\"Çay\"}",
      "initialBodyOctets": 16,
      "redirectStatus": 307,
      "location": "/note-titles/new",
      "followUrl": "https://library.atlas.example/note-titles/new",
      "followMethod": "POST",
      "followBody": "{\"title\":\"Çay\"}",
      "followBodyOctets": 16,
      "followBodyHeaders": {
        "Content-Type": "application/json"
      },
      "actionCountAtRedirect": 0,
      "actionCountAfterFollow": 1,
      "finalStatus": 200,
      "finalBody": "Çay",
      "finalBodyOctets": 4
    }
  ],
  "redirectMethodMatrix": [
    {
      "status": 301,
      "initialMethod": "POST",
      "fetchFollowMethod": "GET",
      "fetchBodyRemoved": true,
      "genericHttpQualification": "HTTP permits historical POST-to-GET change; this row specifies Fetch behavior"
    },
    {
      "status": 302,
      "initialMethod": "POST",
      "fetchFollowMethod": "GET",
      "fetchBodyRemoved": true,
      "genericHttpQualification": "HTTP permits historical POST-to-GET change; this row specifies Fetch behavior"
    },
    {
      "status": 303,
      "initialMethod": "POST",
      "fetchFollowMethod": "GET",
      "fetchBodyRemoved": true,
      "genericHttpQualification": "Fetch changes methods other than GET/HEAD to GET"
    },
    {
      "status": 303,
      "initialMethod": "HEAD",
      "fetchFollowMethod": "HEAD",
      "fetchBodyRemoved": false,
      "genericHttpQualification": "HEAD remains HEAD; no request body supplied"
    },
    {
      "status": 307,
      "initialMethod": "POST",
      "fetchFollowMethod": "POST",
      "fetchBodyRemoved": false,
      "genericHttpQualification": "Method-preserving, repeatable fixture content supplied"
    },
    {
      "status": 308,
      "initialMethod": "POST",
      "fetchFollowMethod": "POST",
      "fetchBodyRemoved": false,
      "genericHttpQualification": "Method-preserving permanent redirect, repeatable fixture content supplied"
    }
  ],
  "http11Illustration": {
    "initialRequest": "POST /note-titles HTTP/1.1\r\nHost: library.atlas.example\r\nUser-Agent: HackerDirectoryFixture/1.0\r\nContent-Type: application/json\r\nContent-Length: 16\r\n\r\n{\"title\":\"Çay\"}",
    "redirect303": "HTTP/1.1 303 See Other\r\nDate: Thu, 08 Oct 2026 00:00:00 GMT\r\nLocation: /notes/atlas-1\r\nContent-Length: 0\r\n\r\n",
    "followGet": "GET /notes/atlas-1 HTTP/1.1\r\nHost: library.atlas.example\r\nUser-Agent: HackerDirectoryFixture/1.0\r\n\r\n",
    "dateIsSynthetic": true
  },
  "connectionSession": {
    "protocol": "HTTP/1.1",
    "initialConnection": "conn-a",
    "initialConnectionState": "open",
    "responseConnectionField": "close",
    "afterCompleteResponseConnectionState": "closed",
    "sessionRef": "SESSION_REF_ALIAS",
    "sessionStateBefore": "active",
    "sessionStateAfterClose": "active",
    "logoutSupplied": false,
    "expirySupplied": false,
    "laterConnection": "conn-b",
    "laterConnectionState": "open",
    "laterRequestCarriesSessionRef": true,
    "laterEligibilityRechecked": true,
    "sessionEligibleSupplied": true,
    "resourcePermissionSupplied": true,
    "ordinaryConnectionIsSessionIdentity": false
  },
  "selector": {
    "language": "XPath",
    "xml": "<observations><redirect status=\"303\" initialMethod=\"POST\" followMethod=\"GET\"/><redirect status=\"307\" initialMethod=\"POST\" followMethod=\"POST\"/></observations>",
    "xpath": "count(/observations/redirect[@status=\"307\" and @initialMethod=\"POST\" and @followMethod!=\"POST\"])",
    "expected": 0,
    "positiveFixtureXml": "<observations><redirect status=\"307\" initialMethod=\"POST\" followMethod=\"GET\"/></observations>",
    "positiveExpected": 1,
    "scope": "Only authored protocol-decision observations, not product log field names or a live HTTP capture.",
    "missingFieldBehavior": "Missing observation is insufficient evidence; zero matches is not proof of correct runtime behavior."
  }
}
redirectRows
İlk exchange, follow request ve action count ayrı; response trace ölçümü değil.
redirectMethodMatrix
Fetch davranışı ile genel HTTP optional POST rewrite qualification’ı ayrılır.
requestContext
Supplied Host/UA ve no-referrer context identity değildir.
connectionSession
Close transport state değiştirir; active session ve fresh request policy ayrı.

Aynı reserved HTTPS origin, benign repeatable content ve secret olmayan alias’lar. Native Browser redirect/connection pool, TCP/TLS veya gerçek session store çalıştırılmaz. Trusted eligibility/permission sonuçları supplied varsayımdır.

İki yanlış kanı

Bütün redirect’ler POST’u GET yapar.

Bu POST 303 sonrası GET’e döner; 307/308 method’ü korur. 301/302 genel HTTP’de tarihsel optional davranışa sahiptir, Fetch POST rewrite’ını açık tanımlar.

Keep-Alive varsa logged-in kalırım; connection close olunca session biter.

Connection persistence taşıma kaynağına aittir. Session expiry/logout ayrı application state kararlarıdır; fixture conn-a kapanırken session active kalır.

SIRA SENDE

Bu hikâyeyi sen çöz.

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

POST için 307 redirect takip edilirken method ve body nasıl olur?

  1. GET olur ve body atılır; bütün redirect’ler aynı davranır.
  2. POST ve aynı yeniden gönderilebilir JSON body korunur.
Gerekçeli cevabı oku

POST ve aynı yeniden gönderilebilir JSON body korunur. — preserve307 kaydında followMethod=POST ve 16 body octet vardır.

Connection’ın kapanması session logout kanıtı mıdır?

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

connectionSession.afterCompleteResponseConnectionState
closed
connectionSession.sessionStateAfterClose
active
connectionSession.logoutSupplied
false
  1. Hayır. Connection kapalıyken session aktif kalır.
  2. Evet. TCP connection, session identity’nin kendisidir.
Gerekçeli cevabı oku

Hayır. Connection kapalıyken session aktif kalır. — Bu örnekte logout veya expiry verilmemiştir. Sonraki conn-b session referansını taşıyıp geçerlilik ve permission’ı yeniden kontrol eder.

Referer=null ve User-Agent etiketi var. Bunlar doğrulanmış kullanıcı veya action intent kanıtı mı?

Gerekçeli cevabı oku

Referer, no-referrer policy nedeniyle null olabilir. User-Agent client’ın tanımıdır. İkisi doğrulanmış principal veya action izni kurmaz. Host, authority routing context’ini belirtir; server identity, session ve authorization doğrulamasının yerine geçmez.

□ Referer yokluğunu kimlik veya anomali kanıtı saymadım.

□ Header metadata’sını permission yerine koymadım.

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

Kaynaklar ve kapsam