HTTP 401 Unauthorized 오류: 의미와 해결 방법 완벽 가이드

401 Unauthorized 오류란 무엇인가?
401 Unauthorized 오류는 서버가 요청된 리소스에 대해 인증을 요구하지만, 요청에 인증 정보가 포함되지 않았거나 제공된 인증 정보가 유효하지 않음을 나타내는 HTTP 상태 코드입니다.
HTTP 사양(RFC 9110, 섹션 15.5.2)에서는 "요청에 대상 리소스에 대한 유효한 인증 자격 증명이 없다"고 정의합니다. 401 응답을 생성하는 서버는 사용할 인증 체계를 나타내는 WWW-Authenticate 헤더를 반드시 포함해야 합니다.
간단히 말해, 서버가 접근을 허용하기 전에 "당신은 누구입니까?"라고 묻고 있는 것입니다. 신원 정보를 제공하지 않았거나, 제공한 신원 정보가 잘못되었다는 의미입니다.
401 오류의 표시 형태
401 오류는 서버, 브라우저, 애플리케이션에 따라 다르게 표시됩니다. 다음은 가장 자주 볼 수 있는 메시지입니다.
401 Unauthorized — 표준 HTTP 응답 메시지
HTTP Error 401 – Unauthorized — IIS 및 ASP.NET 애플리케이션에서 자주 보이는 형태
401 Authorization Required — Nginx 기본 오류 페이지
Error 401 — 브라우저 주소창에 나타나는 간단한 형태
Access Denied: Invalid credentials — 사용자 지정 애플리케이션 오류 페이지
Authentication Required — Basic/Digest 인증 시 브라우저 팝업 프롬프트
Invalid API Key — REST API 응답에서 자주 보이는 형태
Token Expired — JWT 또는 OAuth 토큰 갱신이 필요한 경우
서버가 401을 보내면 대부분의 브라우저는 사용자 이름과 비밀번호를 요청하는 로그인 팝업을 표시합니다. 서버가 토큰 기반 인증(API 등)을 사용하는 경우에는 JSON 응답 본문에 오류가 표시됩니다.
401과 403의 차이점은?
401과 403 상태 코드는 숙련된 개발자도 자주 혼동합니다. 차이는 간단합니다. 401은 "당신이 누구인지 모릅니다"를 의미하고, 403은 "당신이 누구인지 알지만 접근이 허용되지 않습니다"를 의미합니다.
| 항목 | 401 Unauthorized | 403 Forbidden |
|---|---|---|
| 핵심 의미 | 인증 실패 또는 미제공 | 인가 거부 |
| 서버의 질문 | "당신은 누구입니까?" | "접근 권한이 없습니다" |
| 인증 정보 | 미제공 또는 유효하지 않음 | 유효하지만 권한 부족 |
| 재시도로 해결 가능? | 예 — 올바른 인증 정보를 제공 | 아니오 — 권한이 없습니다 |
| WWW-Authenticate 헤더 | 응답에 필수 | 포함되지 않음 |
| 시나리오 예시 | 로그인하지 않고 관리자 패널에 접근 | 뷰어로 로그인 후 게시물 삭제 시도 |
실용적인 규칙: 올바른 사용자 이름과 비밀번호(또는 API 키)를 제공하면 해결되는 경우 서버는 401을 반환해야 합니다. 사용자가 이미 인증되었지만 해당 리소스에 대한 접근 권한이 없는 경우 서버는 403 Forbidden을 반환해야 합니다.
401 오류의 일반적인 원인
401 오류가 발생하는 원인은 일반 사용자, API 개발자, 서버 관리자 중 어떤 입장인지에 따라 다릅니다. 다음은 가장 자주 발생하는 원인입니다.
잘못된 사용자 이름 또는 비밀번호 — 특히 비밀번호 재설정 후 가장 기본적인 원인
인증 토큰 만료 — JWT 토큰, OAuth 액세스 토큰, 세션 쿠키 모두 만료 시간이 있습니다
Authorization 헤더 누락 — 요청에 인증 정보가 전혀 포함되지 않은 경우
유효하지 않은 API 키 — 키가 취소, 교체되었거나 잘못 복사된 경우
잘못된 인증 체계 — 서버는 Bearer 토큰을 기대하지만 Basic 인증이 전송된 경우(또는 그 반대)
클럭 스큐(시간 차이) — 서버와 클라이언트의 시간이 몇 분 이상 차이 나면 JWT 검증이 실패합니다
CORS 프리플라이트 헤더 제거 — 브라우저가 프리플라이트 OPTIONS 요청에서 Authorization 헤더를 제거합니다
오래된 브라우저 캐시 — 브라우저가 새로운 인증을 요청하는 대신 캐시된 만료 세션 쿠키를 전송합니다
리버스 프록시 구성 오류 — Nginx 또는 Apache가 백엔드로 전달하기 전에 Authorization 헤더를 제거합니다
속도 제한 또는 인증 정보 취소 — 로그인 실패가 너무 많아 계정이 잠긴 경우
방문자를 위한 401 오류 해결 방법
웹사이트에 접속하려고 할 때 401 오류가 표시되면 거의 항상 로그인 인증 정보와 관련된 문제입니다. 다음 단계를 순서대로 따라 하십시오.
1. 로그인 인증 정보 확인하기
401 오류의 가장 흔한 원인은 단순히 잘못된 인증 정보입니다. 사이트에 로그인 팝업이나 양식이 표시되면 사용자 이름과 비밀번호를 다시 확인하십시오.
흔한 실수: Caps Lock이 켜져 있거나, 이전 비밀번호를 사용하고 있거나(특히 최근 재설정 후), 잘못된 계정으로 로그인하려고 하는 경우입니다. 비밀번호 관리자를 사용하고 있다면 오타를 방지하기 위해 자동 입력 기능을 사용하십시오.
2. 브라우저 캐시 및 쿠키 삭제하기
브라우저가 만료된 세션 쿠키나 캐시된 인증 토큰을 전송하고 있을 수 있습니다. 이를 삭제하면 브라우저가 서버에서 새로운 인증 정보를 요청하게 됩니다.
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 + Cache삭제 후 브라우저를 완전히 닫고(탭만 닫지 말고), 다시 열어서 페이지로 이동하십시오. 새로운 로그인 프롬프트가 표시될 것입니다.
3. 시크릿 모드 또는 프라이빗 모드로 시도하기
시크릿(Chrome) 또는 프라이빗(Firefox/Safari) 창에서 URL을 여십시오. 이렇게 하면 캐시된 모든 쿠키, 확장 프로그램, 저장된 인증 정보를 우회합니다.
시크릿 모드에서는 페이지가 작동하지만 일반 브라우저에서는 작동하지 않는다면 캐시된 쿠키나 인증을 방해하는 브라우저 확장 프로그램이 원인입니다. 확장 프로그램을 하나씩 비활성화하여 원인을 찾으십시오.
4. URL 확인하기
올바른 URL에 접속하고 있는지 확인하십시오. 일부 서버는 경로 자체가 잘못된 경우에도 인증이 필요한 경로에 대해 401을 반환합니다. 접근하면 안 되는 제한된 영역에 접근하려고 하고 있을 수 있습니다.
다른 URL에 페이지의 공개 버전이 있는지 확인하십시오. 예를 들어, example.com/admin/은 401을 반환하지만 example.com/은 공개적으로 접근 가능할 수 있습니다.
개발자를 위한 401 오류 해결 방법
API를 다루는 개발자의 경우 401 오류는 대개 Authorization 헤더, 토큰 형식, 또는 인증 정보의 수명 주기와 관련이 있습니다. 다음은 가장 일반적인 해결 방법입니다.
5. Authorization 헤더 확인하기
개발자가 가장 흔히 범하는 실수는 Authorization 헤더의 형식 오류입니다. 서버의 WWW-Authenticate 응답 헤더가 어떤 인증 체계가 기대되는지 정확히 알려줍니다.
헤더가 요구되는 형식과 일치하는지 확인하십시오. 가장 일반적인 체계는 Bearer(토큰용)와 Basic(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... ← WRONG반드시 401 응답의 WWW-Authenticate 헤더를 확인하십시오. 서버가 무엇을 기대하는지 정확히 알 수 있습니다. DNS Robot의 HTTP Headers 도구를 사용하여 전체 응답을 검사할 수 있습니다.
6. API 키 유효성 확인하기
API 키는 여러 가지 이유로 눈에 띄지 않게 작동을 멈출 수 있습니다. 키가 교체되었거나, 연결된 계정이 다운그레이드되었거나, 키가 속도 제한에 도달했거나, 호출하는 엔드포인트와 다른 범위로 설정되어 있을 수 있습니다.
공급자의 대시보드에서 키가 아직 유효한지 확인하십시오. 많은 API(Google, AWS, Stripe)에서는 콘솔에서 직접 키를 테스트할 수 있습니다.
# 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. 토큰 만료 및 갱신 처리하기
JWT 토큰과 OAuth 액세스 토큰은 제한된 수명이 있으며, 일반적으로 15분에서 24시간입니다. 만료되면 새 토큰을 얻을 때까지 모든 API 호출이 401을 반환합니다.
해결 방법은 인증 흐름에 따라 다릅니다. OAuth 2.0은 리프레시 토큰을 사용하여 재인증 없이 새 액세스 토큰을 얻을 수 있습니다. JWT 기반 시스템에서는 일반적으로 새로 로그인해야 합니다.
# 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. CORS 프리플라이트 문제 해결하기
브라우저가 Authorization 헤더를 포함한 교차 출처 요청을 보낼 때 먼저 프리플라이트 OPTIONS 요청을 보냅니다. 브라우저는 이 프리플라이트에서 Authorization 헤더를 자동으로 제거합니다. 서버가 OPTIONS 요청에 인증을 요구하면 실제 요청이 전송되기 전에 401이 반환됩니다.
해결 방법: CORS가 활성화된 엔드포인트에서 인증 없이 OPTIONS 요청을 허용하도록 서버를 구성하십시오.
# 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;
}사이트 관리자를 위한 401 오류 해결 방법
방문자나 사용자가 401 오류를 보고하는 경우 서버의 인증 구성에 문제가 있습니다. 다음 항목을 순서대로 확인하십시오.
9. 서버 인증 구성 검토하기
인증이 필요한 경로에만 인증이 활성화되어 있는지 확인하십시오. 흔한 실수는 특정 경로만 로그인이 필요한데 디렉토리 전체나 사이트 전체를 보호하는 것입니다.
Nginx에서는 auth_basic 지시문을 확인하십시오. Apache에서는 AuthType과 Require 지시문을 확인하십시오. Node.js/Express에서는 미들웨어 순서를 확인하십시오 — 인증 미들웨어가 라우트 핸들러 앞에 배치되면 모든 요청이 차단됩니다.
# 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. .htaccess 인증 규칙 확인하기
Apache 서버에서는 .htaccess 파일로 특정 디렉토리에 Basic 또는 Digest 인증을 활성화할 수 있습니다. 공개 디렉토리에 AuthType 지시문이 포함된 .htaccess 파일이 있으면 모든 방문자에게 401 로그인 프롬프트가 표시됩니다.
영향을 받는 디렉토리와 모든 상위 디렉토리에 .htaccess 파일이 있는지 확인하십시오 — Apache는 경로의 모든 .htaccess 규칙을 적용합니다.
# 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. 리버스 프록시 헤더 제거 문제 해결하기
앱이 Nginx, Apache 또는 로드 밸런서 뒤에 있는 경우 프록시가 백엔드로 요청을 전달하기 전에 Authorization 헤더를 제거할 수 있습니다. 이것은 가장 답답한 401 원인 중 하나입니다. 클라이언트는 올바른 인증 정보를 보내지만 서버가 이를 수신하지 못하기 때문입니다.
프록시 구성에서 Authorization 헤더가 올바르게 전달되고 있는지 확인하십시오.
# 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>HTTP 헤더를 사용한 401 오류 디버깅
401 오류를 진단하는 가장 빠른 방법은 응답 헤더를 검사하는 것입니다. 서버 응답의 WWW-Authenticate 헤더가 어떤 인증 방법이 필요한지 정확히 알려줍니다.
DNS Robot의 HTTP Headers 도구 또는 터미널에서 curl을 사용하여 전체 응답을 확인하십시오.
# 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.)WWW-Authenticate 헤더를 주의 깊게 확인하십시오. Bearer라고 표시되면 토큰이 필요합니다. Basic이면 사용자 이름과 비밀번호가 필요합니다. error=invalid_token이 포함되어 있으면 토큰은 존재하지만 형식이 잘못되었거나 만료되었습니다. 이 하나의 헤더로 대개 무엇이 잘못되었는지 정확히 알 수 있습니다.
401 오류가 SEO에 영향을 미치는가?
공개 페이지에서 401 오류가 발생하면 SEO에 악영향을 미칩니다. Googlebot이 401을 만나면 페이지를 크롤링할 수 없으며, 결국 색인에서 제거합니다.
그러나 인증이 필요한 페이지(관리자 패널, 사용자 대시보드, API 엔드포인트)에서의 401 오류는 완전히 정상입니다. Google은 이러한 페이지가 보호되어야 한다고 기대하며 사이트에 페널티를 부과하지 않습니다.
문제는 공개적으로 접근 가능해야 하는 페이지에 401 오류가 나타나는 경우입니다. 이는 일반적으로 인증 미들웨어의 구성 오류나 CDN/리버스 프록시가 공개 경로에 잘못 인증을 요구하는 경우에 발생합니다.
401 오류를 방지하는 방법
예방이 나중의 디버깅을 줄여줍니다. 애플리케이션과 웹사이트에서 401 오류를 최소화하기 위해 다음 사항을 실천하십시오.
토큰 자동 갱신 구현 — 리프레시 토큰을 사용하여 만료되기 전에 자동으로 새 액세스 토큰을 얻습니다
적절한 인증 범위 설정 — 진정으로 인증이 필요한 경로만 보호하고 공개 페이지는 열어 둡니다
명확한 오류 메시지 반환 — 상태 코드만이 아닌 유용한 JSON 오류 본문을 401과 함께 반환합니다
인증 실패 모니터링 — 401 응답 급증에 대한 알림을 설정합니다(인증 정보 문제나 공격을 나타낼 수 있음)
서버 시계 동기화 — NTP를 사용하여 모든 서버를 UTC 기준 몇 초 이내로 유지하여 JWT 클럭 스큐 거부를 방지합니다
[HTTP Headers 도구](/http-headers)로 테스트 — 공개 페이지가 200을, 보호된 페이지가 예상대로 401을 반환하는지 정기적으로 확인합니다
인증 체계 문서화 — 예상되는 Authorization 헤더 형식을 API 문서에 명확히 합니다
CORS 프리플라이트 처리 — API 엔드포인트에서 항상 인증 없이 OPTIONS 요청을 허용합니다
HTTP 응답 헤더를 확인하세요
DNS Robot의 무료 HTTP Headers 도구를 사용하여 모든 URL의 응답 상태, 헤더, WWW-Authenticate 정보를 즉시 검사할 수 있습니다.
Try HTTP HeadersFrequently Asked Questions
401 Unauthorized 오류는 서버가 인증을 요구하지만 요청에 유효한 인증 정보가 포함되지 않았음을 의미합니다. 사용자 이름/비밀번호 또는 API 키를 제공하지 않았거나, 제공한 정보가 잘못되었거나 만료되었을 수 있습니다.