Untuk halaman web yang ada, tetapi yang pengguna tidak memiliki hak istimewa yang memadai (mereka tidak masuk atau tidak termasuk kelompok pengguna yang tepat), apa tanggapan HTTP yang tepat untuk dilayani?
401 Unauthorized
?
403 Forbidden
?
Sesuatu yang lain
Apa yang saya baca pada masing-masing sejauh ini tidak begitu jelas tentang perbedaan antara keduanya. Kasus penggunaan apa yang sesuai untuk setiap respons?
http-headers
http-status-code-403
http-status-codes
http-status-code-401
http-response-codes
VirtuosiMedia
sumber
sumber
Jawaban:
Penjelasan yang jelas dari Daniel Irvine :
Format gambar bagus lainnya tentang bagaimana kode status http harus digunakan.
sumber
Lihat RFC2616 :
401 Tidak Resmi:
403 Dilarang:
Memperbarui
Dari kasus penggunaan Anda, tampaknya pengguna tidak diautentikasi. Saya akan kembali 401.
Sunting: RFC2616 sudah usang, lihat RFC7231 dan RFC7235 .
sumber
Sesuatu yang tidak dijawab oleh jawaban lain adalah harus dipahami bahwa Otentikasi dan Otorisasi dalam konteks RFC 2616 merujuk HANYA pada protokol HTTP Authentication dari RFC 2617. Otentikasi dengan skema di luar RFC2617 tidak didukung dalam kode status HTTP dan tidak dianggap sebagai kode saat memutuskan apakah akan menggunakan 401 atau 403.
Singkat dan Terse
Tidak sah menunjukkan bahwa klien tidak dikonfirmasi dengan RFC2617 dan server memulai proses otentikasi. Forbidden menunjukkan bahwa klien diautentikasi RFC2617 dan tidak memiliki otorisasi atau bahwa server tidak mendukung RFC2617 untuk sumber daya yang diminta.
Berarti jika Anda memiliki proses masuk roll-Anda-sendiri dan tidak pernah menggunakan Otentikasi HTTP, 403 selalu merupakan respons yang tepat dan 401 tidak boleh digunakan.
Detail dan Mendalam
Dari RFC2616
dan
Hal pertama yang perlu diingat adalah bahwa "Otentikasi" dan "Otorisasi" dalam konteks dokumen ini merujuk secara khusus ke protokol Autentikasi HTTP dari RFC 2617. Mereka tidak merujuk ke protokol otentikasi roll-your-sendiri yang mungkin Anda buat menggunakan halaman login, dll. Saya akan menggunakan "login" untuk merujuk ke otentikasi dan otorisasi dengan metode selain RFC2617
Jadi perbedaan sebenarnya bukanlah apa masalahnya atau bahkan jika ada solusinya. Perbedaannya adalah apa yang server harapkan untuk dilakukan klien selanjutnya.
401 menunjukkan bahwa sumber daya tidak dapat disediakan, tetapi server MEMINTA bahwa klien login melalui Otentikasi HTTP dan telah mengirim header balasan untuk memulai proses. Mungkin ada otorisasi yang akan mengizinkan akses ke sumber daya, mungkin tidak ada, tapi mari kita coba dan lihat apa yang terjadi.
403 menunjukkan bahwa sumber daya tidak dapat disediakan dan ada, untuk pengguna saat ini, tidak ada cara untuk menyelesaikan ini melalui RFC2617 dan tidak ada gunanya mencoba. Ini mungkin karena diketahui bahwa tingkat otentikasi tidak memadai (misalnya karena daftar hitam IP), tetapi mungkin karena pengguna sudah diautentikasi dan tidak memiliki wewenang. Model RFC2617 adalah satu-pengguna, satu-kredensial sehingga kasus di mana pengguna mungkin memiliki set kedua kredensial yang dapat diotorisasi dapat diabaikan. Itu tidak menyarankan atau menyiratkan bahwa semacam halaman login atau protokol otentikasi non-RFC2617 lain mungkin atau mungkin tidak membantu - yang berada di luar standar dan definisi RFC2616.
Sunting: RFC2616 sudah usang, lihat RFC7231 dan RFC7235 .
sumber
WWW-Authenticate
tajuk? Sekalipun peramban tidak mendukungnya, aplikasi Bereaksi saya dapat ...Cek biasanya dilakukan dalam urutan ini:
TIDAK DIKENAL : Kode status (401) yang menunjukkan bahwa permintaan memerlukan otentikasi , biasanya ini berarti pengguna harus masuk (sesi). Pengguna / agen tidak dikenal oleh server. Dapat diulangi dengan kredensial lain. CATATAN: Ini membingungkan karena ini seharusnya dinamai 'tidak terauthentikasi' alih-alih 'tidak sah'. Ini juga dapat terjadi setelah masuk jika sesi berakhir. Kasus khusus: Dapat digunakan sebagai ganti 404 untuk menghindari mengungkapkan ada atau tidak adanya sumber daya (kredit @gingerCodeNinja)
DILARANG : Kode status (403) yang mengindikasikan server memahami permintaan tersebut tetapi menolak untuk memenuhinya. Pengguna / agen yang dikenal oleh server tetapi tidak memiliki kredensial yang memadai . Permintaan berulang tidak akan berfungsi, kecuali kredensial berubah, yang sangat tidak mungkin dalam rentang waktu singkat. Kasus khusus: Dapat digunakan sebagai ganti 404 untuk menghindari mengungkapkan ada atau tidak adanya sumber daya (kredit @gingerCodeNinja)
TIDAK DITEMUKAN : Kode status (404) yang menunjukkan bahwa sumber daya yang diminta tidak tersedia. Pengguna / agen diketahui tetapi server tidak akan mengungkapkan apa pun tentang sumber daya, apakah seolah-olah tidak ada. Mengulang tidak akan berhasil. Ini adalah penggunaan khusus 404 (github melakukannya misalnya).
Seperti yang disebutkan oleh @ChrisH ada beberapa opsi untuk pengalihan 3xx (301, 302, 303, 307 atau tidak mengarahkan sama sekali dan menggunakan 401):
sumber
no reveal
kadangkala dapat dideteksi melalui perbedaan waktu yang halus dan tidak boleh dilihat sebagai fitur keamanan, itu mungkin hanya memperlambat penyerang atau membantu sedikit dengan privasi.Menurut RFC 2616 (HTTP / 1.1) 403 dikirim ketika:
Dengan kata lain, jika klien BISA mendapatkan akses ke sumber daya dengan mengotentikasi, 401 harus dikirim.
sumber
An 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).
Dengan asumsi otentikasi HTTP ( WWW-Otentikasi dan header Otorisasi ) sedang digunakan , jika otentikasi sebagai pengguna lain akan memberikan akses ke sumber daya yang diminta, maka 401 Tidak Sah harus dikembalikan.
403 Forbidden digunakan ketika akses ke sumber daya dilarang untuk semua orang atau terbatas pada jaringan tertentu atau hanya diizinkan melalui SSL, apa pun asalkan tidak ada hubungannya dengan otentikasi HTTP.
Jika otentikasi HTTP tidak digunakan dan layanan skema otentikasi berbasis cookie seperti norma saat ini, maka 403 atau 404 harus dikembalikan.
Mengenai 401, ini dari RFC 7235 (Protokol Transfer Hiperteks (HTTP / 1.1): Otentikasi):
Semantik 403 (dan 404) telah berubah seiring waktu. Ini dari tahun 1999 (RFC 2616):
Pada 2014 RFC 7231 (Protokol Transfer Hiperteks (HTTP / 1.1): Semantik dan Konten) mengubah arti 403:
Jadi, 403 (atau 404) sekarang mungkin berarti tentang apa pun. Memberikan kredensial baru mungkin membantu ... atau mungkin juga tidak.
Saya percaya alasan mengapa hal ini berubah adalah RFC 2616 diasumsikan otentikasi HTTP akan digunakan ketika dalam praktiknya aplikasi Web saat ini membangun skema otentikasi khusus menggunakan misalnya formulir dan cookie.
sumber
Ini adalah pertanyaan yang lebih tua, tetapi satu opsi yang tidak pernah benar-benar diajukan adalah mengembalikan 404. Dari perspektif keamanan, jawaban dengan suara terbanyak menderita dari potensi kerentanan kebocoran informasi . Katakan, misalnya, bahwa halaman web aman yang dimaksud adalah halaman admin sistem, atau mungkin lebih umum, adalah catatan dalam sistem yang tidak dapat diakses oleh pengguna. Idealnya Anda tidak ingin pengguna jahat tahu bahwa ada halaman / catatan di sana, apalagi mereka tidak memiliki akses. Ketika saya sedang membangun sesuatu seperti ini, saya akan mencoba untuk mencatat permintaan yang tidak diautentikasi / tidak sah dalam log internal, tetapi mengembalikan 404.
OWASP memiliki beberapa informasi lebih lanjut tentang bagaimana penyerang dapat menggunakan informasi jenis ini sebagai bagian dari serangan.
sumber
sumber
Pertanyaan ini diajukan beberapa waktu yang lalu, tetapi pemikiran orang-orang terus berjalan.
Bagian 6.5.3 dalam konsep ini (ditulis oleh Fielding dan Reschke) memberikan kode status 403 arti yang sedikit berbeda dengan yang didokumentasikan dalam RFC 2616 .
Ini mencerminkan apa yang terjadi dalam skema otentikasi & otorisasi yang digunakan oleh sejumlah server dan kerangka kerja populer.
Saya telah menekankan sedikit yang menurut saya paling menonjol.
Apa pun konvensi yang Anda gunakan, yang penting adalah memberikan keseragaman di seluruh situs / API Anda.
sumber
TL; DR
Contoh Praktis
Jika apache memerlukan otentikasi (via
.htaccess
), dan Anda menekanCancel
, itu akan merespons dengan a401 Authorization Required
Jika nginx menemukan file, tetapi tidak memiliki hak akses (pengguna / grup) untuk membaca / mengaksesnya, ia akan merespons
403 Forbidden
RFC (2616 Bagian 10)
401 Tidak Resmi (10.4.2)
Artinya 1: Perlu diautentikasi
Artinya 2: Otentikasi tidak cukup
403 Forbidden (10.4.4)
Artinya: Tidak terkait dengan otentikasi
Keterangan lebih lanjut:
(Jika server ingin menyimpan informasi ini dari klien)
sumber
Anda telah menyatakan dua kasus berbeda; setiap kasus harus memiliki respons yang berbeda:
Catatan tentang RFC berdasarkan komentar yang diterima untuk jawaban ini:
Jika pengguna tidak login mereka tidak diautentikasi, HTTP setara yang 401 dan menyesatkan disebut Tidak Diotorisasi dalam RFC. Seperti bagian 10.4.2 menyatakan untuk 401 Tidak Sah :
Jika Anda tidak diauthentikasi, 401 adalah respons yang benar. Namun jika Anda tidak sah, dalam arti semantik yang benar, 403 adalah respons yang benar.
sumber
Inilah artinya:
401 : Pengguna tidak (dengan benar) diautentikasi, sumber / halaman ini memerlukan otentikasi
403 : Pengguna diautentikasi, tetapi peran atau izinnya tidak memungkinkan untuk mengakses sumber daya yang diminta, misalnya pengguna bukan administrator dan halaman yang diminta untuk administrator
sumber
Ini lebih sederhana di kepala saya daripada di mana pun di sini, jadi:
401: Anda perlu autentikasi dasar HTTP untuk melihatnya.
403: Anda tidak dapat melihat ini, dan autentikasi dasar HTTP tidak akan membantu.
Jika pengguna hanya perlu login menggunakan formulir login HTML standar situs Anda, 401 tidak akan sesuai karena khusus untuk autentikasi dasar HTTP.
Saya tidak merekomendasikan menggunakan 403 untuk menolak akses ke hal-hal seperti
/includes
, karena sejauh menyangkut web, sumber daya itu tidak ada sama sekali dan karenanya harus 404.Ini meninggalkan 403 sebagai "Anda harus masuk".
Dengan kata lain, 403 berarti "sumber daya ini membutuhkan beberapa bentuk auth selain HTTP basic auth".
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2
sumber
Saya pikir penting untuk mempertimbangkan bahwa, untuk browser, 401 memulai dialog otentikasi bagi pengguna untuk memasukkan kredensial baru, sedangkan 403 tidak. Peramban berpikir bahwa, jika 401 dikembalikan, maka pengguna harus mengautentikasi ulang. Jadi 401 adalah singkatan dari otentikasi tidak valid sementara 403 adalah singkatan dari kurangnya izin.
Berikut adalah beberapa kasus di bawah logika di mana kesalahan akan dikembalikan dari otentikasi atau otorisasi, dengan frasa penting yang dicetak tebal.
401 : Klien harus menentukan kredensial.
400 : Itu bukan 401 atau 403, karena kesalahan sintaks harus selalu menghasilkan 400.
401 : Klien harus menentukan kredensial yang valid.
401 : Sekali lagi, klien harus menentukan kredensial yang valid.
401 : Ini secara praktis sama dengan memiliki kredensial tidak valid secara umum, sehingga klien harus menentukan kredensial yang valid.
403 : Menentukan kredensial yang valid tidak akan memberikan akses ke sumber daya, karena kredensial saat ini sudah valid tetapi hanya tidak memiliki izin.
403 : Ini terlepas dari kredensial, jadi menentukan kredensial yang valid tidak dapat membantu.
403 : Jika klien diblokir, menentukan kredensial baru tidak akan melakukan apa-apa.
sumber
Dalam Bahasa Inggris:
401
403
sumber
Mengingat RFC terbaru tentang masalah ini ( 7231 dan 7235 ) kasus penggunaan tampak cukup jelas (cetak miring ditambahkan):
sumber
authenticated
itu dan apaauthorized
dan meninggalkan semua RFC yang sudah ketinggalan zaman sehingga aplikasinya jelas.Dalam kasus 401 vs 403, ini telah dijawab berkali-kali. Ini pada dasarnya adalah debat 'Lingkungan permintaan HTTP', bukan debat 'aplikasi'.
Tampaknya ada pertanyaan tentang masalah roll-your-own-login Anda (aplikasi).
Dalam hal ini, tidak login saja tidak cukup untuk mengirim 401 atau 403, kecuali jika Anda menggunakan HTTP Auth vs halaman login (tidak terikat dengan pengaturan HTTP Auth). Sepertinya Anda mungkin mencari "201 Created", dengan layar roll-your-own-login Anda (bukan sumber daya yang diminta) untuk akses tingkat aplikasi ke file. Ini mengatakan:
"Aku mendengarmu, ada di sini, tapi coba ini sebagai gantinya (kamu tidak diizinkan melihatnya)"
sumber