서버 응답 401 Unauthorized
HTTP 상태 코드 401 (Unauthorized)
HTTP 상태 코드 401은 요청이 실패했음을 나타내며, 이는 대상 리소스에 대한 유효한 인증이 없기 때문입니다. 이 코드는 웹 개발에서 자주 발생하며, 특히 API 작업 시 개발자에게 혼란을 초래할 수 있습니다. 이 기사에서는 401 상태 코드의 발생 원인, 실용적인 예시 및 다양한 프로그래밍 언어에서의 해결 방법을 자세히 살펴보겠습니다.
401 상태 코드 발생 원인
- 인증 데이터 누락
- 잘못된 사용자 인증 정보
- 만료된 액세스 토큰
- 잘못된 인증 헤더 형식
실용적인 예시
-
예시 1: 보호된 리소스 접근 시 오류
상황 설명: 사용자가 인증이 필요한 API에 접근하려고 하지만 인증 정보를 제공하지 않습니다.
기대되는 행동: 서버는 401 상태 코드를 반환합니다.
-
예시 2: 잘못된 사용자 인증 정보
상황 설명: 사용자가 잘못된 로그인과 비밀번호로 요청을 보냅니다.
기대되는 행동: 서버는 401 상태 코드와 함께 인증 실패 메시지를 반환합니다.
-
예시 3: 만료된 토큰 사용
상황 설명: 사용자가 만료된 토큰을 사용하여 접근하려고 합니다.
기대되는 행동: 서버는 401 상태 코드와 함께 토큰 갱신 요청 메시지를 반환합니다.
다양한 프로그래밍 언어에서의 401 오류 해결 방법
JavaScript (Node.js)
jsonwebtoken 라이브러리를 사용하여 인증을 처리합니다.
const jwt = require('jsonwebtoken');
app.get('/protected', (req, res) => {
const token = req.headers['authorization'];
if (!token) {
return res.status(401).send('Unauthorized');
}
jwt.verify(token, 'secret_key', (err, user) => {
if (err) {
return res.status(401).send('Unauthorized');
}
res.send('Access granted');
});
});
Python (Flask)
Flask 라이브러리를 사용하여 인증 데이터를 확인합니다.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/protected')
def protected():
auth = request.authorization
if not auth or not (auth.username == 'user' and auth.password == 'pass'):
return jsonify({'message': 'Unauthorized'}), 401
return jsonify({'message': 'Access granted'})
PHP
헤더를 통해 인증을 처리합니다.
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('HTTP/1.0 401 Unauthorized');
echo 'Unauthorized';
exit;
} else {
if ($_SERVER['PHP_AUTH_USER'] !== 'user' || $_SERVER['PHP_AUTH_PW'] !== 'pass') {
header('HTTP/1.0 401 Unauthorized');
echo 'Unauthorized';
exit;
}
echo 'Access granted';
}
?>
HTTP 401 상태 코드 요약
위에서 설명한 바와 같이, HTTP 상태 코드 401은 인증이 필요한 리소스에 접근할 수 없음을 나타냅니다. 각 프로그래밍 언어에서 제공하는 방법으로 이 오류를 처리하고 해결하는 방법을 알아보았습니다. 이 코드를 정확히 이해하고 적절히 처리하는 것은 안전한 API 설계를 위해 필요합니다.
상황 | 상태 코드 | 설명 |
---|---|---|
인증 데이터 누락 | 401 | 사용자가 인증 정보를 제공하지 않음 |
잘못된 사용자 인증 정보 | 401 | 사용자가 잘못된 자격 증명으로 요청 |
만료된 토큰 사용 | 401 | 사용자가 만료된 토큰으로 접근 시도 |
추가 코드
코드 | 설명 |
---|---|
401.1 | 로그인 실패 - 잘못된 사용자 이름 또는 비밀번호로 인해 로그인 시도가 실패했습니다. |
401.2 | 서버 구성으로 인해 로그인 실패 - 서버의 인증 구성에 문제가 있습니다. |
401.3 | 리소스의 ACL로 인해 권한이 없습니다. NTFS 파일 시스템 권한으로 인해 액세스가 거부되었습니다. |
401.4 | 필터로 인해 권한이 실패했습니다. ISAPI 필터가 권한 문제로 인해 요청을 차단했습니다. |
401.5 | ISAPI/CGI 애플리케이션으로 인해 권한이 실패했습니다. ISAPI 또는 CGI 애플리케이션이 권한 문제로 인해 요청을 차단했습니다. |
401.501 | 액세스 거부: 동시 요청 속도 제한에 도달했습니다. 동일한 클라이언트 IP에서 동시 요청이 너무 많습니다. |
401.502 | 액세스 거부: 최대 요청 속도 제한에 도달했습니다. 클라이언트 IP가 지정된 시간 내에 최대 요청 수. |
401.503 | 액세스 거부: IP 주소 거부 - 클라이언트 IP 주소가 거부 목록에 있습니다. |
401.504 | 액세스 거부: 호스트 이름이 거부되었습니다 - 클라이언트 호스트 이름이 거부 목록에 있습니다. |