Untuk halaman web yang ada, tapi untuk yang satu pengguna yang tidak memiliki hak akses yang cukup, (mereka tidak masuk atau tidak menjadi milik yang tepat user group), bagaimana cara yang tepat dari respon HTTP untuk melayani? 401? 403? Sesuatu yang lain? Apa yang saya've baca pada masing-masing sejauh ini isn't sangat jelas perbedaan antara keduanya. Apa kasus penggunaan yang sesuai untuk masing-masing respon?
Penjelasan yang jelas dari Daniel Irvine:
Ada's masalah dengan 401 yang tidak Sah, HTTP status code untuk otentikasi kesalahan. Dan itu hanya itu: itu untuk otentikasi, tidak otorisasi. Menerima 401 respon server memberitahu anda, "anda tidak diotentikasi–baik tidak dikonfirmasi pada semua atau disahkan salah–tapi tolong reauthenticate dan coba lagi." Untuk membantu anda keluar, ini akan selalu menyertakan WWW-Authenticate header yang menggambarkan bagaimana untuk mengotentikasi.
Ini adalah sebuah respon yang umumnya dikembalikan oleh server web anda, tidak web anda aplikasi.
Itu juga sesuatu yang sangat sementara; server yang meminta anda untuk mencoba lagi.
Jadi, untuk otorisasi saya gunakan 403 Forbidden respon. Itu permanen, terikat untuk aplikasi saya, logika, dan itu lebih konkret respon dari 401.
Menerima 403 respon server bilang, "aku minta maaf. Aku tahu siapa anda–saya percaya apa yang anda katakan anda–tetapi anda hanya tidak memiliki izin untuk mengakses sumber daya ini. Mungkin jika anda meminta sistem administrator yang baik, anda akan mendapatkan izin. Tapi tolong jangan repot-repot saya lagi sampai anda kesulitan perubahan."
singkatnya, 401 yang tidak Sah respon harus digunakan untuk yang hilang atau buruk otentikasi, dan 403 Forbidden respon yang harus digunakan setelah itu, ketika pengguna dikonfirmasi tetapi tidak berwenang untuk melakukan operasi yang diminta pada sumber daya.
Lain baik format bergambar bagaimana kode status http yang harus digunakan.
Lihat RFC2616:
401 tidak Sah:
Jika permintaan sudah termasuk Otorisasi kredensial, maka 401 respon menunjukkan bahwa otorisasi telah menolak untuk kredensial tersebut.
403 Forbidden:
server memahami permintaan, tetapi menolak untuk memenuhinya.
Update
Dari kasus anda, tampaknya bahwa pengguna tidak dikonfirmasi. Aku akan kembali 401.
Ada jawaban lain yang hilang adalah bahwa hal itu harus dipahami bahwa Otentikasi dan Otorisasi dalam konteks RFC 2616 mengacu HANYA untuk HTTP Authentication protocol RFC 2617. Otentikasi dengan skema di luar RFC2617 tidak didukung di kode status HTTP dan tidak dipertimbangkan ketika memutuskan apakah untuk menggunakan 401 atau 403.
Tidak sah menunjukkan bahwa klien tidak RFC2617 dikonfirmasi dan server adalah memulai proses otentikasi. Dilarang menunjukkan bahwa klien adalah RFC2617 dikonfirmasi dan tidak memiliki otorisasi atau bahwa server tidak mendukung RFC2617 untuk sumber daya yang diminta.
Artinya jika anda memiliki anda sendiri roll-anda-sendiri proses login dan tidak pernah menggunakan Otentikasi HTTP, 403 selalu respon yang tepat dan 401 tidak boleh digunakan.
Dari RFC2616
10.4.2 401 tidak Sah
permintaan memerlukan otentikasi pengguna. Respon HARUS mencakup WWW-Otentikasi field header (bagian 14.47) mengandung tantangan yang berlaku untuk sumber daya yang diminta. Klien DAPAT mengulang permintaan dengan Otorisasi yang sesuai bidang header (bagian 14.8).
dan
10.4.4 403 Forbidden server memahami permintaan tetapi menolak untuk memenuhinya. Otorisasi tidak akan membantu dan permintaan TIDAK HARUS diulang.
Hal pertama yang harus diingat adalah bahwa "Otentikasi" dan "Otorisasi" dalam konteks dokumen ini merujuk secara khusus untuk Otentikasi HTTP protokol dari RFC 2617. Mereka tidak mengacu pada setiap roll-anda-sendiri protokol otentikasi anda mungkin telah dibuat menggunakan halaman login, dll. Saya akan menggunakan "login" untuk merujuk untuk otentikasi dan otorisasi oleh metode lain dari RFC2617
Jadi perbedaan yang nyata adalah tidak apa masalahnya atau bahkan jika ada solusi. Perbedaannya adalah apa yang mengharapkan server client harus dilakukan selanjutnya.
401 menunjukkan bahwa sumber daya yang tidak dapat diberikan, tetapi server adalah MEMINTA klien masuk melalui HTTP Otentikasi dan telah mengirimkan balasan header untuk memulai proses. Mungkin ada otorisasi yang akan memungkinkan akses ke sumber daya, mungkin ada yang tidak, tapi let's mencobanya dan melihat apa yang terjadi.
403 menunjukkan bahwa sumber daya yang tidak dapat disediakan dan ada, untuk pengguna saat ini, tidak ada cara untuk memecahkan masalah ini melalui RFC2617 dan tidak ada gunanya mencoba. Ini mungkin karena diketahui bahwa tidak ada tingkat otentikasi yang cukup (misalnya karena IP blacklist), tapi mungkin karena pengguna yang sudah diautentikasi dan tidak memiliki otoritas. Yang RFC2617 model adalah satu-user, satu-kredensial jadi kasus di mana pengguna mungkin memiliki set kedua kredensial yang bisa resmi dapat diabaikan. Itu tidak menunjukkan atau menyiratkan bahwa beberapa jenis halaman login atau non-RFC2617 protokol otentikasi yang mungkin atau mungkin tidak membantu - yang berada di luar RFC2616 standar dan definisi.
Sumber daya yang ada ? (jika pribadi itu sering diperiksa SETELAH auth check) | | TIDAK ADA | | YA v v 404 Adalah log-in ? (dikonfirmasi, alias memiliki sesi) atau | | 401 NO | | YA 403 | | v v 401 Dapat mengakses sumber daya ? (izin resmi) ? (404 tidak mengungkapkan) | | atau 301 TIDAK ada | | YA mengarahkan | | untuk login v v 403 OK 200, 301, ... (atau 404: tidak mengungkapkan)
Pemeriksaan yang biasanya dilakukan dalam urutan ini:
SAH: kode Status (401) menunjukkan bahwa permintaan membutuhkan otentikasi, biasanya ini berarti pengguna harus log-in (sesi). Pengguna/agen yang tidak diketahui oleh server. Dapat mengulangi dengan kredensial lainnya. CATATAN: Ini adalah membingungkan seperti ini seharusnya bernama 'yang tidak diautentikasi' bukan 'tidak sah'. Hal ini juga dapat terjadi setelah login jika sesi berakhir. Kasus khusus: Dapat digunakan sebagai pengganti 404 untuk menghindari mengungkapkan keberadaan atau non-keberadaan sumber daya (kredit @gingerCodeNinja)
FORBIDDEN: kode Status (403) menunjukkan server memahami permintaan tetapi menolak untuk memenuhinya. User/agent dikenal oleh server tetapi memiliki cukup kredensial. Mengulangi permintaan tidak akan bekerja, kecuali kredensial berubah, yang sangat tidak mungkin dalam jangka waktu yang pendek. Kasus khusus: Dapat digunakan sebagai pengganti 404 untuk menghindari mengungkapkan keberadaan atau non-keberadaan sumber daya (kredit @gingerCodeNinja)
TIDAK DITEMUKAN: kode Status (404) menunjukkan bahwa sumber daya yang diminta tidak tersedia. User/agent diketahui, tetapi server tidak akan mengungkapkan apa-apa tentang sumber daya, tidak seolah-olah itu tidak ada. Berulang tidak akan bekerja. Ini adalah khusus penggunaan 404 (github apakah itu misalnya).
Menurut RFC 2616 (HTTP/1.1) 403 dikirim bila:
server memahami permintaan, tetapi menolak untuk memenuhinya. Otorisasi tidak akan membantu dan permintaan TIDAK HARUS diulang. Jika permintaan metode tidak KEPALA dan server keinginan untuk membuat publik mengapa permintaan belum terpenuhi, itu HARUS menjelaskan alasan penolakan tersebut dalam entitas. Jika server tidak ingin membuat informasi ini tersedia untuk klien, kode status 404 (Tidak Ditemukan) dapat digunakan sebagai pengganti
Dengan kata lain, jika klien BISA mendapatkan akses ke sumber daya dengan otentikasi, 401 harus dikirim.
Asumsi HTTP authentication (WWW-Authenticate dan Otorisasi header) di gunakan, jika otentikasi sebagai user lain akan memberikan akses ke sumber daya yang diminta, kemudian 401 tidak Sah sehingga harus dikembalikan.
403 Dilarang digunakan bila akses ke sumber daya ini dilarang untuk semua orang atau dibatasi untuk jaringan tertentu atau hanya diperbolehkan melalui SSL, apa pun asalkan tidak berkaitan dengan otentikasi HTTP.
Jika otentikasi HTTP tidak di gunakan dan layanan cookie otentikasi berbasis skema sebagai norma adalah saat ini, maka 403 atau 404 harus dikembalikan.
Mengenai 401, ini adalah dari RFC 7235 (Hypertext Transfer Protocol (HTTP/1.1): Otentikasi):
3.1. 401 tidak Sah
401 (tidak Sah) kode status ini menunjukkan bahwa permintaan telah tidak pernah diterapkan karena kurang valid kredensial otentikasi untuk target sumber daya. Asal server HARUS mengirimkan WWW-Otentikasi field header (Bagian 4.4) mengandung setidaknya satu tantangan yang berlaku untuk target sumber daya. Jika permintaan termasuk kredensial otentikasi, maka 401 respon menunjukkan bahwa otorisasi telah menolak untuk mereka kredensial. Klien DAPAT mengulang permintaan dengan yang baru atau diganti Otorisasi bidang header (Bagian 4.1). Jika 401 respon mengandung tantangan yang sama seperti sebelumnya, respon, dan agen pengguna telah berusaha otentikasi setidaknya sekali, maka agen pengguna HARUS hadir tertutup representasi untuk pengguna, karena biasanya berisi relevan informasi diagnostik.
Semantik 403 (dan 404) telah berubah dari waktu ke waktu. Ini adalah dari tahun 1999 (RFC 2616):
10.4.4 403 Forbidden
server memahami permintaan, tetapi menolak untuk memenuhinya. Otorisasi tidak akan membantu dan permintaan TIDAK HARUS diulang. Jika permintaan metode tidak KEPALA dan server keinginan untuk membuat publik mengapa permintaan belum terpenuhi, itu HARUS menggambarkan alasan untuk penolakan dalam entitas. Jika server tidak ingin membuat informasi ini tersedia untuk klien, kode status 404 (Tidak Ditemukan) dapat digunakan sebagai pengganti.
Di tahun 2014, RFC 7231 (Hypertext Transfer Protocol (HTTP/1.1): Semantik dan Konten) berubah makna 403:
6.5.3. 403 Forbidden
403 (Forbidden) status kode ini menunjukkan bahwa server memahami permintaan tetapi menolak untuk mengizinkan itu. Server yang keinginan untuk membuat publik mengapa permintaan telah dilarang dapat menjelaskan alasan itu dalam respon muatan (jika ada).
Jika kredensial otentikasi yang disediakan dalam permintaan, server menganggap mereka tidak cukup untuk memberikan akses. Klien TIDAK HARUS secara otomatis mengulangi permintaan yang sama kredensial. Klien DAPAT mengulang permintaan dengan yang baru atau berbeda kredensial. Namun, permintaan mungkin akan dilarang untuk alasan tidak terkait dengan kepercayaan.
asal server yang ingin "menyembunyikan" saat ini keberadaan dilarang target sumber daya bukan DAPAT merespon dengan kode status 404 (Tidak Ditemukan).
Dengan demikian, 403 (atau 404) sekarang mungkin maksud apa-apa. Memberikan mandat baru mungkin bisa membantu... atau mungkin tidak.
Saya percaya alasan mengapa hal ini telah berubah adalah RFC 2616 diasumsikan HTTP otentikasi akan digunakan ketika dalam latihan hari ini's Web membangun aplikasi kustom skema otentikasi misalnya dengan menggunakan bentuk-bentuk dan cookies.
Ini adalah sebuah pertanyaan yang lebih tua, tapi salah satu opsi yang pernah benar-benar dibesarkan adalah untuk mengembalikan 404. Dari perspektif keamanan, tertinggi sebagai jawaban menderita potensi kebocoran informasi kerentanan. Katakanlah, misalnya, bahwa halaman web yang aman yang dimaksud adalah suatu sistem halaman admin, atau mungkin lebih umum, adalah catatan dalam sistem yang pengguna doesn't memiliki akses ke. Idealnya anda tidak't ingin pengguna berbahaya bahkan tahu bahwa di sana's halaman / catatan yang ada, apalagi yang mereka don't memiliki akses. Ketika saya'm membangun sesuatu seperti ini, aku'll mencoba untuk merekam unauthenticate / permintaan yang tidak sah di internal log, tapi kembali 404.
OWASP memiliki beberapa informasi tentang bagaimana seorang penyerang dapat menggunakan informasi ini sebagai bagian dari serangan.
Pertanyaan ini diajukan beberapa waktu lalu, tapi orang-orang's berpikir pindah.
Bagian 6.5.3 dalam rancangan ini (ditulis oleh Fielding dan Reschke) memberikan kode status 403 makna yang sedikit berbeda untuk satu didokumentasikan dalam RFC 2616.
Hal ini mencerminkan apa yang terjadi di otentikasi & otorisasi skema yang digunakan oleh sejumlah populer web-server dan kerangka kerja.
I've menekankan sedikit yang saya pikir adalah yang paling menonjol.
6.5.3. 403 Forbidden
403 (Forbidden) status kode ini menunjukkan bahwa server memahami permintaan tetapi menolak untuk mengizinkan itu. Server yang ingin membuat publik mengapa permintaan telah dilarang dapat menjelaskan alasan itu dalam respon muatan (jika ada).
Jika kredensial otentikasi yang disediakan dalam permintaan, server menganggap mereka tidak cukup untuk memberikan akses. Klien TIDAK HARUS mengulangi permintaan dengan mandat yang sama. Klien DAPAT mengulang permintaan dengan yang baru atau kredensial yang berbeda. Namun, permintaan mungkin akan dilarang untuk alasan yang tidak terkait dengan kepercayaan.
asal server yang ingin "menyembunyikan" saat ini keberadaan dilarang target sumber daya bukan DAPAT merespon dengan kode status 404 (Tidak Ditemukan).
Apapun konvensi yang anda gunakan, yang penting adalah untuk memberikan keseragaman di situs / API.
Jika apache membutuhkan otentikasi (via .htaccess
), dan anda menekan Cancel
, ia akan merespon dengan 401 Diperlukan Otorisasi
Jika nginx menemukan file, tetapi tidak memiliki hak akses (user/group) untuk membaca/mengakses, itu akan merespon dengan 403 Forbidden
Arti 1: Perlu mengotentikasi
permintaan memerlukan otentikasi pengguna. ...
Arti 2: Otentikasi cukup
... Jika permintaan sudah termasuk Otorisasi kredensial, maka 401 respon menunjukkan bahwa otorisasi telah menolak untuk kredensial tersebut. ...
Artinya: tidak Berhubungan dengan otentikasi
... Otorisasi tidak akan membantu ...
Informasi lebih lanjut:
server memahami permintaan, tetapi menolak untuk memenuhinya.
Ini HARUS menjelaskan alasan penolakan di badan
kode status 404 (Tidak Ditemukan) dapat digunakan sebagai pengganti
(Jika server ingin menjaga informasi ini dari klien)
mereka tidak masuk atau tidak termasuk dalam kelompok pengguna yang tepat
Anda telah menyatakan dua kasus yang berbeda; masing-masing kasus harus memiliki respon yang berbeda-beda:
Catatan pada RFC berdasarkan komentar yang diterima untuk jawaban ini:
Jika pengguna tidak login mereka un-dikonfirmasi, HTTP setara dengan yang lebih 401 dan menyesatkan disebut tidak Sah dalam RFC. Sebagai bagian 10.4.2 menyatakan untuk 401 yang tidak Sah:
"permintaan mengharuskan pengguna otentikasi."
Jika anda're yang tidak berkepentingan, 401 adalah respon yang benar. Namun jika anda're yang tidak sah, dalam semantik benar rasa, 403 adalah respon yang benar.
Ini adalah sederhana di kepala saya dari mana-mana di sini, jadi:
401: yang Anda butuhkan HTTP basic auth untuk melihat ini.
403: Anda dapat't melihat ini, dan dasar HTTP auth won't membantu.
Jika pengguna hanya perlu log in menggunakan situs anda's standar HTML form login, 401 tidak akan sesuai karena itu spesifik untuk HTTP basic auth.
Saya don't sarankan menggunakan 403 untuk menolak akses ke hal-hal seperti /includes
, karena sejauh web yang bersangkutan, sumber-sumber tersebut, don't ada, dan oleh karena itu harus 404.
Ini daun 403 sebagai "anda harus login".
Dengan kata lain, 403 berarti "sumber daya ini memerlukan beberapa bentuk auth lain dari HTTP basic auth".
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2
Saya pikir itu adalah penting untuk mempertimbangkan bahwa, untuk browser, 401 memulai dialog otentikasi bagi pengguna untuk memasukkan kredensial baru, sementara 403 tidak. Browser berpikir bahwa, jika 401 dikembalikan, maka pengguna harus re-authenticate. Jadi 401 singkatan yang tidak valid otentikasi sementara 403 singkatan kurangnya izin.
Berikut ini adalah beberapa kasus di bawah logika itu dimana kesalahan akan dikembalikan dari otentikasi atau otorisasi, dengan frase penting tebal.
401: klien harus menentukan identitasnya.
400: Yang's tidak 401 atau 403, sebagai kesalahan sintaks harus selalu kembali 400.
401: klien harus menentukan kredensial yang valid.
401: Lagi, klien harus menentukan kredensial yang valid.
401: Ini adalah hampir sama dengan memiliki kredensial tidak valid pada umumnya, sehingga klien harus menentukan kredensial yang valid.
403: Menetapkan kredensial yang valid tidak akan memberikan akses ke sumber daya, seperti yang saat ini identitasnya sudah berlaku tetapi hanya tidak memiliki izin.
403: Ini adalah terlepas dari identitasnya, sehingga menetapkan kredensial yang valid tidak bisa membantu.
403: Jika klien diblokir, menentukan mandat baru tidak akan melakukan apa-apa.
Mengingat terbaru RFC's pada masalah (7231 dan 7235) penggunaan-kasus tampaknya cukup jelas (huruf miring ditambahkan):
401 yang tidak Sah
401 (tidak Sah) kode status ini menunjukkan bahwa permintaan tersebut tidak diterapkan karena tidak memiliki otentikasi yang valid kredensial untuk target sumber daya. Server menghasilkan 401 respon HARUS mengirim WWW-Otentikasi field header (Bagian 4.1) mengandung setidaknya satu tantangan yang berlaku untuk target sumber daya.
Jika permintaan termasuk kredensial otentikasi, maka 401 respon menunjukkan bahwa otorisasi telah menolak untuk mereka kredensial. Agen pengguna DAPAT mengulang permintaan dengan yang baru atau diganti Otorisasi bidang header (Bagian 4.2). Jika 401 respon mengandung tantangan yang sama seperti sebelumnya, respon, dan agen pengguna telah berusaha otentikasi setidaknya sekali, maka agen pengguna HARUS hadir tertutup representasi untuk pengguna, karena biasanya berisi relevan informasi diagnostik.
403 Forbidden
403 (Forbidden) status kode ini menunjukkan bahwa server dipahami permintaan tapi menolak untuk mengotorisasi itu. Server yang ingin membuat publik mengapa permintaan telah dilarang dapat menggambarkan bahwa alasan di respon muatan (jika ada).
Jika kredensial otentikasi yang disediakan dalam permintaan, server menganggap mereka tidak cukup untuk memberikan akses. Klien TIDAK HARUS secara otomatis mengulangi permintaan yang sama kredensial. Klien DAPAT mengulang permintaan dengan yang baru atau berbeda kredensial. Namun, permintaan mungkin akan dilarang untuk alasan terkait dengan kepercayaan.
asal server yang ingin "menyembunyikan" saat ini keberadaan dilarang target sumber daya bukan DAPAT merespon dengan kode status 404 (Tidak Ditemukan).
Dalam kasus 401 vs 403, ini sudah dijawab berkali-kali. Ini pada dasarnya adalah sebuah 'permintaan HTTP lingkungan' debat, bukan 'aplikasi' perdebatan.
Tampaknya ada pertanyaan tentang roll-anda-sendiri-masalah login (aplikasi).
Dalam hal ini, tidak hanya yang masuk tidak cukup untuk mengirim 401 atau 403, kecuali jika anda menggunakan HTTP Auth vs login halaman (tidak terikat untuk menetapkan HTTP Auth). Kedengarannya seperti anda mungkin akan mencari "201 Dibuat", dengan roll-anda-sendiri-layar login hadir (bukan sumber daya yang diminta) untuk aplikasi-tingkat akses ke file. Ini kata:
"saya mendengar anda, it's di sini, tapi coba ini bukan (anda tidak diizinkan untuk melihatnya)"