401 Unauthorized
Penggunaan
Ketika error 401 Unauthorized diterima, klien memahami bahwa kredensial login yang valid diperlukan sebelum akses ke sumber daya yang diminta diberikan. Klien harus login terlebih dahulu, atau menyertakan kredensial sebagai bagian dari permintaan HTTP. Kredensial yang sudah dikirim bersama permintaan juga tidak valid. Status ini berbeda dari 403 Forbidden, yang memberi tahu klien bahwa tindakan tersebut tidak diizinkan terlepas dari kredensial apa pun.
Catatan
Nama “Unauthorized” secara historis menyesatkan. 401 berarti klien belum terautentikasi: kredensial hilang atau tidak valid. Pengguna yang sudah terautentikasi tetapi tidak memiliki izin untuk melakukan tindakan yang diminta justru menerima 403 Forbidden. Penamaan ini bertahan sejak spesifikasi HTTP/1.0 yang asli.
Ketika server mengirim respons 401 Unauthorized, header respons WWW-Authenticate disertakan. Header ini memberi tahu klien metode otorisasi apa saja yang diizinkan. IANA memelihara daftar skema autentikasi standar, yang berbeda-beda dalam hal keamanan dan popularitas. Skema autentikasi yang umum:
Basic
Mengirimkan kredensial sebagai pasangan ID/password.
Bearer
Dikenal juga sebagai autentikasi token, bergantung pada token keamanan yang dibuat oleh server dan dikembalikan ke klien setelah login berhasil. Klien mengirim token tersebut pada permintaan berikutnya untuk mengakses sumber daya yang terlindungi. Server menyertakan detail error bila diperlukan: WWW-Authenticate: Bearer error=“invalid_token”, error_description=“Token expired”.
Digest
Protokol challenge-response yang digunakan untuk mengautentikasi permintaan terhadap sumber daya.
HOBA
Singkatan dari HTTP Origin-Bound Authentication, sebuah skema yang tidak mengharuskan server menyimpan password, sehingga skema ini tahan terhadap serangan phishing.
Mutual
Dikenal juga sebagai autentikasi dua arah, mirip dengan skema Basic dan Digest, dengan perbedaan bahwa server dijamin mengetahui password terenkripsi milik klien. Klien dan server saling mengautentikasi satu sama lain sebelum interaksi dilanjutkan.
AWS4-HMAC-SHA256
Algoritma autentikasi yang menyediakan informasi autentikasi ke Amazon Web Services AWS S3 API Reference.
Lebih dari satu metode autentikasi dapat ditentukan oleh server pada beberapa baris atau pada satu baris yang dipisahkan koma. Ketika klien memiliki kredensial yang diperlukan, kredensial tersebut dikirim menggunakan header permintaan Authorization.
Dampak SEO
Mesin pencari seperti Google tidak mengindeks URL yang mengembalikan status 401 Unauthorized. URL yang sebelumnya terindeks namun kini mengembalikan kode status ini akan dihapus dari hasil pencarian. Halaman yang mengembalikan kode ini tidak memboroskan crawl budget. Jangan gunakan 401 untuk memperlambat Googlebot. Hanya 429 yang menurunkan laju perayapan.
Contoh
Klien meminta sebuah sumber daya dan server merespons dengan 401 Unauthorized untuk menunjukkan bahwa sumber daya tersebut terlindungi. Server menyatakan dukungan untuk otorisasi Basic sekaligus Mutual. Klien merespons dengan pasangan username:password menggunakan protokol autentikasi Basic, yang ditentukan pada header Authorization. Server kemudian mengirimkan sumber daya yang diminta.
Permintaan awal
GET /documents/tech-news HTTP/1.1
Host: example.com
Respons awal
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Documents"
WWW-Authenticate: Mutual
Permintaan berikutnya, menyertakan Authorization
GET /documents/tech-news HTTP/1.1
Host: example.com
Authorization: Basic RXhhbXBsZTphaQ==
Respons akhir
HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Length: 25000
<PDF document included in message body>
Cara memperbaiki
401 Unauthorized berarti server memerlukan kredensial yang valid sebelum memberikan akses.
Periksa header WWW-Authenticate pada respons. Header ini menentukan skema autentikasi yang diharapkan (Basic, Bearer, Digest, dan sebagainya). Sesuaikan permintaan klien dengan skema yang dibutuhkan. Buka DevTools browser, pilih tab Network, lalu cari entri WWW-Authenticate di bawah Response Headers.
Verifikasi kredensial. Pastikan username dan password, API key, atau bearer token sudah benar. Satu salah ketik atau satu karakter spasi pada nilai header Authorization sudah cukup menyebabkan penolakan. Uji kredensial secara terpisah dengan curl -H “Authorization: Bearer
Pastikan token belum kedaluwarsa. Bearer token dan token sesi memiliki masa berlaku terbatas. Dekode JWT pada debugger lokal untuk memeriksa klaim exp. Buat ulang atau segarkan access token melalui penyedia autentikasi.
Sesuaikan format header Authorization dengan skemanya. Basic mengharapkan pasangan username:password yang dikodekan Base64. Bearer mengharapkan string token mentah. Format yang salah memicu 401 bahkan dengan kredensial yang valid. Kesalahan yang umum terjadi adalah menghilangkan prefiks skema (mengirim token saja tanpa Bearer ).
Buat ulang kredensial bila diperlukan. Rotasi API key atau minta token baru dari server otorisasi. Kredensial yang dicabut atau dibatalkan selalu menghasilkan status ini.
Bersihkan cache browser dan Cookie. Cookie sesi yang basi atau header Authorization yang tersimpan di cache berbenturan dengan kredensial yang telah diperbarui. Hapus data tersimpan lalu lakukan autentikasi ulang.
Periksa konfigurasi autentikasi di sisi server. File .htpasswd pada Apache, direktif auth_basic pada nginx, dan aturan AuthType pada .htaccess mengendalikan akses. Verifikasi path file kredensial, nama realm, dan keberadaan entri pengguna. Pada nginx:
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
Pada Apache:
AuthType Basic
AuthName "Restricted"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
Verifikasi scope OAuth dan klaim audience. Access token dengan kredensial yang benar tetapi scope yang salah, atau klaim aud yang tidak cocok dengan resource server, tetap memicu 401. Pastikan token tersebut diterbitkan untuk API yang dituju.
Referensi kode
.NET
HttpStatusCode.Unauthorized
Rust
http::StatusCode::UNAUTHORIZED
Rails
:unauthorized
Go
http.StatusUnauthorized
Symfony
Response::HTTP_UNAUTHORIZED
Python3.5+
http.HTTPStatus.UNAUTHORIZED
Java
java.net.HttpURLConnection.HTTP_UNAUTHORIZED
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_UNAUTHORIZED
Angular
@angular/common/http/HttpStatusCode.Unauthorized