Oturumlar nelerdir? Nasıl çalışırlar?


332

Ben sadece python kullanarak web uygulaması geliştirme öğrenmeye başlıyorum. 'Çerezler' ve 'oturumlar' terimleriyle karşılaşıyorum. Tarayıcıdaki bir anahtar / değer çiftinde bazı bilgileri sakladıklarından çerezleri anlıyorum. Ancak oturumlarla ilgili biraz karışıklığım var, oturumda da kullanıcının tarayıcısında bir çerezde veri saklıyoruz.

Örneğin - username='rasmus've ile giriş yapıyorum password='default'. Böyle bir durumda veriler, kimliği doğrulanırsa beni kontrol etmesi ve oturum açması gereken sunucuya gönderilir. Ancak tüm süreç boyunca sunucu, tarayıcımdaki bir çerezde saklanacak bir oturum kimliği de oluşturur. Artık sunucu bu oturum kimliğini dosya sisteminde veya veri deposunda da saklamaktadır.

Ancak yalnızca oturum kimliğine dayanarak, site üzerinden sonraki geçişim sırasında kullanıcı adımı nasıl bilebilir? Anahtar gibi oturum kimliği ve ayrıntılar olacak bir dict sunucuda veri depolamak mu username, emaildeğerler vb?

Burada oldukça kafam karışıyor. Yardıma ihtiyacınız var.


9
"Verileri sunucuda, anahtarın oturum kimliği ve kullanıcı adı, e-posta vb. Ayrıntıların değerler olduğu bir sözlük olarak saklıyor mu?" ...Evet. 'Diksiyon' ilişkisel bir veritabanı olabilir, ancak temelde bu şekilde çalışır.
bobince

14
Web oturumlarını da anlamak istedim, şimdi anlıyorum. Herhangi bir yardıma ihtiyacım olursa kendi
wiki'mi yazdım

Bilmiyorsanız durumda: şifre karma olsa bile istemci tarafında şifre saklamak güvenli değildir (aslında bir fark yaratmaz. Cracker sahte bir çerez oluşturarak karma şifreyi doğrudan girebilir) giriş durumunu saklamanın daha iyi yoludur.
cytsunny

1
Protokol seviyesi detaylarını kullanarak kendim yazdım - bitspedia.com/2012/05/…
Asif Shahzad

Yanıtlar:


400

HTTP durum bilgisi içermediğinden, bir isteği başka herhangi bir istekle ilişkilendirmek için kullanıcı isteklerini HTTP istekleri arasında depolamanın bir yoluna ihtiyacınız vardır.

Çerezler veya URL parametreleri (ör. Http://example.com/myPage?asd=lol&boo=no gibi ), verileri 2 veya daha fazla istek arasında taşımak için uygun yollardır. Ancak, verilerin istemci tarafında okunabilir / düzenlenebilir olmasını istemiyorsanız, bunlar iyi değildir.

Çözüm, bu veri sunucusu tarafını saklamak, ona bir "kimlik" vermek ve istemcinin bu kimliği yalnızca bilmesini (ve her http isteğinde geri iletmesini) sağlamaktır. İşte böyle, oturumlar uygulandı. Veya istemciyi uygun bir uzak depolama alanı olarak kullanabilirsiniz, ancak verileri şifreleyip gizli sunucu tarafını koruyabilirsiniz.

Elbette dikkate alınması gereken başka yönler de var, tıpkı insanların başkalarının oturumlarını ele geçirmesini istemediğiniz gibi, oturumların sonsuza kadar sürmesini değil, süresinin dolmasını vb. İstiyorsunuz.

Özel örneğinizde, kullanıcı kimliği (kullanıcı adınız veya kullanıcı veritabanınızdaki başka bir benzersiz kimlik olabilir), başarılı tanımlamanın ardından sunucu tarafında oturum verilerinde saklanır. Ardından, istemciden aldığınız her HTTP isteği için, oturum kimliği (istemci tarafından verilen) sizi, kimliği doğrulanmış kullanıcı kimliğini içeren doğru oturum verilerine (sunucu tarafından depolanan) yönlendirir - böylece kodunuz hangi kullanıcıyı bilecektir ile konuşuyor.


3
"bu verilerin istemci tarafında tutulmasını istemiyorsunuz". Neden olmasın? Güçlü bir şifreleme kullanırsanız, istemcinin şifrelenmiş ve bir çerezde saklanan oturum verilerini tutmasına izin verebilirsiniz. Bu, sunucuların hiçbir şeyi 'hatırlaması' gerekmediğinden, birden çok düğüme ölçeklendirmeyi büyük ölçüde basitleştirir.
Matt Harrison

5
@MattHarrison Sunucu tarafında "hiçbir şey hatırlamadan" verilerin şifresini nasıl çözerdiniz? Zaten cevabımda bu konuyu genişletmeye çalıştım.
Luke404

2
@MattHarrison, kullanıcı tarafında çok fazla veri depolamanın trafiğinizi artıracağını unutmayın.
nitsas

5
Bir üçüncü taraf, kullanıcının oturum anahtarını arayabilirse kullanıcı olarak hareket edemez mi? Sitenin HTTPS kullanmadığı varsayılarak, anahtar şifrelenmiş olsa bile üçüncü bir tarafın oturum anahtarıyla kullanıcı olarak görünebileceği anlaşılmaktadır. Sunucu sadece şifresini çözecekti.
user137717

2
@ user137717 evet, oturuma tam anlamıyla "doğru oturum kimliğini sunan her birine" erişim izni verirseniz bu bir olasılıktır. Yerine koyabileceğiniz bir dizi kısıtlama vardır, en kolay ve en yaygın olanlardan biri istemci IP'sini oturumda saklamaktır: başka bir IP'den gelen bir istemci aynı oturum kimliğini sunarsa bunu sahte olarak işaretleyin ve oturumu silin.
Luke404

110

Analoji ile Basit Açıklama

Bir bankada olduğunuzu ve hesabınızdan biraz para almaya çalıştığınızı düşünün. Ama karanlık; banka zifiri karanlık: ışık yok ve elinizi yüzünüzün önünde göremiyorsunuz. 20 kişi daha çevrili. Hepsi aynı görünüyor. Ve herkesin aynı sesi var. Ve herkes potansiyel bir kötü adam. Başka bir deyişle, HTTP vatansızdır.

Bu banka komik bir bankadır - tartışma uğruna işlerin nasıl yürüdüğü aşağıda açıklanmıştır:

  1. hatta (veya çevrimiçi) bekler ve veznedarla konuşursunuz: para çekmek için bir talepte bulunursunuz ve sonra
  2. koltukta kısa bir süre beklemek zorundasın ve 20 dakika sonra
  3. gidip paranızdan para toplamak zorundasınız.

Ama veznedar size herkesten nasıl ayrılacak?

Vezne sizi göremez veya kolayca tanıyamaz, unutmayın, çünkü ışıkların hepsi söner. Vekiliniz 10.000 $ 'lık çektiğiniz parayı başka birine verirse - yanlış kişiye ?! Veznenin sizi para çekme işlemini gerçekleştiren kişi olarak tanıması kesinlikle önemlidir, böylece istediğiniz parayı (veya kaynağı) alabilirsiniz.

Çözüm:

Vezneye ilk geldiğinizde size gizli bir şey söyler:

"Benimle her konuştuğunuzda," diyor veznedar, "önce kendinizi GNASHEU329 olarak tanımlamalısınız - bu şekilde onun sen olduğunu biliyorum".

Kimse gizli şifreyi bilmiyor.

Nakit Çekme Örneği:

Bu yüzden 20 dakika dinlenip dinlenmeye karar verdim ve daha sonra veznedarına gidip "Para çekimimi toplamak istiyorum" diyorum

Vezneci bana "sen kimsin ??!"

"Benim, Bay George Banks!"

"Kanıtla!"

Ve sonra onlara şifremi söyle: GNASHEU329

"Kesinlikle Bay Banks!"

Temel olarak bir oturum böyle çalışır. Milyonlarca insanın denizinde benzersiz bir şekilde tanımlanmasına izin verir. Veznedarla her uğraştığınızda kendinizi tanımlamanız gerekir.

Herhangi bir sorunuz varsa veya belirsizseniz - lütfen yorum gönderin ve sizin için temizlemeye çalışacağım.

Resimlerle Açıklama:

Resim ile açıklanan oturumlar


9
Bu açıklamayı sevin - benzetmenizde, diğer ppl'in dinlemelerini ve veznedarın size söylediği gizli şifreyi duymasını nasıl önlersiniz? Başka bir deyişle, session_id öğesi çalınırsa, birisinin kimlik bilgilerinizi taklit etmesi mümkün olmaz mı?
wmock

@wmock oturumu ele geçirme kesinlikle bir sorundur: şuna bir bak! owasp.org/index.php/Session_hijacking_attack
BKSpurgeon

2
güzel örnek !! öğrenme arayan istekli zihinlerle paylaşılacaktır!
Victor

benzetmenizde, GNASHEU329belirli bir zamana kadar süresi dolan bir kimlik doğrulama kodu oluşturan kullanıcı şifresidir; Bay Banks daha sonra tekrarlayana şifresini tekrar tekrar vermek zorunda kalmadan arka arkaya birkaç para çekme işlemi yapmak için auth jetonunu kullanabilir mi?
Daniel Lizik

@DanielLizik sen def. Kavramı anlamak! Ancak, size akıllı bir yanıt vermek için jeton tabanlı iş akışları hakkında yeterince bilgim yok. Genel ilke, sunucunun bir şekilde isteği yapan kişinin kim olduğunu tanımlayabilmesidir.
BKSpurgeon

39

"Oturum", kullanıcının bir web sitesine göz atma zamanını belirtmek için kullanılan terimdir. Bu, sitedeki bir sayfaya ilk gelişleri ile siteyi kullanmayı bırakacakları zaman arasındaki süreyi temsil etmeyi amaçlamaktadır. Uygulamada, kullanıcının siteyle ne zaman yapıldığını bilmek imkansızdır. Çoğu sunucuda, aynı kullanıcı tarafından başka bir sayfa istenmedikçe oturumu otomatik olarak sona erdiren bir zaman aşımı vardır.

Kullanıcı bir tür oturum kimliğini ilk kez bağladığında (bunun nasıl yapılacağı web sunucusu yazılımına ve sitede kullandığınız kimlik doğrulama / oturum açma türüne bağlıdır). Çerezler gibi, bu genellikle bir güvenlik sorunu olduğu için artık URL'ye gönderilmez. Bunun yerine, toplu olarak oturum olarak da adlandırılan bir sürü başka şeyle birlikte depolanır. Oturum değişkenleri çerezlere benzer - bir sayfa isteği ile birlikte gönderilen ve sunucudan sayfa ile birlikte dönen ad-değer çiftleridir - ancak adları bir web standardında tanımlanır.

Bazı oturum değişkenleri HTTP üstbilgileri olarak iletilir . Tarayıcıda görünmemesi ve herkese özel olabilecek bir şey söylememesi için her sayfanın göz atmalarının perde arkasından ileri geri aktarılırlar. Bunların arasında USER_AGENT veya sayfayı isteyen tarayıcı türü, REFERRER veya istenen sayfaya bağlanan sayfa vb. Bulunur. Bazı web sunucusu yazılımları kendi üstbilgilerini ekler veya sunucu yazılımına özgü ek oturum verilerini aktarır. Ancak standart olanlar oldukça iyi belgelenmiştir.

Umarım yardımcı olur.


Kullandığım IIS sunucularında kullanıcı adını bir USER_NAME başlığından alabileceğimi biliyorum, ancak bu IIS'ye özgü olabilir.
Tim Rourke

REFERRER burada ne anlama geliyor?
Gab 是 好人

@Gab 是 好人 REFERRER genellikle istemcinin "Yönlendiren" HTTP istek başlığında gönderdiği rastgele bir dize anlamına gelir. Bu gerektiğini , bilirsin, şimdiki kaynağın müşteri sevk kaynağın URL içerir.
Luke404

Teşekkürler, öyle olması gerekmiyor. bu yüzden insanların genellikle bu başlığı RFC'de önerilenden farklı semantiklerle kullandığını düşünüyorum, değil mi?
Gab 是 好人

Önce sen yazdın Like cookies, this usually doesn't get sent in the URL anymoresonra Session variables are like cookies - they're name-value pairs sent along with a request for a page. Tam olarak ne olur? Bir dahaki sefere istekte bulunduğunuzda gönderiliyor mu?
KPMG

19

HTTP durum bilgisi olmayan bağlantı protokolüdür, yani sunucu farklı kullanıcıların farklı bağlantıları arasında ayrım yapamaz.

Bu nedenle, bir istemci ilk kez bir sunucuya bağlandığında, çerez daha sonra istemciye çerez değeri olarak gönderilecek yeni bir oturum kimliği oluşturur. Ve bundan sonra, bu oturum kimliği bu istemci bağlantısını belirleyecektir, çünkü her HTTP isteği içinde çerezler içinde uygun oturum kimliğini görecektir.

Şimdi her oturum kimliği için, sunucu kullanıcıya özgü verileri depolamasını sağlayan bazı veri yapısını tutar, bu veri yapısı oturumunu soyut olarak çağırabilirsiniz.


1
Buna biraz daha ışık tutabilir misiniz - "Şimdi her oturum kimliği için sunucu, kullanıcıya özgü verileri depolamasını sağlayan bazı veri yapısını saklıyor, bu veri yapısı oturumunu soyut olarak çağırabilirsiniz." Sunucu hangi belirli istemci bilgilerini depolar?
realPK

Buna biraz daha ışık tutabilir misiniz - "Şimdi her oturum kimliği için sunucu, kullanıcıya özgü verileri depolamasını sağlayan bazı veri yapısını saklıyor, bu veri yapısı oturumunu soyut olarak çağırabilirsiniz." Sunucu hangi belirli istemci bilgilerini depolar?
Gab 是 好人

Yukarıdaki ile aynı soru, eğer cevap verirseniz yardımcı olacaktır.
Jaj Suresi

4

HTTP'yi KISA SÜRELİ BELLEK KAYBI olan ve o kişi gözden kaybolur gitmez her bir kişiyi unutan bir kişi (A) olarak düşünün.

Şimdi, farklı insanları hatırlamak için, A o kişinin fotoğrafını çeker ve saklar. Her Kişinin resminin bir kimlik numarası vardır. Bu kişi tekrar göründüğünde, o kişi kimlik numarasını A'ya söyler ve A resmini kimlik numarasına göre bulur. Ve voila !!, A o kişi kim bilir.

HTTP ile aynı. KISA SÜRELİ BELLEK KAYBI çekiyor. Bir web sitesini kullanırken yaptığınız her şeyi kaydetmek için Oturumlar'ı kullanır ve ardından tekrar geldiğinizde sizi Çerezler (Çerez bir jeton gibidir) yardımıyla tanımlar. Resim burada Oturum ve ID burada Çerez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.