HTTPQUERY
Bahasa Indonesia

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 ” untuk menyingkirkan masalah di tingkat aplikasi.

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