Sunucu tarafı oturumları REST'i ihlal ediyor mu?


14

Göre Roy Fielding onun seminal tez içinde (HTTP şartname ilkesi yazarlarından biri) Mimari Stiller zaman DİNLENME tartışırken , o söz:

[E] istemciden sunucuya istek, isteği anlamak için gerekli tüm bilgileri içermelidir ve sunucuda depolanan herhangi bir bağlamdan yararlanamaz.

"Saklı bağlam" ile o bahsediyordur uygulama durumuna örn sonraki sayfanın sayfa numarası vs ne kaynak durumuna tartışmasız - herhangi bir veri deposunu, görüntü vb örneğin bütün mesele REST.

Saf dinlenme denemelerinin çoğunun (işbu belgede yukarıdaki teze uyan bir uygulama olarak tanımlanmıştır) oturum verilerinin sunucuda depolanmasına (kalıcı veya başka türlü) güvenilmeleri nedeniyle başarısız olması gerektiğini söylemek adil midir?

Bir oturum kavramı - özellikle Web geliştiricileri için - yaygındır, ancak yukarıdaki tanıma göre RESTful olur mu?


2
Bu tanıma göre pratikte hiçbir şey dinlendirici değildir, ama bu tanım nasıl makul mantıklıdır? Google'ın sizin için arama yapması talebinde internetin bir dizinini sağlamanız gereken bir "huzurlu" google araması düşünün. Ne? Hayır, kalıcı bir mağazanıza sahip olamayacağınızı ve huzurlu olamayacağınızı söylemek, huzurlu arayüzlerin aslında anlamsız olduğunu söylemekle eşdeğer olacaktır. Bu, hepimizin bellek içi oturumları sürdürmeye ve hala iyi bir dinlenme tasarımı olduğunu söylemeye başlamamız gerektiği anlamına gelmez ...
Jimmy Hoffa

3
Uygulama durumu ile kaynak durumu arasında bir ayrım olduğunu belirtmek gerektiğini düşünüyorum (Google dizini kaynak durumu olacak ve tamamen meşru). Bunu soruda daha açık hale getirmeliyim.
Matt

böyle bir ayrım var mı? Lütfen tanımlayın. :) İnsanların bunları daha önce tanımlamaya çalıştıklarını gördüm, ama gerçekte bulanık, çünkü aslında farklı değiller. Her ikisi de değiştirilebilir verilerdir, bir devlet biçimi ile diğeri arasındaki tek ilgili ayrım, onun kalıcı olup olmadığıdır, burada olmayan biçim genellikle yenilenebilir anlamına gelir, bu da onu farklı kılan şeydir.
Jimmy Hoffa

1
Bunu kendim merak ettim. Kimse benim başvurumun neden altın "dinlendirici" bir yıldız istemesi gerektiğini açıklamamış olduğundan, gerçekten endişelenmiyorum.
psr

Yanıtlar:


10

Evet diyorum, oturum durumu RESTful bir uygulama RESTful olmayan yapar. Önemsiz örnek, kız kardeşim Wall Street Journal'a abone oluyor. Düzenli olarak, ödeme duvarının arkasında bir şey okuyacak ve WSJ hesabı olmayan bir arkadaşınıza (WSJ aracılığıyla değil, kendi e-posta istemcisi aracılığıyla) bir bağlantı göndermeye karar verecek. Tıkla, gönder, başarısız. Kız kardeşimin bu URL'deki deneyimi arkadaşınınkinden farklı.

İlgili, ancak kesinlikle konuya bağlı değilim : İnternetteki önemli araştırma çabalarını desteklemek için tasarlanmış bir uygulamanın erken tasarım aşamasındayım ( görevler denir (düşünüyorum: steroidler ve LSD'deki yer işaretleri)). Görevin sahibi, verilerinin belirli bir görünümünü başka biriyle paylaşmak istiyor, ancak bu görünüm, kullanıcı arayüzüne erişmek için uygun izinlerle birlikte kullanıcı arayüzü durumunun (örneğin hangi verilerin hangi bölmelerde gösterildiği görselleştirmeleri) bir kombinasyonunu gerektirir. ve görüntülenen veriler. Alıcının amaçlanan görünümü alması için çok fazla depolanmış durum gerekir.

Geçerli çözümüm, görünüm için gerekli olan tüm UI / ACL / bilgisini ayrı bir nesnede saklamak ve o nesnenin URL'sini (muhtemelen bir UUID) döndürmektir . Görüntüleme nesnesine erişmenin, ona sahip olan herkesin aynı bilgi / deneyimi elde etmesi açısından RESTful olarak kabul edilebileceğine inanıyorum .


1
Siz görüntüleme nesnesi örneği bu konuda başka bir açıdır. Temiz.
Matt

Diğer büyük cevaplara rağmen bunu cevap olarak kabul etmek, çoğunlukla soruyu doğrudan cevapladığı ve çok açık bir örnek verdiği için. Ayrıca, görüntüleme nesneleri üzerindeki ikinci bölüm ölçekleri devirdi.
Matt

1
Eğer wsj sitesinin dinlendirici olmayan bir uygulama örneği olduğunu söylüyorsanız, örneğinizin bunu gösterdiğine katılmıyorum. WSJ sitesi, örneğin, verileri sunmak için kız kardeşinizin müşterisi tarafından tamamen verilen verilere dayanıyorsa, @Matt'ın verdiği RESTful tanımına göre yapılır. Bununla birlikte, geçici bellek içi oturum durumuna dayanıyorsa, Matt'in RESTful'a vermediği tanım gereğidir. Bunu sadece belirtmek isterim çünkü Matt'in verdiği tanım uygulama spesifikasyonlarına dayanırken REST tüketim tekniği ile daha iyi tanımlanmıştır.
Jimmy Hoffa

@JimmyHoffa - Benim anlayış Rest adlı Kısıtlar o olmasıdır vatansız . Bu benim için oldukça açık görünüyor.
Peter Rowell

WSJ uygulamasının durumu yoksa, görüntülenebilir makalenin istemci tarafından gönderilmesi gerekir. Bu makale site yöneticileri tarafından herhangi bir zamanda düzenlenebilir, hata yapmayın, bu WSJ uygulamasının durumunun bir parçasıdır. Bence bu ayrımın sürdürülmesi, kalıcı bir durum olduğudur , bu nedenle oturumlar gibi kalıcı durumdan daha fazla garantiye ve daha az yönetim yüküne sahip olacak ve bununla ilgili işlemlerde daha basit atomisite kontrolü olacaktır. Bu basit tüketim modeli ile birlikte insanların istedikleri şeydir. (Sanırım)
Jimmy Hoffa

2

Sunucu tarafı oturumları REST'i ihlal ediyor mu?

Kesinlikle yaparlar! REST'i uyguladığınızda, sunucu tarafı oturumu olmamalıdır, aksi takdirde karma bir RPC / REST çözümünüz vardır.

İstemcinin, her yeni istek yapıldığında istemcinin kimliğini doğrulamak için gereken bilgiler de dahil olmak üzere, isteğe hizmet vermek için gereken tüm bağlamı bir RESTful hizmetine göndermesi gerekir. Sunucu, sonraki isteklerde daha hızlı hizmet verebilmek için bilgileri önbelleğe almakta serbesttir, ancak önbelleğe alınan bilgiler sunucu tarafı oturumuna eşit olmamalıdır. Başka bir deyişle, isteğin kendisi önbelleğe alınmış durumun yokluğunda bile işlenecek kadar bilgi içermelidir.


1

Muhtemelen "oturum verileri" ile ne demek istediğinize bağlıdır. Bu kesin bir terim mi?

İki taraf arasındaki güvenli iletişim genellikle sunucunun, istemcinin her istekle bir yetkilendirme yöntemi olarak sağlaması gereken sınırlı bir "erişim belirteci" oluşturmasını (ve depolamasını) içerir. Bu erişim belirteci zaten "oturum verileri" dediğim şeydir - sunucu tarafında depolanır, zaman sınırlıdır ve bir istemciyle (genellikle izinleri) ilişkilidir.

Böyle bir operasyon RESTful olmayan olarak etiketlenmiş olsaydı çok şaşırırdım. OAuth buna bir örnektir.

Ben uzman değilim ve burada kendime pek güvenmiyorum; Sadece yararlı olduklarını umduğum için görüşlerimi paylaşıyorum.


1

REST'in en önemli noktası, bir kaynağa giden bir URI'nin her zaman aynı kaynağa işaret etmesidir. Böylece kullanıcılar bu kaynak için bir referans verebilir ve herkes aynı şeyi görür. Buna Temsili Durum Transferi (REST) ​​denir. Sunucu durumu koruyor ve aynı URI için farklı bir kaynak sağlıyorsa, bunun artık saf REST olmadığını söyleyebilirim.


bu, kullanıcıların aynı şeyi göreceği doğru değildir. Access, herhangi bir kullanıcının ne kadar göreceğini belirleyebilir.
Erik

@Erik Ancak kullanıcı, istekte ne kadar görmek istediklerini belirtebilir (Kabul Başlığını kullanma dahil), bu nedenle Puckl'in yanıtları doğrudur.
Johan

1
@Johan Aynı son noktadan farklı kullanıcılar için farklı veriler döndürürüm. Aksi takdirde, kullanıcının kimliğini doğrulamanın anlamı nedir?
Erik

@Erik Bunu ben de yaparım. Hiçbiri daha az kimlik doğrulamasının kaynağın durumu dışında olduğuna inanıyorum, bu yüzden kesinlikle görünüm doğrulanmış kullanıcı tarafından etkileniyorsa, o zaman artık RESTful değil. Belki RESTful rozetinizi istiyorsanız, kimin erişim talebinde bulunduğuna bağlı olarak kaynağın birden fazla "görünümünü" oluşturmanız gerekir, yalnızca görünümlerin bazılarına erişim yetkisi verir. Bu yüzden herkese açık / userprofiles / {userID} / publicview'a erişebilir ve kullanıcı / userprofiles / {userID} / fullprofile'a erişebilir ve yetkili arkadaşlar / userprofiles / {userID} / friendsview'a erişebilir
Johan

0

Oturumlar temel olarak durumsuz, RESTful uygulamalarına durum eklemek için kullanılır. Bu nedenle resmi olarak, RESTful uygulamanızı durumsal hale getirir, ancak sunucunun durumunun tutulması hayatınızı biraz kolaylaştırır, çünkü her bir istek / yanıtta tüm verileri ileri geri iletmek zorunda kalmazsınız .

Oturumlar ve daha genel olarak belirtmek gerekirse, bundan kaçınmanıza izin verir ve bunun performans (daha az veri aktarımı) ve güvenlik (kurcalanabilecek daha az veri) gibi bazı olumlu faydaları vardır.

Resmen REST tanımının bir kısmını ihlal Yani iken, bu RESTful uygulamaları görmek için nadir böylece yararlıdır yok oturumları aracılığıyla durumunu kullanın.


Katılmıyorum. Marka, renk ve boyuta göre filtrelemenizi sağlayan bir alışveriş siteniz var. Geleneksel Web 1.0 web siteleri bunu bazı onay kutuları, sunucu tarafı oturumu ve POST ile ele alır. Example.org/shirts bağlantısını paylaşmak istersem, insanlar Orta, Siyah ve Kökleri seçtiğimi görmezler. (Bu ayrıca, geri tıkladığınızda çirkin "verileri yeniden gönderiyorsunuz" iletisine de neden olur.) Ancak (örn.) Example.org/shirts/medium-black-roots bağlantısını paylaşırsam, herkes aynı temsile sahiptir. Gerekli tüm durum bilgileri URL'de (veya gerekirse POST gövdesinde bulunur, ancak bunu paylaşamazsınız).
Jesse Buchanan

... RESTful her şeye uygun olmayabilir. Varsayımsal uygulama kaynağınız yönelimli mi (bir alışveriş sitesi kesinlikle öyle!)? Belki de kaynak odaklı olmayan bir çok devleti olan bir DEA için uygun olmayabilir. Dürüst olmak için iyi örnekleri düşünemiyorum.
Jesse Buchanan

0

Fielding'in bu ifadeyle kastettiği, REST API'sini barındıran uygulama sunucusunun, ortam durumunu sahne arkası mekanizmasının bir tür isteğiyle ilişkilendirmemesidir. Uygulama sunucusu ile veritabanı sunucusu arasındaki farkı göz önünde bulundurun . REST kısıtlaması, uygulama sunucusunun durumsuz olması gerektiğidir . Ancak, uygulama sunucusu, Yetkilendirme üstbilgisinde veya Uri'nin kendisinde kullanıcı / parola birleşimi gibi, isteğin bir parçası olan bilgilere dayanarak kaynak durumu isteklerini veritabanı sunucusuna devredebilir . Sonuçta, REST istemci / sunucu modelini temel alır.

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.