HTTP 401 Unauthorized
인증 필요: 서버가 요청자를 알지 못하거나, 자격 증명이 더 이상 유효하지 않습니다.
HTTP 401의 의미
HTTP 401 Unauthorized는 요청에 유효한 인증 정보가 없어 거부되었다는 의미입니다. 이름과 달리 이는 인가(무엇을 할 수 있는지)가 아니라 인증(누구인지)에 관한 문제이며, 인가 문제는 403 Forbidden에 해당합니다.
스펙을 준수하는 401 응답에는 인증 방법을 설명하는 WWW-Authenticate 헤더가 포함됩니다. 예를 들어 토큰 기반 API에는 Bearer, 전통적인 HTTP 인증에는 Basic이 사용됩니다.
401 오류의 일반적인 원인
- 인증 정보가 전혀 전송되지 않은 경우(Authorization 헤더나 세션 쿠키 누락).
- 토큰이 만료되었거나, 폐기되었거나, 형식이 잘못된 경우 — API에서 가장 흔한 원인입니다.
- 잘못된 인증 방식(Bearer 토큰이 필요한 곳에 API 키를 보낸 경우).
- 로그아웃된 세션: 탭이 열려 있는 동안 쿠키가 만료되었거나 삭제된 경우.
- 시간 오차로 인해 수명이 짧은 JWT가 도착 시점에 이미 만료된 것처럼 보이는 경우.
사용자로서 해결하는 방법
- 다시 로그인하세요 — 세션이 만료되었을 가능성이 가장 높습니다.
- 계속 반복된다면 해당 사이트의 쿠키를 삭제하고 새로 로그인하세요.
- 접근하려는 URL이 계정 권한이 없는 관리자 페이지나 스테이징 영역은 아닌지 확인하세요.
개발자로서 해결하는 방법
- 만료된 토큰을 갱신하거나 재발급하고, API 클라이언트에 자동 토큰 갱신 기능을 구현하세요.
- Authorization 헤더를 정확히 예상되는 형식으로 보내세요(“Bearer <token>” — 단어와 공백이 중요합니다).
- 인증 정보가 없거나 유효하지 않을 때만 401을 반환하고, 유효한 사용자가 권한이 없을 때는 403을 반환하여 클라이언트가 올바르게 대응할 수 있도록 하세요.
- JWT의 “exp” 검증이 예상치 못하게 실패한다면 서버 시간 동기화(NTP)를 확인하세요.
응답 예시
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="api", error="invalid_token", error_description="expired"
자주 묻는 질문
401과 403의 차이는 무엇인가요?
401은 서버가 사용자에 대한 유효한 인증 정보를 가지고 있지 않다는 의미이므로 로그인하거나 토큰을 갱신해야 합니다. 403은 서버가 사용자가 누구인지 알면서도 여전히 거부한다는 의미입니다.
유효한 토큰인데도 왜 401이 발생하나요?
일반적인 원인으로는 만료된 토큰, 잘못된 헤더 형식, 다른 환경이나 대상(audience)을 위해 발급된 토큰, 서버 시간 오차 등이 있습니다.
로그인 실패 시 401을 반환해야 하나요?
API의 경우 설명이 담긴 본문과 함께 그렇습니다. 웹 로그인 폼은 보통 200을 반환하면서 페이지에 오류 메시지를 표시하는 방식을 사용합니다.