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.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
POST → 303 → GET
- 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
- İ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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- İ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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Ö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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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?
- GET olur ve body atılır; bütün redirect’ler aynı davranır.
- 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
- Hayır. Connection kapalıyken session aktif kalır.
- 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
- RFC 9110 — HTTP Semantics3.3 Connections, Clients, and Servers · 7.2 Host and :authority · 7.6.1 Connection · 10.1.3 Referer · 10.1.5 User-Agent · 15.4 Redirection 3xx · 15.4.2 301 Moved Permanently · 15.4.3 302 Found · 15.4.4 303 See Other · 15.4.8 307 Temporary Redirect · 15.4.9 308 Permanent Redirect
- RFC 9112 — HTTP/1.19.3 Persistence · 9.6 Tear-down
- RFC 9113 — HTTP/28.2.2 Connection-Specific Header Fields
- RFC 9114 — HTTP/34.2 HTTP Fields
- MDN — Referer headerReferer header · Directives
- MDN — User-Agent headerUser-Agent header · User-Agent reduction
- MDN — Keep-Alive headerKeep-Alive header · Directives
- WHATWG — Fetch Standard (official source)HTTP-redirect fetch · HTTP fetch: redirect modes follow/error/manual
- MDN — 303 See OtherIntroduction: confirmation retrieval after PUT/POST · Examples: 303 response on form submission