Error HTTP 401 Unauthorized: Arti dan Cara Mengatasinya

Apa Itu Error 401 Unauthorized?
Error 401 Unauthorized adalah kode status HTTP yang berarti server memerlukan autentikasi untuk resource yang diminta, tetapi permintaan tidak menyertakan kredensial atau kredensial yang diberikan tidak valid.
Spesifikasi HTTP (RFC 9110, Section 15.5.2) mendefinisikannya sebagai: permintaan tidak memiliki kredensial autentikasi yang valid untuk resource target. Server yang menghasilkan respons 401 harus menyertakan header WWW-Authenticate yang menunjukkan skema autentikasi yang harus digunakan.
Secara sederhana: server bertanya "siapa Anda?" sebelum mengizinkan akses. Anda tidak memberikan identifikasi apa pun, atau identifikasi yang Anda berikan salah.
Tampilan Error 401
Error 401 tampil berbeda tergantung pada server, browser, dan aplikasi. Berikut pesan-pesan paling umum yang akan Anda temui.
401 Unauthorized — pesan respons HTTP standar
HTTP Error 401 – Unauthorized — umum di aplikasi IIS dan ASP.NET
401 Authorization Required — halaman error default Nginx
Error 401 — bentuk singkat di bilah alamat browser
Access Denied: Invalid credentials — halaman error kustom aplikasi
Authentication Required — popup browser untuk autentikasi Basic/Digest
Invalid API Key — umum dalam respons REST API
Token Expired — token JWT atau OAuth perlu diperbarui
Ketika server mengirim 401, sebagian besar browser akan menampilkan popup login yang meminta username dan password. Jika server menggunakan autentikasi berbasis token (seperti API), Anda akan melihat error tersebut di body respons JSON.
401 vs 403: Apa Perbedaannya?
Kode status 401 dan 403 sering tertukar, bahkan oleh developer berpengalaman. Perbedaannya sederhana: 401 berarti "Saya tidak tahu siapa Anda" sementara 403 berarti "Saya tahu siapa Anda, tetapi Anda tidak diizinkan."
| Aspek | 401 Unauthorized | 403 Forbidden |
|---|---|---|
| Makna inti | Autentikasi gagal atau tidak ada | Otorisasi ditolak |
| Pertanyaan server | "Siapa Anda?" | "Anda tidak memiliki izin" |
| Kredensial | Tidak diberikan atau tidak valid | Valid tetapi tidak cukup |
| Apakah mencoba lagi bisa membantu? | Ya — berikan kredensial yang benar | Tidak — Anda tidak memiliki izin |
| Header WWW-Authenticate | Wajib ada dalam respons | Tidak disertakan |
| Contoh skenario | Mengakses panel admin tanpa login | Login sebagai viewer, mencoba menghapus postingan |
Aturan praktisnya: jika memberikan username dan password (atau API key) yang benar dapat memperbaikinya, server harus mengembalikan 401. Jika pengguna sudah terautentikasi tetapi tidak memiliki akses ke resource tersebut, server harus mengembalikan 403 Forbidden.
Penyebab Umum Error 401
Memahami mengapa error 401 terjadi tergantung pada apakah Anda pengguna biasa, developer yang memanggil API, atau administrator server. Berikut penyebab paling sering.
Username atau password salah — penyebab paling dasar, terutama setelah reset password
Token autentikasi kedaluwarsa — token JWT, token akses OAuth, dan cookie sesi semuanya memiliki waktu kedaluwarsa
Header Authorization tidak ada — permintaan tidak menyertakan kredensial sama sekali
API key tidak valid — key telah dicabut, dirotasi, atau disalin dengan salah
Skema auth salah — server mengharapkan Bearer token tetapi menerima Basic auth, atau sebaliknya
Perbedaan waktu (clock skew) — validasi JWT gagal ketika jam server dan klien tidak sinkron lebih dari beberapa menit
CORS preflight menghapus header — browser menghapus header Authorization dari permintaan preflight OPTIONS
Cache browser usang — browser mengirim cookie sesi yang sudah kedaluwarsa dari cache alih-alih meminta yang baru
Kesalahan konfigurasi reverse proxy — Nginx atau Apache menghapus header Authorization sebelum meneruskan ke backend
Kredensial dibatasi atau dicabut — terlalu banyak percobaan gagal memicu penguncian akun
Cara Mengatasi 401 sebagai Pengunjung
Jika Anda menemui error 401 di situs web yang ingin Anda akses, masalahnya hampir selalu berkaitan dengan kredensial login Anda. Ikuti langkah-langkah berikut secara berurutan.
1. Periksa Kredensial Login Anda
Penyebab paling umum error 401 adalah kredensial yang salah. Jika situs menampilkan popup atau formulir login, periksa kembali username dan password Anda.
Kesalahan umum: Caps Lock aktif, Anda menggunakan password lama (terutama setelah reset baru-baru ini), atau Anda login ke akun yang salah. Jika Anda memiliki password manager, biarkan fitur auto-fill mengisi kredensial untuk menghindari kesalahan ketik.
2. Hapus Cache dan Cookie Browser
Browser Anda mungkin mengirim cookie sesi yang sudah kedaluwarsa atau token autentikasi dari cache. Menghapusnya akan memaksa browser meminta kredensial baru dari server.
Chrome: Settings → Privacy → Clear browsing data → Cookies + Cached images
Firefox: Settings → Privacy → Clear Data → Cookies + Cache
Safari: Settings → Privacy → Manage Website Data → Remove All
Edge: Settings → Privacy → Clear browsing data → Cookies + CacheSetelah menghapus, tutup browser sepenuhnya (bukan hanya tab), buka kembali, dan navigasikan ke halaman tersebut. Anda akan melihat prompt login yang baru.
3. Coba Mode Incognito atau Privat
Buka URL di jendela incognito (Chrome) atau privat (Firefox/Safari). Ini melewati semua cookie yang di-cache, ekstensi, dan kredensial tersimpan.
Jika halaman berfungsi di mode incognito tetapi tidak di browser biasa, masalahnya adalah cookie yang di-cache atau ekstensi browser yang mengganggu autentikasi. Nonaktifkan ekstensi satu per satu untuk menemukan penyebabnya.
4. Verifikasi URL
Pastikan Anda mengunjungi URL yang benar. Beberapa server mengembalikan 401 untuk path yang memerlukan autentikasi, meskipun path itu sendiri salah. Anda mungkin mencoba mengakses area terbatas yang tidak seharusnya Anda kunjungi.
Periksa apakah ada versi publik dari halaman tersebut di URL yang berbeda. Misalnya, example.com/admin/ mungkin mengembalikan 401 sementara example.com/ dapat diakses secara publik.
Cara Mengatasi 401 sebagai Developer
Bagi developer yang bekerja dengan API, error 401 biasanya berkaitan dengan header Authorization, format token, atau siklus hidup kredensial. Berikut perbaikan yang paling umum.
5. Verifikasi Header Authorization
Kesalahan developer yang paling umum adalah header Authorization yang salah format. Header WWW-Authenticate dalam respons server memberitahu Anda skema mana yang diharapkan.
Pastikan header Anda sesuai dengan format yang diperlukan. Skema yang paling umum adalah Bearer (untuk token) dan Basic (untuk username:password yang di-encode dalam Base64).
# Bearer token authentication (most APIs)
curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." https://api.example.com/data
# Basic authentication (username:password in Base64)
curl -u "username:password" https://api.example.com/data
# Equivalent to:
curl -H "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=" https://api.example.com/data
# Common mistakes that cause 401:
# Missing "Bearer " prefix: Authorization: eyJhbGci... ← WRONG
# Extra space: Authorization: Bearer eyJ... ← WRONG
# Wrong scheme: Authorization: Basic eyJhbGci... ← WRONGSelalu periksa header WWW-Authenticate dalam respons 401. Header ini memberitahu Anda persis apa yang diharapkan server. Gunakan HTTP Headers tool DNS Robot untuk memeriksa respons lengkap.
6. Periksa Validitas API Key
API key dapat berhenti berfungsi secara diam-diam karena beberapa alasan: key telah dirotasi, akun terkait telah diturunkan, key telah mencapai batas rate limit, atau key dibatasi untuk endpoint yang berbeda dari yang Anda panggil.
Verifikasi bahwa key Anda masih aktif di dashboard provider. Banyak API (Google, AWS, Stripe) memungkinkan Anda menguji key langsung dari konsol mereka.
# Test if your API key is valid
curl -I -H "Authorization: Bearer YOUR_API_KEY" https://api.example.com/me
# 200 = key is valid
# 401 = key is invalid or expired
# 403 = key is valid but lacks permission for this endpoint
# Check common API key issues:
# 1. Trailing whitespace in .env file: API_KEY="abc123 " ← trailing space
# 2. Wrong environment: using test key on production
# 3. Missing prefix: some APIs need "sk_live_" prefix7. Tangani Kedaluwarsa dan Refresh Token
Token JWT dan token akses OAuth memiliki masa berlaku terbatas — biasanya 15 menit hingga 24 jam. Ketika kedaluwarsa, setiap panggilan API mengembalikan 401 sampai Anda mendapatkan token baru.
Perbaikannya tergantung pada alur autentikasi Anda. OAuth 2.0 menggunakan refresh token untuk mendapatkan token akses baru tanpa autentikasi ulang. Sistem berbasis JWT biasanya memerlukan login baru.
# Decode a JWT token to check its expiry (works on macOS and Linux)
echo "eyJhbGciOiJIUzI1NiIs..." | cut -d'.' -f2 | base64 -d 2>/dev/null | python3 -m json.tool
# Look for "exp" field — it's a Unix timestamp
# Compare with current time: date +%s
# OAuth 2.0 refresh token flow
curl -X POST https://auth.example.com/token \
-d "grant_type=refresh_token" \
-d "refresh_token=YOUR_REFRESH_TOKEN" \
-d "client_id=YOUR_CLIENT_ID"8. Perbaiki Masalah CORS Preflight
Ketika browser mengirim permintaan cross-origin dengan header Authorization, browser terlebih dahulu mengirim permintaan preflight OPTIONS. Browser secara otomatis menghapus header Authorization dari preflight ini. Jika server Anda memerlukan auth pada permintaan OPTIONS, server mengembalikan 401 sebelum permintaan sebenarnya terkirim.
Perbaikannya: konfigurasikan server Anda untuk mengizinkan permintaan OPTIONS tanpa autentikasi pada endpoint yang mengaktifkan CORS.
# Nginx — allow OPTIONS requests without auth
location /api/ {
if ($request_method = OPTIONS) {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
add_header Access-Control-Allow-Headers "Authorization, Content-Type";
add_header Access-Control-Max-Age 86400;
return 204;
}
# Normal auth for other methods
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}Cara Mengatasi 401 sebagai Pemilik Situs
Jika pengunjung atau pengguna Anda melaporkan error 401, masalahnya ada pada konfigurasi autentikasi server Anda. Lakukan pemeriksaan berikut.
9. Tinjau Konfigurasi Autentikasi Server
Pastikan autentikasi hanya diaktifkan pada rute yang memerlukannya. Kesalahan umum adalah memproteksi seluruh direktori atau situs ketika hanya path tertentu yang harus memerlukan login.
Pada Nginx, periksa direktif auth_basic Anda. Pada Apache, periksa direktif AuthType dan Require. Pada Node.js/Express, periksa urutan middleware Anda — middleware autentikasi yang ditempatkan sebelum route handler akan memblokir semuanya.
# Nginx — WRONG: protects everything, including public pages
server {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
# All pages now require login — including your homepage!
}
# Nginx — CORRECT: only protect admin routes
server {
location / {
# Public — no auth required
}
location /admin/ {
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}10. Periksa Aturan Autentikasi .htaccess
Pada server Apache, file .htaccess dapat mengaktifkan autentikasi Basic atau Digest untuk direktori tertentu. Jika file .htaccess ada di direktori publik dengan direktif AuthType, setiap pengunjung akan mendapat prompt login 401.
Periksa file .htaccess di direktori yang terpengaruh dan semua direktori induk — Apache menerapkan aturan dari setiap .htaccess di sepanjang path.
# Find all .htaccess files with auth rules
find /var/www/html -name '.htaccess' -exec grep -l 'AuthType\|AuthUserFile\|Require valid-user' {} \;
# Example .htaccess that causes 401 for everyone:
# AuthType Basic
# AuthName "Restricted Area"
# AuthUserFile /etc/apache2/.htpasswd
# Require valid-user
# Fix: remove auth lines from public directories,
# or move them to the specific /admin/.htaccess only11. Perbaiki Penghapusan Header oleh Reverse Proxy
Jika aplikasi Anda berada di belakang Nginx, Apache, atau load balancer, proxy mungkin menghapus header Authorization sebelum meneruskan permintaan ke backend Anda. Ini adalah salah satu penyebab 401 yang paling membuat frustrasi karena klien mengirim kredensial yang benar tetapi server tidak pernah menerimanya.
Periksa konfigurasi proxy Anda untuk memastikan header Authorization diteruskan.
# Nginx reverse proxy — pass Authorization header to backend
location /api/ {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Authorization $http_authorization; # ← Critical!
proxy_pass_header Authorization; # ← Also add this
}
# Apache reverse proxy
<Location /api/>
ProxyPass http://localhost:3000/api/
ProxyPassReverse http://localhost:3000/api/
RequestHeader set Authorization "expr=%{HTTP:Authorization}" # Pass auth header
</Location>Debugging Error 401 dengan HTTP Headers
Cara tercepat untuk mendiagnosis error 401 adalah memeriksa header respons. Header WWW-Authenticate dalam respons server memberitahu Anda metode autentikasi apa yang diperlukan.
Gunakan HTTP Headers tool DNS Robot atau curl dari terminal untuk melihat respons lengkap.
# Check the WWW-Authenticate header in the 401 response
curl -I https://api.example.com/protected-endpoint
# Typical 401 response headers:
# HTTP/1.1 401 Unauthorized
# WWW-Authenticate: Bearer realm="api", error="invalid_token"
# WWW-Authenticate: Basic realm="Admin Area"
# Content-Type: application/json
# The WWW-Authenticate header tells you:
# - The auth scheme (Bearer, Basic, Digest)
# - The realm (which area is protected)
# - The error reason (invalid_token, expired, etc.)Perhatikan baik-baik header WWW-Authenticate. Jika tertulis Bearer, Anda memerlukan token. Jika tertulis Basic, Anda memerlukan username dan password. Jika menyertakan error=invalid_token, token Anda ada tetapi formatnya salah atau sudah kedaluwarsa. Satu header ini biasanya memberitahu Anda persis apa yang salah.
Apakah Error 401 Mempengaruhi SEO?
Error 401 pada halaman publik akan merugikan SEO Anda. Ketika Googlebot menemui 401, ia tidak dapat meng-crawl halaman tersebut dan akhirnya akan menghapusnya dari indeks.
Namun, error 401 pada halaman yang memang memerlukan autentikasi (panel admin, dashboard pengguna, endpoint API) adalah hal yang normal. Google mengharapkan halaman-halaman ini dilindungi dan tidak akan menghukum situs Anda karenanya.
Masalah muncul ketika error 401 muncul pada halaman yang seharusnya dapat diakses publik. Ini biasanya terjadi ketika middleware autentikasi salah dikonfigurasi atau ketika CDN/reverse proxy secara tidak tepat memerlukan kredensial pada rute publik.
Cara Mencegah Error 401
Pencegahan menghemat waktu debugging di kemudian hari. Ikuti praktik-praktik berikut untuk meminimalkan error 401 pada aplikasi dan situs web Anda.
Implementasikan auto-refresh token — gunakan refresh token untuk mendapatkan token akses baru secara otomatis sebelum kedaluwarsa
Atur scope auth yang tepat — hanya lindungi rute yang benar-benar memerlukan autentikasi, biarkan halaman publik tetap terbuka
Gunakan pesan error yang jelas — kembalikan body error JSON yang informatif bersama 401, bukan hanya kode status
Pantau kegagalan auth — atur alert untuk lonjakan respons 401, yang mungkin mengindikasikan masalah kredensial atau serangan
Sinkronkan jam server — gunakan NTP untuk menjaga semua server dalam selisih beberapa detik dari UTC, mencegah penolakan JWT akibat perbedaan waktu
Uji dengan [HTTP Headers tool](/http-headers) — verifikasi secara rutin bahwa halaman publik mengembalikan 200 dan halaman yang dilindungi mengembalikan 401 sesuai harapan
Dokumentasikan skema auth Anda — jelaskan format header Authorization yang diharapkan dalam dokumentasi API Anda
Tangani CORS preflight — selalu izinkan permintaan OPTIONS tanpa autentikasi pada endpoint API
Periksa header respons HTTP Anda
Gunakan HTTP Headers tool gratis dari DNS Robot untuk memeriksa status respons, header, dan informasi WWW-Authenticate dari URL mana pun secara instan.
Try HTTP HeadersFrequently Asked Questions
Error 401 Unauthorized berarti server memerlukan autentikasi tetapi permintaan Anda tidak menyertakan kredensial yang valid. Anda tidak memberikan username/password atau API key, atau yang Anda berikan salah atau sudah kedaluwarsa.