403 Yasak vs 401 Yetkisiz HTTP yanıtları


2783

Var olan ancak bir kullanıcının yeterli ayrıcalığa sahip olmadığı (oturum açmamış veya uygun kullanıcı grubuna ait olmayan) bir web sayfası için, sunulacak doğru HTTP yanıtı nedir?

401 Unauthorized?
403 Forbidden?
Başka bir şey?

Şimdiye kadar her birinde okuduğum, ikisi arasındaki fark konusunda çok net değil. Her cevap için hangi kullanım durumları uygundur?


358
401 'Yetkisiz' 401 'Yetkisiz' olmalı, sorun çözüldü!
Christophe Roussy

47
Ben ve meslektaşlarımın kaç kez bu soru için yığın akışına geri döndüklerini hatırlamıyorum. Belki HTTP standartları 401 ve 403 için adları veya açıklamaları değiştirmeyi düşünmelidir
nörit

Aslında, bu hatanın farklı bir sürümünü alıyorum. "os_authType" herhangi bir "ve geçersiz bir çerez gönderildi" gibi. Bunu nasıl çözeceğimi bulamıyorum. Çok fazla zaman geçirdim, nedenleri vardı, ancak bir çözüm bulamadık.
Sandeep Anand

@ Qwerty hayır, yeni RFC7231, RFC2616'yı geçersiz kılar. 403'ün artık farklı bir anlamı var.
kılçık

1
@ balık kılçığı, 401 durum kodunun bu
RFC'den

Yanıtlar:


4113

Daniel Irvine'den net bir açıklama :

Kimlik doğrulama hataları için HTTP durum kodu olan 401 Yetkisiz ile ilgili bir sorun var . Ve bu sadece: yetkilendirme için değil, kimlik doğrulama içindir. 401 yanıtı almak, sunucunun size "kimliği doğrulanmamışsınız - ya hiç doğrulanmadı ya da yanlış doğrulanmadı", ancak lütfen yeniden doğrulayın ve tekrar deneyin. Size yardımcı olmak için, her zaman kimlik doğrulamasının nasıl yapılacağını açıklayan bir WWW-Authenticate üstbilgisi içerir.

Bu, web uygulamanız tarafından değil, genellikle web sunucunuz tarafından döndürülen bir yanıttır.

Aynı zamanda çok geçici bir şey; sunucu sizden tekrar denemenizi istiyor.

Bu nedenle, yetkilendirme için 403 Yasak yanıtı kullanıyorum. Kalıcı, uygulama mantığımla bağlantılı ve 401'den daha somut bir yanıt.

403 yanıtı alan sunucu, “Üzgünüm. Kim olduğunuzu biliyorum - kim olduğunuzu söylediğinize inanıyorum - ancak bu kaynağa erişim izniniz yok. Belki sistem yöneticisine hoş sorarsanız, izin alırsınız. Ama lütfen çıkmazın değişene kadar beni bir daha rahatsız etme. ”

Özetle, eksik veya hatalı kimlik doğrulama için 401 Yetkisiz yanıt kullanılmalı ve daha sonra, kullanıcının kimliği doğrulandığında ancak belirtilen kaynakta istenen işlemi gerçekleştirme yetkisi bulunmadığında 403 Yasak yanıt kullanılmalıdır.

Başka güzel resimsel biçim http durum kodları kullanılması gerektiğini nasıl.

resim açıklamasını buraya girin


43
Varsayılan IIS 403 iletisi, "Bu genel bir 403 hatasıdır ve kimliği doğrulanan kullanıcının sayfayı görüntüleme yetkisi olmadığı anlamına gelir" şeklindedir;
Ben Challenor

333
@JPReddy Yanıtınız doğru. Ancak, 401'in "Kimliği Doğrulanmadı" ve 403'ün "Yetkisiz" olarak adlandırılmasını beklerim. Kimlik Doğrulama ile ilgili olan 401, "Yetkisiz" metnine eşlik eden bir biçime sahip olması çok kafa karıştırıcıdır .... İngilizce (iyi bir olasılık) iyi değilse sürece.
p.matsinopoulos

64
@ZaidMasud, RFC'ye göre bu yorum doğru değil. Cumbayah'ın cevabı doğru. 401 "doğru yetkiyi kaçırdığınız" anlamına gelir. "İsterseniz kendinizi doğrulamaya çalışabilirsiniz" anlamına gelir. Bu yüzden hem kendini doğrulamamış bir istemci hem de yetkisini kaybeden düzgün bir şekilde doğrulanmış bir müşteri 401 alacaktır. RFC, 403 davasında "yetkinin yardımcı olmayacağını" açıkça belirtmektedir.
Davide R.

84
401 Kimlik Doğrulama hatası, 403 Yetkilendirme hatası. Bu kadar basit.
Shahriyar Imanov

30
Blog yazısından kopyalarken "Bu zaten benim görüşüm :)" ı bıraktınız ve maalesef onun görüşü yanlış. Diğerlerinin belirttiği gibi 403, kimliğiniz doğrulandığından bağımsız olarak kaynağa erişemeyeceğiniz anlamına gelir. Genellikle bu durum kodunu IP adres aralıkları veya webroot'umda doğrudan erişim istemediğim dosyalar tarafından kilitlenmiş kaynaklar için kullanıyorum (yani bir komut dosyası bunları sunmalıdır).
Kyle

402

RFC2616'ya bakın :

401 Yetkisiz:

İstek zaten Yetkilendirme kimlik bilgilerini içeriyorsa, 401 yanıtı bu kimlik bilgileri için yetkinin reddedildiğini gösterir.

403 yasak:

Sunucu isteği anladı, ancak yerine getirmeyi reddediyor.

Güncelleme

Kullanım durumunuzdan kullanıcının kimliği doğrulanmadığı anlaşılıyor. 401 dönecekti.


Düzenleme: RFC2616 kullanılmıyor, bkz. RFC7231 ve RFC7235 .


21
Teşekkürler, bu benim için netleştirdi. Her ikisini de kullanıyorum - kimliği doğrulanmamış kullanıcılar için 401, yetersiz izinleri olan kimliği doğrulanmış kullanıcılar için 403.
VirtuosiMedia

52
Ben inmedim ama bu cevabı oldukça yanıltıcı buluyorum. 403 yasak, asla sunulmayacak içerikte daha uygun bir şekilde kullanılır (asp.net'teki .config dosyaları gibi). bu ya da bir 404. imho, erişilebilir bir şey için 403 dönmek uygun olmaz, ancak doğru kimlik bilgilerine sahip değilsiniz. benim çözüm kimlik bilgilerini değiştirmek için bir yol ile erişim reddedildi mesajı vermek olacaktır. bu ya da 401.
Mel

27
"Yanıt, istenen kaynağa uygulanabilecek bir zorluk içeren bir WWW-Authenticate başlık alanı (bölüm 14.47) içermelidir." HTTP tarzı kimlik doğrulamasını kullanmak istemiyorsanız, 401 yanıt kodunun uygun olmadığı anlaşılıyor.
Brilliand

8
Billiand'ı buraya geri getireceğim. Bu ifade "İstek zaten Yetkilendirme kimlik bilgilerini içeriyorsa" şeklindedir. Bu, kimlik bilgilerini sağlayan bir istekten gelen bir yanıtsa (örn. RFC2617 Kimlik Doğrulama girişiminden gelen yanıt). Bu, sunucunun "Kötü hesap / şifre çifti, tekrar deneyin" demesine izin vermektir. Sorulan soruda, kullanıcının muhtemelen kimliği doğrulanmış ancak yetkilendirilmemiş. 401 asla bu koşullar için uygun bir yanıt değildir.
ldrut

6
Brilliand haklı, 401 sadece HTTP Kimlik Doğrulaması için uygundur.
Juampi

296

Diğer yanıtların eksik olduğu bir şey, RFC 2616 bağlamındaki Kimlik Doğrulama ve Yetkilendirmenin SADECE RFC 2617'nin HTTP Kimlik Doğrulama protokolüne atıfta bulunduğu anlaşılmalıdır. RFC2617 dışındaki şemalarla kimlik doğrulama HTTP durum kodlarında desteklenmez ve dikkate alınmaz 401 veya 403 kullanıp kullanmayacağınıza karar verirken.

Kısa ve Kısa

Yetkisiz, istemcinin RFC2617 kimliği doğrulanmadığını ve sunucunun kimlik doğrulama işlemini başlattığını belirtir. Yasak, istemcinin RFC2617 kimlik doğrulaması olduğunu ve yetkilendirmenin olmadığını veya sunucunun istenen kaynak için RFC2617'yi desteklemediğini belirtir.

Yani, kendi rulo giriş işleminiz varsa ve asla HTTP Kimlik Doğrulaması kullanmıyorsanız, 403 her zaman doğru yanıttır ve 401 asla kullanılmamalıdır.

Ayrıntılı ve Derinlemesine

Gönderen RFC2616

10.4.2 401 Yetkisiz

İstek için kullanıcı kimlik doğrulaması gerekiyor. Yanıt, istenen kaynağa uygulanabilecek bir zorluk içeren bir WWW-Authenticate başlık alanı (bölüm 14.47) içermelidir ZORUNLU. Müşteri isteği uygun bir Yetkilendirme başlığı alanı ile tekrarlayabilir (bölüm 14.8).

ve

10.4.4 403 Yasak Sunucu isteği anladı ancak yerine getirmeyi reddediyor. Yetkilendirme yardımcı olmaz ve istek tekrarlanmamalıdır.

Akılda tutulması gereken ilk şey, bu belge bağlamında "Kimlik Doğrulama" ve "Yetkilendirme" nin özellikle RFC 2617'deki HTTP Kimlik Doğrulama protokollerine atıfta bulunmasıdır. giriş sayfaları, vb kullanarak. Ben RFC2617 dışında yöntemlerle kimlik doğrulama ve yetkilendirme başvurmak için "giriş" kullanacağım

Yani asıl fark, sorunun ne olduğu veya bir çözüm olsa bile. Fark, sunucunun istemcinin bundan sonra yapmasını beklediği şeydir.

401 kaynağın sağlanamadığını, ancak sunucunun istemcinin HTTP Kimlik Doğrulaması yoluyla oturum açmasını İSTEDİĞİNİ belirtir ve işlemi başlatmak için yanıt üstbilgileri gönderdi. Muhtemelen kaynağa erişime izin verecek yetkiler vardır, muhtemelen yoktur, ancak bir deneyin ve neler olduğunu görelim.

403, kaynağın sağlanamadığını ve mevcut kullanıcı için bunu RFC2617 aracılığıyla çözmenin bir yolu olmadığını ve denemenin bir anlamı olmadığını gösterir. Bunun nedeni, hiçbir kimlik doğrulama düzeyinin yeterli olmadığı (örneğin bir IP kara listesi nedeniyle) olduğu için olabilir, ancak kullanıcının zaten kimliği doğrulanmış ve yetkisi olmadığı için olabilir. RFC2617 modeli bir kullanıcı, bir kimlik bilgisidir, bu nedenle kullanıcının yetkilendirilebilecek ikinci bir kimlik bilgisi kümesine sahip olması durumunda göz ardı edilebilir. Bir tür giriş sayfasının veya diğer RFC2617 olmayan kimlik doğrulama protokolünün RFC2616 standartları ve tanımının dışında olduğu konusunda yardımcı olabileceğini veya olmayabileceğini ima etmez veya ima etmez.


Düzenleme: RFC2616 kullanılmıyor, bkz. RFC7231 ve RFC7235 .


7
Kullanıcı http olmayan kimlik doğrulaması gerektiren bir sayfa istediğinde ne yapmalıyız? 403 durum kodu gönderilsin mi?
marcovtwout

2
Ayrım ile ilgili sorularıma cevap veren cevap bu.
Patrick

9
Bu önemlidir: "Eğer kendi rulo giriş işleminiz varsa ve asla HTTP Kimlik Doğrulaması kullanmıyorsanız, 403 her zaman doğru yanıttır ve 401 asla kullanılmamalıdır."
ggg

1
@marcovtwout Giriş sayfanıza 302 veya nasıl giriş yapılacağına dair bilgi içeren bir gövde içeren bir 403 gönderin?
Alex

4
RFC7235 "kendinize ait" veya alternatif kimlik doğrulama zorlukları sunmuyor mu? Uygulamamın giriş akışı neden meydan okumayı WWW-Authenticatebaşlık şeklinde sunamıyor? Bir tarayıcı desteklemese bile, React uygulamam ...
jchook

127
  + -----------------------
  | KAYNAK VAR MI? (eğer gizliyse, genellikle kimlik doğrulama kontrolünden SONRA kontrol edilir)
  + -----------------------
    | |
 HAYIR | v EVET
    v + -----------------------
   404 | Oturum Açıldı mı? (kimliği doğrulanmış, aka oturum veya JWT çerezi var)
   veya + -----------------------
   401 | |
   403 HAYIR | | EVET
   3xx vv
              401 + -----------------------
       (404 açıklama yok) | KAYNAK ERİŞEBİLİR Mİ? (izin, yetkili, ...)
              veya + -----------------------
             yönlendirme | |
             giriş yapmak için NO | | EVET
                               | |
                               vv
                               403 OK 200, yönlendirme, ...
                      (veya 404: açıklama yok)
                      (veya 404: özelse kaynak yok)
                      (veya 3xx: yönlendirme)

Kontroller genellikle şu sırayla yapılır:

  • 404 Kaynak herkese açık ve mevcut değilse veya 3xx yönlendirmesi
  • AKSİ TAKDİRDE:
  • Giriş yapılmadıysa veya oturum süresi dolmadıysa 401
  • 403 Kullanıcının kaynağa erişme izni yoksa (dosya, json, ...)
  • 404, kaynak mevcut değilse veya herhangi bir şeyi açıklamak istemiyorsa veya 3xx yönlendirmesi

YETKİSİZ : İsteğin kimlik doğrulaması gerektirdiğini belirten durum kodu (401) , genellikle kullanıcının oturum açması (oturum) gerektiği anlamına gelir. Sunucu tarafından bilinmeyen kullanıcı / aracı. Diğer kimlik bilgileriyle tekrarlanabilir. NOT: Bu 'kafa karıştırıcı' yerine 'kimliği doğrulanmamış' olarak adlandırılması gerektiği için kafa karıştırıcıdır. Bu oturumun süresi dolduğunda oturum açtıktan sonra da olabilir. Özel durum: Kaynağın varlığını veya yokluğunu önlemek için 404 yerine kullanılabilir (credits @gingerCodeNinja)

YASAK : Sunucunun isteği anladığını ancak yerine getirmeyi reddettiğini gösteren durum kodu (403). Sunucu tarafından bilinen ancak yetersiz kimlik bilgilerine sahip kullanıcı / aracı . Kimlik bilgileri değişmedikçe, kısa bir süre içinde çok düşük bir olasılıkla tekrarlanan istek çalışmaz. Özel durum: Kaynağın varlığını veya yokluğunu önlemek için 404 yerine kullanılabilir (credits @gingerCodeNinja)

BULUNAMADI : İstenen kaynağın mevcut olmadığını gösteren durum kodu (404). Bilinen kullanıcı / aracı, sunucu kaynak hakkında hiçbir şey açığa çıkarmaz, sanki yokmuş gibi yapar. Tekrarlama işe yaramaz. Bu 404'ün özel bir kullanımıdır (örneğin github bunu yapar).

@ChrisH tarafından belirtildiği gibi , 3xx yönlendirmesi için birkaç seçenek vardır (301, 302, 303, 307 veya hiç yönlendirmemek ve 401 kullanmak):


Örneğin, giriş yaptım ve bir sayfaya erişebiliyorum, ancak benim için etkin değil. Hangi durum kodu dönecek?
barteloma

@bookmarker Oturum açma işlemine ilk adım olan kimlik doğrulama adı verilir. Bu nedenle, giriş yaptıktan sonra izniniz yoksa 403 Yasak alırsınız (yetersiz kimlik bilgileri yeterli izniniz olmadığı anlamına gelir).
Christophe Roussy

3
Açık ve basit bir açıklama. Tam ihtiyacım olan şey.
Estevez

kullanıcı oturum açmadıysa veya oturum açmadıysa ancak izniniz yoksa ve içerik yerinde yoksa, bazen 404 yerine 401/403 döndürmek istersiniz, böylece ne olduğunu veya ne olduğunu ortaya çıkarmazsınız. Eğer kullanıcının kimliği doğrulanmamış ve oturum açmamışsa orada değilsiniz. Sadece bir şey olduğunu bilmek bir şeye doğru ipucu verebilir veya NDA'yı kırabilir. Bu nedenle, bazen bu diyagramın 404 kısmı oturum açmış / kimlik doğrulaması altında taşınmalıdır.
gingerCodeNinja

1
@MattKocaj, no revealvakanın bazen ince zamanlama farkları ile tespit edilebileceğini ve bir güvenlik özelliği olarak görülmemesi gerektiğini, sadece saldırganları yavaşlatabileceğini veya gizliliğe biraz yardımcı olabileceğini unutmayın.
Christophe Roussy

113

Göre RFC 2616'da (HTTP / 1.1) 403 zaman gönderilir:

Sunucu isteği anladı, ancak yerine getirmeyi reddediyor. Yetkilendirme yardımcı olmaz ve istek tekrarlanmamalıdır. İstek yöntemi HEAD değilse ve sunucu, isteğin neden yerine getirilmediğini halka duyurmak istiyorsa, kuruluştaki ret nedenini açıklamalıdır. Sunucu bu bilgileri istemcinin kullanımına sunmak istemiyorsa, bunun yerine 404 durum kodu (Bulunamadı) kullanılabilir

Başka bir deyişle, istemci kimlik doğrulaması yaparak kaynağa erişebilirse, 401 gönderilmelidir.


5
Ve eğer erişip erişemeyecekleri belli değilse? 3 kullanıcı düzeyim olduğunu varsayalım: Herkese açık, Üyeler ve Premium Üyeler. Sayfanın yalnızca Premium Üyeler için olduğunu varsayın. Genel bir kullanıcının kimliği doğrulanmamıştır ve oturum açtıklarında Üyeler veya Premium Üyeler'de olabilirler . Üye kullanıcı düzeyi için 403 uygun görünebilir. Premium Üyeler için, 401. Bununla birlikte, halka ne hizmet ediyorsunuz?
VirtuosiMedia

27
imho, bu en doğru cevap. uygulamaya bağlıdır, ancak genellikle, kimliği doğrulanmış bir kullanıcı bir kaynak üzerinde yeterli haklara sahip değilse, kimlik bilgilerini değiştirmek veya 401 göndermek için bir yol sağlamak isteyebilirsiniz. 403'ün hiç sunulmayan içerik için en uygun olduğunu düşünüyorum. Asp.net bu web.config dosyaları * .resx dosyaları vb anlamına gelir çünkü hangi kullanıcı oturum açar olursa olsun, bu dosyalar ASLA sunulmayacak, bu yüzden tekrar denemek için bir anlamı yoktur.
Mel

6
+1, ancak belirsiz bir +1. Mantıksal sonuç, 401 veya 404'ün kesinlikle daha iyi bir yanıt olacağı için 403'ün asla iade edilmemesi gerektiğidir.
CurtainDog

12
@Mel istemci tarafından erişilmemesi gereken bir dosyanın 404 olması gerektiğini düşünüyorum. Sistemin içinde bulunan bir dosyadır; dışarıda var olduğunu bile bilmemeli. Bir 403 döndürerek, müşteriye bunun var olduğunu bildirmesini sağlıyorsunuz, bu bilgileri bilgisayar korsanlarına vermenize gerek yok. 403 için spec diyorAn origin server that wishes to "hide" the current existence of a forbidden target resource MAY instead respond with a status code of 404 (Not Found).
Juan Mendes

3
Bu bana muhtemelen eski RFC 2616'nın doğru bir yorumu gibi görünse de, RFC 7231'in 403'ün anlambilimini farklı bir şekilde tanımladığını ve aslında "İstemcinin isteği yeni veya farklı kimlik bilgileriyle tekrarlayabileceğini" belirtti. Bu cevap 2010'da doğru olsa da, bugün tamamen yanlış, çünkü durum kodunun anlamı ayaklarımızın altında yeniden yazıldı. (Rahatsız edici bir şekilde, RFC 2616 ekindeki Değişiklikler değişikliği kabul etmiyor!)
Mark Amery

46

HTTP kimlik doğrulamasının ( WWW-Kimlik Doğrulama ve Yetkilendirme başlıkları) kullanımda olduğu varsayılarak , başka bir kullanıcı kimlik doğrulaması istenen kaynağa erişim izni verdiği için 401 Yetkisiz döndürülmelidir.

403 Yasak, HTTP kimlik doğrulamasıyla ilgili olmadığı sürece kaynağa erişimin herkes tarafından yasaklandığı veya belirli bir ağla kısıtlandığı veya yalnızca SSL üzerinden izin verildiği durumlarda kullanılır.

HTTP kimlik doğrulaması kullanılmıyorsa ve hizmet günümüzde norm olduğu gibi çerez tabanlı bir kimlik doğrulama düzeni ise, bir 403 veya 404 döndürülmelidir.

401 ile ilgili olarak, bu RFC 7235'ten (Köprü Metni Aktarım Protokolü (HTTP / 1.1): Kimlik Doğrulama):

3.1. 401 Yetkisiz

401 (Yetkisiz) durum kodu, hedef kaynak için geçerli kimlik doğrulama bilgilerinden yoksun olduğu için isteğin uygulanmadığını gösterir. Kaynak sunucu, hedef kaynak için geçerli en az bir sorun içeren bir WWW-Kimlik Doğrulama başlık alanı (Bölüm 4.4) göndermelidir * ZORUNLU *. İstek kimlik doğrulama bilgilerini içeriyorsa, 401 yanıtı bu kimlik bilgileri için yetkinin reddedildiğini gösterir. İstemci, isteği yeni veya değiştirilmiş bir Yetkilendirme başlığı alanıyla tekrarlayabilir (Bölüm 4.1). 401 yanıtı, önceki yanıtla aynı sorguyu içeriyorsa ve kullanıcı aracısı en az bir kez kimlik doğrulama girişiminde bulunmuşsa, kullanıcı aracısı, genellikle ilgili teşhis bilgilerini içerdiği için ekteki temsili kullanıcıya sunmalıdır.

403'ün (ve 404) semantiği zamanla değişti. Bu 1999'dan (RFC 2616):

10.4.4 403 Yasak

Sunucu isteği anladı, ancak yerine getirmeyi reddediyor.
Yetkilendirme yardımcı olmaz ve istek tekrarlanmamalıdır.
İstek yöntemi HEAD değilse ve sunucu
, isteğin neden yerine getirilmediğini halka duyurmak istiyorsa, kuruluştaki ret nedenini açıklamalıdır. Sunucu bu bilgileri istemcinin kullanımına açmak istemiyorsa,
bunun yerine 404 (Bulunamadı) durum kodu kullanılabilir.

2014 yılında RFC 7231 (Köprü Metni Aktarım Protokolü (HTTP / 1.1): Anlambilim ve İçerik) 403'ün anlamını değiştirdi:

6.5.3. 403 yasak

403 (Yasak) durum kodu, sunucunun isteği anladığını, ancak yetkilendirmeyi reddettiğini gösterir. İsteğin neden yasaklandığını herkese açık hale getirmek isteyen bir sunucu, bu nedeni yanıt yükünde (varsa) açıklayabilir.

İstekte kimlik doğrulama bilgileri verildiyse,
sunucu bunların erişim izni vermek için yetersiz olduğunu düşünür. İstemci
, isteği aynı
kimlik bilgileriyle otomatik olarak tekrarlamamalıdır . İstemci, isteği yeni veya farklı kimlik bilgileriyle tekrarlayabilir. Ancak,
kimlik bilgileriyle ilgili olmayan nedenlerden dolayı bir talep yasaklanabilir .


Yasak bir hedef kaynağın mevcut varlığını "gizlemek" isteyen bir başlangıç ​​sunucusu, bunun yerine
404 (Bulunamadı) durum kodu ile yanıt verebilir .

Böylece, bir 403 (veya 404) artık herhangi bir şey anlamına gelebilir. Yeni kimlik bilgileri sağlamak yardımcı olabilir ... ya da olmayabilir.

Bunun değişmesinin nedeninin RFC 2616 olduğuna inanıyorum, günümüzde Web uygulamaları örneğin formlar ve çerezler kullanarak özel kimlik doğrulama düzenleri oluştururken HTTP kimlik doğrulamasının kullanılacağı varsayılmaktadır.


2
Bu ilginç. RFC 7231 ve RFC 7235'e dayanarak, 401 ve 403
Brian

2
403 "Seni tanıyorum ama bu kaynağı göremezsin" anlamına gelir. Karışıklık için bir neden yok.
Michael Blackburn

"İstek kimlik doğrulama bilgilerini içeriyorsa, 401 yanıtı bu kimlik bilgileri için yetkilendirmenin reddedildiğini belirtir. İstemci, isteği yeni veya değiştirilmiş bir Yetkilendirme üstbilgisi alanıyla tekrarlayabilir (Bölüm 4.1)." Ancak, daha sonra "4.2. 'Yetkilendirme' başlık alanı, bir kullanıcı aracısının bir kaynak sunucu ile kimlik doğrulaması yapmasına izin verir". RFC7235'te "yetkilendirme" terimini "kimlik doğrulama" gibi kullandıkları anlaşılıyor. Bu durumda, kimliği doğrulanmış ancak yetkilendirilmemiş bir kullanıcının 401 almaması gerekir, daha ziyade 403
arcuri82

28

Bu eski bir soru ama gerçekten yetişmiş hiçbir zaman bir seçenek güvenlik açısından bakıldığında bir 404. dönmek oldu en yüksek potansiyel gelen cevap acılarını olarak bilgi sızdırma güvenlik açığı . Örneğin, söz konusu güvenli web sayfasının bir sistem yöneticisi sayfası olduğunu veya daha yaygın olarak kullanıcının erişemediği bir sistemdeki bir kayıt olduğunu varsayalım. İdeal olarak, kötü niyetli bir kullanıcının erişiminin olmadığı bir yerde bir sayfa / kayıt olduğunu bile bilmesini istemezsiniz. Böyle bir şey oluşturduğumda, dahili bir günlükte kimliği doğrulanmamış / yetkisiz istekleri kaydetmeye çalışacağım, ancak 404 döndüreceğim.

OWASP, bir saldırganın bu tür bilgileri bir saldırının parçası olarak nasıl kullanabileceği hakkında daha fazla bilgiye sahiptir .


3
Önceki cevaplarda 404'ün kullanımından bahsedilmiştir. Re: bilgi sızıntısı içindesiniz ve bu, kendi kimlik doğrulama / yetkilendirme planını kullanan herkes için önemli bir husus olmalıdır. OWASP'den bahsettiği için +1.
Dave Watts

İronik bir şekilde OWASP bağlantısı şimdi 404 sayfasına gidiyor. Ben owasp.org/index.php/…
anned20

Uyarı için teşekkürler, güncelledim!
Patrick White

API'ya ve erişimin nasıl verildiğine bağlıdır. Ancak, kullanıcı adı / şifre için 401 döndürürse "sızıntı" sorun değil, kesinlikle bir web formu ile aynı mı?
James

26
  • 401 Yetkisiz : Kim olduğunu bilmiyorum. Bu bir kimlik doğrulama hatası.
  • 403 Yasak : Kim olduğunuzu biliyorum, ancak bu kaynağa erişim izniniz yok. Bu bir yetkilendirme hatasıdır.

Özellikle "her zaman" gönderenin bilinmiyor olduğu anlamına gelmez. Talep ettikleri her şey yetkili değildi.
James

22

Bu soru bir süre önce soruldu, ama insanların düşünceleri devam ediyor.

Bu taslakta Bölüm 6.5.3 (Fielding ve Reschke tarafından yazılmıştır) durum kodu 403'e RFC 2616'da belgelenen koddan biraz farklı bir anlam vermektedir .

Bir dizi popüler web sunucusu ve çerçevesi tarafından kullanılan kimlik doğrulama ve yetkilendirme programlarında neler olduğunu yansıtır.

En belirgin olduğunu düşündüğüm şeyi vurguladım.

6.5.3. 403 yasak

403 (Yasak) durum kodu, sunucunun isteği anladığını, ancak yetkilendirmeyi reddettiğini gösterir. İsteğin neden yasaklandığını herkese açık hale getirmek isteyen bir sunucu, bu nedeni yanıt yükünde (varsa) açıklayabilir.

İstekte kimlik doğrulama bilgileri verildiyse, sunucu bunların erişim izni vermek için yetersiz olduğunu düşünür. İstemci, isteği aynı kimlik bilgileriyle tekrarlamamalıdır. İstemci, isteği yeni veya farklı kimlik bilgileriyle tekrarlayabilir. Ancak, kimlik bilgileriyle ilgili olmayan nedenlerden dolayı bir talep yasaklanabilir.

Yasak bir hedef kaynağın mevcut varlığını "gizlemek" isteyen bir başlangıç ​​sunucusu, bunun yerine 404 (Bulunamadı) durum kodu ile yanıt verebilir.

Hangi kuralı kullanırsanız kullanın, önemli olan, sitenizde / API'nızda tekdüzelik sağlamaktır.


2
Taslak onaylandı ve şimdi RFC 7231.
Vebjorn Ljosa

13

TL; DR

  • 401: Kimlik doğrulamayla ilgili bir ret
  • 403: Kimlik doğrulama ile ilgili bir şey YOK reddetme

Pratik Örnekler

Eğer apache kimlik doğrulaması gerektiriyor (aracılığıyla .htaccess) ve vurmak Cancel, bu a ile yanıt verecektir401 Authorization Required

Eğer nginx bir dosya bulur, ancak hiçbir vardır erişim hakları (kullanıcı / grup) okumak için / erişim onu, o ile cevap verecektir403 Forbidden

RFC (2616 Bölüm 10)

401 Yetkisiz (10.4.2)

Anlam 1: Kimlik doğrulaması gerekiyor

İstek için kullanıcı kimlik doğrulaması gerekiyor. ...

2 Anlamı: Kimlik doğrulama yetersiz

... İstek zaten Yetkilendirme kimlik bilgilerini içeriyorsa, 401 yanıtı bu kimlik bilgileri için yetkinin reddedildiğini gösterir. ...

403 Yasak (10.4.4)

Anlamı: Kimlik doğrulamayla ilgisi

... Yetkilendirme yardımcı olmaz ...

Daha fazla detay:

  • Sunucu isteği anladı, ancak yerine getirmeyi reddediyor.

  • İşletmedeki ret nedenini açıklamalıdır

  • Durum kodu 404 (Bulunamadı) kullanılabilir

    (Sunucu bu bilgileri istemciden tutmak istiyorsa)


11

giriş yapmamışlar veya uygun kullanıcı grubuna ait değiller

İki farklı durum belirttiniz; her vakanın farklı bir yanıtı olmalıdır:

  1. Eğer giriş yapmamışlarsa 401 Yetkisiz'e geri dönmelisiniz.
  2. Giriş yapmış ancak uygun kullanıcı grubuna ait değilse, 403 Yasak Döndürmelisiniz

Bu yanıta alınan yorumlara dayanarak RFC ile ilgili not:

Kullanıcı oturum açmamışsa, kimliği doğrulanmamıştır, HTTP eşdeğeri 401'dir ve yanıltıcı olarak RFC'de Yetkisiz olarak adlandırılır. As bölüm 10.4.2 için devletler 401 Yetkisiz :

"İstek için kullanıcı gerekiyor kimlik doğrulaması gerekiyor ."

Kimliği doğrulanmamışsanız, 401 doğru yanıttır. Ancak, yetkisiz olarak, anlamsal olarak doğru anlamda, 403 doğru yanıttır.


5
Bu doğru değil. Bakınız RFC Cumbayah cevabı @ ve.
Davide R.

7
@DavideR. RFC, kimlik doğrulama ve yetkilendirmeyi birbirinin yerine kullanır . Kimlik doğrulama anlamıyla okunduğunda daha mantıklı olduğuna inanıyorum .
Zaid Masud

Bu cevap tersine çevrildi. Yetkisiz, Kimliği doğrulanmamış ile aynı değil. @DavideR haklı. Kimlik Doğrulama ve Yetkilendirme
DEĞİŞTİRİLMEZ

2
2616 yakılmalıdır. Birkaç yeni RFC, "Seni tanımıyorum" ile "Seni tanıyorum ama buna erişemezsin" arasında ayrım yapmaya ihtiyaç olduğu çok daha açık. Orada hiçbir 403-truthers düşündüren ne olduğu, yerine getirilmesi asla (veya http yoluyla yerine getirilmemesi) bir kaynağın varlığını tanımaya meşru sebep.
Michael Blackburn

6

Bunlar anlamları:

401 : Kullanıcı doğrulanmadı (doğru), kaynak / sayfa kimlik doğrulaması gerektiriyor

403 : Kullanıcı kimliği doğrulandı, ancak rolü veya izinleri istenen kaynağa erişime izin vermiyor, örneğin kullanıcı bir yönetici değil ve istenen sayfa yöneticiler için


Bu, bu sorunun TLDR karşılığıdır.
Kousha

5

Bu kafamda burada herhangi bir yerden daha basit, bu yüzden:

401: Bunu görmek için HTTP temel kimlik doğrulamasına ihtiyacınız var.

403: Bunu göremezsiniz ve HTTP temel yetkisi yardımcı olmaz.

Kullanıcının sitenizin standart HTML giriş formunu kullanarak giriş yapması gerekiyorsa, HTTP temel kimlik doğrulamasına özel olduğu için 401 uygun olmaz.

403 gibi şeylere erişimi engellemek için kullanılmasını önermiyorum /includes, çünkü web söz konusu olduğunda, bu kaynaklar hiç mevcut değildir ve bu nedenle 404 olmalıdır.

Bu, 403'ü "giriş yapmanız gerekir" olarak bırakır.

Başka bir deyişle, 403 "bu kaynak HTTP temel yetkilendirme dışında bir tür yetkilendirme gerektirir" anlamına gelir.

https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2


5

Bir tarayıcıda, 401'in kullanıcının yeni kimlik bilgilerini girmesi için bir kimlik doğrulama iletişim kutusu başlattığını düşünürken 403'ün girmediğini düşünmek önemlidir. Tarayıcılar, bir 401 döndürülürse, kullanıcının yeniden kimlik doğrulaması yapması gerektiğini düşünür. Yani 401 geçersiz kimlik doğrulamayı, 403 ise izin eksikliğini temsil ediyor.

Bu mantık altında, kimlik doğrulamasından veya yetkilendirmeden bir hatanın döndürüleceği ve önemli ifadelerin kalın olduğu bazı durumlar.

  • Bir kaynak için kimlik doğrulaması gerekiyor ama hiçbir kimlik edildi belirtilen .

401 : İstemci kimlik bilgilerini belirtmelidir.

  • Belirtilen kimlik bilgileri geçersiz bir biçimde .

400 : Sözdizimi hataları her zaman 400 döndüreceğinden, bu ne 401 ne de 403'tür.

  • Belirtilen kimlik bilgileri bir kullanıcıya referans veriyor yok .

401 : İstemci geçerli kimlik bilgilerini belirtmelidir.

  • Belirtilen kimlik bilgileri vardır geçersiz ancak geçerli bir kullanıcı belirtmek (veya belirli bir kullanıcı gerekli değilse bir kullanıcı belirtmeyen).

401 : Yine, istemci geçerli kimlik bilgilerini belirtmelidir.

  • Belirtilen kimlik bilgileri var dolmuş .

401 : Bu, genel olarak geçersiz kimlik bilgilerine sahip olmakla aynıdır, bu nedenle istemci geçerli kimlik bilgilerini belirtmelidir.

  • Belirtilen kimlik bilgileri tamamen geçerlidir ancak yok yeterli özellikle kaynak , ancak daha fazla izne sahip kimlik bilgilerinin olabilmesi mümkündür.

403 : Geçerli kimlik bilgilerinin belirtilmesi, geçerli kimlik bilgileri zaten geçerli olduğundan, yalnızca izinleri olmadığından kaynağa erişim izni vermez.

  • Özellikle kaynak olduğunu erişilemez olursa olsun kimlik bilgilerinin.

403 : Bu, kimlik bilgilerine bakılmaksızın, geçerli kimlik bilgilerinin belirtilmesi yardımcı olamaz.

  • Belirtilen kimlik bilgileri tamamen geçerlidir ancak belirli bir istemci olan bloke bunları kullanmaktan.

403 : İstemci engellenirse, yeni kimlik bilgileri belirtmek hiçbir şey yapmaz.


4

İngilizcede:

401

Potansiyel olarak erişim izniniz var, ancak bu istek üzerine bazı nedenlerden dolayı reddedildiniz. Kötü bir şifre gibi mi? Tekrar deneyin, doğru istekle bunun yerine başarılı bir yanıt alacaksınız.

403

Asla izin verilmiyor. Adınız listede değil, hiç girmeyecek, uzaklaşmayacak, bir yeniden deneme isteği göndermeyin, her zaman reddedilecektir. Çekip gitmek.


1

Konuyla ilgili son RFC'ler ( 7231 ve 7235 ) göz önüne alındığında, kullanım durumu oldukça açık görünüyor (italik eklenmiştir):

  • 401 kimliği doğrulanmamıştır ("geçerli kimlik doğrulamasından yoksun"); yani 'Kim olduğunu bilmiyorum ya da senin olduğunu söylediğine güvenmiyorum.'

401 Yetkisiz

401 (Yetkisiz) durum kodu , hedef kaynak için geçerli kimlik doğrulama bilgilerinden yoksun olduğu için isteğin uygulanmadığını gösterir . 401 yanıtı oluşturan sunucunun, hedef kaynak için geçerli en az bir zorluk içeren bir WWW-Authenticate başlık alanı (Bölüm 4.1) göndermesi GEREKİR.

İstek kimlik doğrulama bilgilerini içeriyorsa, 401 yanıtı bu kimlik bilgileri için yetkinin reddedildiğini gösterir. Kullanıcı aracısı isteği yeni veya değiştirilmiş bir Yetkilendirme başlığı alanı ile tekrarlayabilir (Bölüm 4.2). 401 yanıtı, önceki yanıtla aynı sorguyu içeriyorsa ve kullanıcı aracısı en az bir kez kimlik doğrulama girişiminde bulunmuşsa, kullanıcı aracısı, genellikle ilgili teşhis bilgilerini içerdiği için ekteki temsili kullanıcıya sunmalıdır.

  • 403 yetkisiz kişiler içindir ("yetkilendirmeyi reddeder"); yani 'Kim olduğunuzu biliyorum, ancak bu kaynağa erişim izniniz yok.'

403 yasak

403 (Yasak) durum kodu, sunucunun isteği anladığını ancak yetkilendirmeyi reddettiğini gösterir . İsteğin neden yasaklandığını herkese açık hale getirmek isteyen bir sunucu, bu nedeni yanıt yükünde (varsa) açıklayabilir.

İstekte kimlik doğrulama bilgileri verildiyse, sunucu bunların erişim izni vermek için yetersiz olduğunu düşünür. İstemci, isteği aynı kimlik bilgileriyle otomatik olarak tekrarlamamalıdır. İstemci, isteği yeni veya farklı kimlik bilgileriyle tekrarlayabilir. Ancak, kimlik bilgileriyle ilgili olmayan nedenlerden dolayı bir talep yasaklanabilir.

Yasak bir hedef kaynağın mevcut varlığını "gizlemek" isteyen bir başlangıç ​​sunucusu, bunun yerine 404 (Bulunamadı) durum kodu ile yanıt verebilir.


2
1; bu pasajlar buradaki diğer cevaplarda zaten alıntılanmıştır ve sizinki yeni bir şey eklemez. Ayrımın ne olduğunu açıkça bilmiyorum ; iki kodu "geçerli kimlik doğrulamasından yoksun" ve "yetkilendirmeyi reddediyor" şeklinde özetlersiniz, ancak bu kısa açıklamalardan birinin diğerinin de uygulanacak şekilde yorumlanamadığı durumlarda geçerli olacağı hiçbir durumu düşünemiyorum.
Mark Amery

Burada birçok RFC'yi kapsayan ve suların çamurlanmasıyla düzenlenmiş ve güncellenmiş birçok cevap var. Ne authenticatedolduğunu ve ne authorizedolduğunu açıklamak için bir bağlantı dahil ve tüm açık RFC en böylece uygulama açık.
cjbarth

Düzenlemeniz, diğer birçok kişinin yorumuyla eşleşiyor gibi görünen iki kodu yorumladığınızı açıklığa kavuşturuyor. Ancak, kişisel olarak yorumun çok az anlamlı olduğuna inanıyorum. İfade kullanılması " Eğer kimlik doğrulama bilgileri verilmiştir" 403 açıklamasında hiçbir kimlik sağlanan olsalar bile, bir 403 uygun olabileceğini ima - yani "doğrulanmamış" olgusu. Bu arada, bana 401 tanımında yer alan "hedef kaynak için" ifadesinin en doğal yorumu , 401'in kimliği doğrulanmış ancak yetkilendirilmemiş bir kullanıcı için kullanılabileceğidir.
Mark Amery

-6

401'e 403'e karşı, bu birçok kez cevaplandı. Bu temelde bir 'uygulama' tartışması değil, bir 'HTTP istek ortamı' tartışmasıdır.

Kendi giriş rolleriniz (uygulama) ile ilgili bir soru var gibi görünüyor.

Bu durumda, HTTP Auth'u bir giriş sayfasına karşı (HTTP Auth ayarına bağlı değil) kullanmadığınız sürece, sadece oturum açmamak 401 veya 403 göndermek için yeterli değildir. Görünüşe göre bir dosyaya uygulama düzeyinde erişim için kendi giriş ekranınız (istenen kaynak yerine) mevcut olan bir "201 Oluşturuldu" arıyor olabilirsiniz. Bu diyor ki:

"Seni duydum, burada, ama bunu dene (görmene izin yok)"


Tam olarak ne yaratılıyor?
Grant Gryczan
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.