Bunu anlamama yardım edebilir misin? “Ortak REST Hataları: Oturumlar önemsiz”


159

Feragatname: REST düşünce okulunda yeniyim ve zihnimi bunun etrafına sarmaya çalışıyorum.

Yani, bu sayfayı okuyorum, Ortak REST Hataları ve oturumların ilgisiz olduğu bölümden tamamen şaşırdım. Sayfanın söylediği şey:

Bir istemcinin "oturum açmasına" veya "bağlantı başlatmasına" gerek yoktur. HTTP kimlik doğrulaması her iletide otomatik olarak yapılır. İstemci uygulamaları, hizmetlerin değil kaynakların tüketicisidir. Bu nedenle giriş yapmak için hiçbir şey yok! Diyelim ki bir REST web hizmetinde uçuş rezervasyonu yapıyorsunuz. Hizmete yeni bir "oturum" bağlantısı oluşturmazsınız. Bunun yerine "itinerary creator object" den yeni bir güzergah oluşturmasını istersiniz. Boşlukları doldurmaya başlayabilir, ancak diğer boşlukları doldurmak için web üzerinde başka bir yerde tamamen farklı bir bileşen elde edebilirsiniz. Oturum yoktur, bu nedenle istemciler arasında oturum durumunu taşıma sorunu yoktur. "Oturum yakınlığı" sorunu da yoktur

Tamam, HTTP kimlik doğrulamasının her mesajda otomatik olarak yapıldığını görüyorum - ama nasıl? Her istekte kullanıcı adı / şifre gönderildi mi? Bu sadece saldırı yüzey alanını artırmıyor mu? Bulmacanın bir parçasını kaçırmış gibi hissediyorum.

Diyelim ki, /sessionbir GET isteğini kabul eden, isteğin bir parçası olarak bir kullanıcı adı / parola gireceğiniz ve kimlik doğrulama başarılı olursa bir oturum belirteci döndüren bir REST hizmetine sahip olmak kötü olur mu? sonraki isteklerle birlikte geçti mi? Bu bir REST açısından mantıklı mı yoksa noktayı kaçırıyor mu?


her istek her zaman doğrulanır, oturum kaçırma bir şeydir. dinlendirici bunu daha açık hale getirir ama daha fazla maruz kalmaz.
Jasen

Yanıtlar:


79

RESTful olmak için, her HTTP isteği, alıcının HTTP'nin durumsuz doğasıyla tam bir uyum içinde işleyebilmesi için kendi başına yeterli bilgi taşımalıdır.

Tamam, HTTP kimlik doğrulamasının her mesajda otomatik olarak yapıldığını görüyorum - ama nasıl?

Evet, her istekte kullanıcı adı ve şifre gönderilir. Bunu yapmanın yaygın yöntemleri temel erişim kimlik doğrulaması ve özet erişim kimlik doğrulamasıdır . Ve evet, bir kulak misafiri kullanıcının kimlik bilgilerini yakalayabilir. Böylece Taşıma Katmanı Güvenliği (TLS) kullanılarak gönderilen ve alınan tüm veriler şifrelenir .

Bir GET isteğini kabul eden, isteğin bir parçası olarak bir kullanıcı adı / parola gireceğiniz ve kimlik doğrulama başarılı olursa bir oturum belirteci döndüren bir REST hizmetinin (örneğin, / session) olması kötü olur mu? sonra gelen istekleri ile birlikte geçecek? Bu bir REST açısından mantıklı mı yoksa noktayı kaçırıyor mu?

Durum taşıdığı için bu RESTful olmaz , ancak kullanıcılar için bir kolaylık olduğu için oldukça yaygındır; bir kullanıcının her seferinde giriş yapması gerekmez.

Bir "oturum belirtecinde" tanımladığınız öğeye genellikle giriş çerezi denir . Örneğin, Yahoo! "2 hafta boyunca oturumumu açık tut" yazan bir onay kutusu var. Bu aslında (kelimelerinizle) "başarılı bir şekilde giriş yaparsam oturum jetonumu 2 hafta canlı tut" diyor. Web tarayıcıları, sizin için yapmasını istediğiniz her HTTP isteğiyle bu giriş çerezlerini (ve muhtemelen diğerlerini) gönderir.


5
Bu cevap benim için bir anlam ifade etmiyor. İlk olarak, giriş ve şifreyi her seferinde ve bir kez de geçmenin uygun olduğunu söylüyor, bu da mantıklı. Daha sonra, müşteriye bir jeton şeklinde başarılı giriş durumunu döndürme fikri önerilmektedir. Gerekirse simge oluşturma zamanını kodlayabilir. Kesinlikle bilgileri müşteriye geri göndermemize izin verilir. Yani, bu öneri bana iyi geliyor. Cevap, “durum taşıdığı” için iyi olmadığını söylüyor, ancak “REST” te “ST” fikri, bu durum istemci ile sunucu arasında aktarılabiliyor mu?

33

REST hizmetinin her HTTP isteği için kimlik doğrulaması gerektirmesi nadir değildir. Örneğin, Amazon S3 her isteğin kullanıcı kimlik bilgilerinden, tam gerçekleştirilecek isteğin ve geçerli saatin türetilmiş bir imzasının olmasını gerektirir. Bu imzanın istemci tarafında hesaplanması kolaydır, sunucu tarafından hızlı bir şekilde doğrulanabilir ve onu durduran bir saldırgan tarafından sınırlı olarak kullanılabilir (şu anki zamana bağlı olduğu için).


3
+1 lütfen üzerinde ayrıntılı bilgi verebilir misiniz: onu ele geçiren bir saldırganın (şu anki zamana dayandığı için) sınırlı kullanımı var mı? şifrelenmiş kullanıcı adı ve şifre içeren bir çerezden söz etmiyor musunuz? SO gibi mi? (IMHO)
Royi Namir

2
@RoyiNamir: Bir kurabiyeden bahsetmiyorum. S3 tarafından kullanılan imza, HTTP isteğinin bir parametresidir, ancak bir çerez değildir , her istek için yeniden hesaplanır.
Greg Hewgill

Bir kullanıcı hakkında bazı bilgileri kaydetmem gerekirse, onu nereye kaydederim? db? Ben db için her istek gitmek istemiyorum .... ve hala dinlenme kullanmak istiyorum .... lütfen yardımcı olabilir misiniz?
Royi Namir

@RoyiNamir: Bir hedefe nasıl ulaşacağınız hakkında özel sorularınız varsa, lütfen yeni bir soru sorun . Yorumlarda ek soruları cevaplayamıyorum.
Greg Hewgill

10

Birçok kişi REST prensiplerini çok iyi anlamıyor, bir oturum belirteci kullanmak her zaman durumunuzu ifade ettiğiniz anlamına gelmez, her bir istekle kullanıcı adı / şifre göndermenin nedeni sadece kimlik doğrulama için ve aynı şekilde bir jeton göndermek için aynıdır (giriş tarafından oluşturulur) işlem) yalnızca müşterinin veri isteme iznine sahip olup olmadığına karar vermek için REST konveksiyonlarını yalnızca hangi verilerin gösterileceğini belirlemek için kullanıcı adı / şifre veya oturum belirteçleri kullandığınızda ihlal edersiniz! bunun yerine bunları yalnızca kimlik doğrulaması için kullanmanız gerekir (verileri göstermek veya göstermek için değil)

sizin durumunuzda EVET bu RESTy diyorum, ama REST API'nizde yerel php oturumları kullanmaktan kaçının ve belirlenen süre zarfında süresi dolan kendi karma jetonları oluşturmaya başlayın!


1
teşekkür ederim. neden bir yerli php oturumu önlemek ve bunun yerine kendi karma belirteçleri kullanmalısınız?
Matthew

parlak bir neden değil, sadece daha fazla güvenlik ve daha fazla kontrol için.
EvilThinker

Bu, kabul edilen cevaptan daha iyidir. En azından öneriyi mantıklı olan RESTy olarak kabul eder. Ancak, iletilen bilgilerin neden kullanıcıya bağlı yetkilendirme için kullanılamadığını anlamıyorum. Bazı kullanıcılar bazı verilere erişebilir, bazıları ise erişemeyebilir. Bu protokol RESTful olmayan yapmaz.

8

Hayır, önemli değil. Google'ın ClientLogin'i , istemciye bir HTTP 401 yanıtı kullanarak "/ session" a gitmesi talimatı verilen dikkate değer istisna dışında tam olarak bu şekilde çalışır. Ancak bu bir oturum oluşturmaz, istemcilerin yalnızca kimlik bilgilerini net olarak geçmeden (geçici olarak) kimlik doğrulaması yapması ve sunucunun bu geçici kimlik bilgilerinin geçerliliğini uygun olarak kontrol etmesi için bir yol oluşturur.


11
@ unforgiven3 Döndürülen simge yalnızca kullanıcının kimliğini doğrulamak ve sunucu tarafından kullanıcıyı sunucuda depolanan başka bir durumla ilişkilendirmek için kullanılmadığı sürece, REST kısıtlamalarının ihlal edildiğini görmüyorum.
Darrel Miller

4
@ unforgiven3 Sunucu tarafından döndürülen simge, aslında kullanıcının söylediklerinin kim olduğunun kanıtıdır. Bu nedenle, kullanıcı adı ve parola dahil olmak üzere her istek yerine, her istek, sunucunun doğru olduğundan emin olacak şekilde yapılandırılmış jetonu içerir.
Darrel Miller

1
@ unforgiven3, Darrel haklı. Geri gönderilen yankı, istemcinin her HTTP isteğinde, tıpkı temel, özet kimlik doğrulamasında olduğu gibi, belirteç sona erene kadar gönderilmesi gerekir. Bu durumda, istemci, isteğe bağlı olarak kullanıcıdan kimlik bilgilerini veya herhangi bir şeyi isteyebilir. Eğer istersen cevabı detaylandırabilirim. edit: (Ve eski soruların cevaplarını takip ettiğiniz için teşekkürler!)
mogsie

1
Sorun değil, mogsie, her zaman bu tür şeyleri tartışmak için ilginç :-) Sanırım bu nereye gidiyorsun görüyorum, ne yazık ki sadece gerçekten kavramak için sindirim kimlik doğrulaması hakkında yeterince anlamıyorum (çoğunlukla sadece yok belirtecin her HTTP isteğine nasıl geri gönderildiğini anlayın, ancak bu bir uygulama ayrıntısı gibi görünüyor). Ancak, şimdi bu yöntemin neden REST ilkelerini ihlal etmediğini görüyorum. Yanıtlar için teşekkürler!
Rob

6
@ unforgiven3, Bu yardımcı olabilir: belirteç imzalı bir bilgi parçasıdır. Yani kendi kendine yetiyor. Sunucu, önceden kaydedilmiş bir durumu kontrol etmeden jetonu doğrulayabilir. Bu sadece istemcide depolanan ve ileri geri aktarılan bir durumdur.
Iravanchi

5

Tamam, HTTP kimlik doğrulamasının her mesajda otomatik olarak yapıldığını görüyorum - ama nasıl?

"Yetkilendirme:" HTTP başlığı istemci tarafından gönderilir. Temel (düz metin) veya özet.

Bir GET isteğini kabul eden, isteğin bir parçası olarak bir kullanıcı adı / parola gireceğiniz ve kimlik doğrulama başarılı olursa bir oturum belirteci döndüren bir REST hizmetinin (örneğin, / session) olması kötü olur mu? sonra gelen istekleri ile birlikte geçecek? Bu bir REST açısından mantıklı mı yoksa noktayı kaçırıyor mu?

Tüm oturum fikri , durumu sunucu tarafında tutarak, durum bilgisi olmayan protokol (HTTP) ve dilsiz istemci (web tarayıcı) kullanarak durum bilgisi olan uygulamalar yapmaktır . REST ilkelerinden biri, "Her kaynak hiper ortam bağlantılarında kullanılmak üzere evrensel bir sözdizimi kullanılarak benzersiz bir şekilde adreslenebilir" dir . Oturum değişkenleri URI üzerinden erişilemeyen bir şeydir. Gerçekten RESTful uygulaması, istemci tarafında durumu koruyacak ve gerekli değişkenleri HTTP üzerinden, tercihen URI'da gönderecektir.

Örnek: sayfalama ile arama. Formda URL'niz olurdu

http://server/search/urlencoded-search-terms/page_num

Yer imi eklenebilir URL'lerle çok ortak noktası var


4
Kimlik doğrulama bilgilerine URI üzerinden de erişilemez - herkes istek başlığının bir parçası olarak kimlik bilgisi gönderme hakkında konuşuyor. Bunun, isteğe bir oturum belirteci eklemekten farkı nedir? URI'de oturum belirtecini kullanmıyorum, ancak istekte geçirilen verilerde demiyorum.
Rob

Kimlik doğrulama, bu eylemi yürütme yetkiniz olup olmadığını belirler ve RESTful uygulamasında sonucunu etkilemez.
vartec

4
Bu eylemi gerçekleştirme yetkiniz olup olmadığını da bir oturum belirteci oluşturur. Bunun sonucunu etkilemeyeceği ne demek istiyorsun? Arayanın yetkilendirilmemesi durumunda Yetkili Değil hatası alır. Bir oturum belirteciyle aynı şey. Farkı gerçekten görmüyorum?
Rob

3
Hayır, oturum belirteci sunucuya kaydedilmiş durum için bir tanıtıcıdır . Bu sadece RESTful değil. Yetkili Değil ise, sonuç olarak görmüyorum. Ben bir istisna düşünmek istiyorum (deneyin / yakalamak gibi).
vartec

Yeterince adil, vartec - bu mantıklı. Takip için teşekkürler!
Rob

3

Müşteri oturumu yaşam süresini kontrol etmek istiyorsanız, önerinizin iyi olduğunu düşünüyorum. RESTful mimarisinin sizi vatansız uygulamalar geliştirmeye teşvik ettiğini düşünüyorum. @ 2pence yazdığı gibi "her HTTP isteği, alıcının HTTP'nin durumsuz doğasıyla tam bir uyum içinde işleyebilmesi için kendi başına yeterli bilgi taşımalıdır" .

Ancak, her zaman böyle değildir, bazen uygulamanın istemci oturum açtığında veya oturumu kapattığında bunu bildirmesi ve bu bilgilere dayalı kilitler veya lisanslar gibi kaynakları sürdürmesi gerekir. Böyle bir vaka örneği için takip soruma bakın .

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.