개요[편집 / 원본 편집]
HTTP 401(Unauthorized)과 403(Forbidden) 상태 코드는 모두 클라이언트의 요청에 대한 접근 거부를 나타내는 4xx 오류 상태 코드이다. 그러나 두 상태 코드는 접근이 거부된 이유와 해결 방법에서 중요한 차이를 보인다. 이 문서에서는 두 상태 코드의 차이점과 각각의 적절한 사용 사례를 설명한다.
401 Unauthorized[편집 / 원본 편집]
의미[편집 / 원본 편집]
- 정의: 요청한 리소스에 대한 인증(Authentication)이 필요함을 나타낸다.
- 핵심 특징: 클라이언트가 아직 인증되지 않았거나, 제공된 인증 정보가 유효하지 않음을 의미한다.
사용 예시[편집 / 원본 편집]
- 로그인이 필요한 API 엔드포인트 접근
- 만료된 인증 토큰 사용
- 잘못된 API 키 사용
구현 특징[편집 / 원본 편집]
- 응답 헤더: WWW-Authenticate 헤더를 포함해야 한다.
- 예시 응답:
HTTP/1.1 401 Unauthorized WWW-Authenticate: Basic realm="Application"
해결 방법[편집 / 원본 편집]
- 유효한 인증 정보 제공
- 새로운 인증 토큰 발급
- 올바른 API 키 사용
403 Forbidden[편집 / 원본 편집]
의미[편집 / 원본 편집]
- 정의: 클라이언트가 인증되었으나, 요청한 리소스에 대한 권한(Authorization)이 없음을 나타낸다.
- 핵심 특징: 서버가 요청을 이해했으나, 클라이언트의 권한 부족으로 거부함을 의미한다.
사용 예시[편집 / 원본 편집]
- 관리자 전용 페이지에 일반 사용자가 접근
- 다른 사용자의 개인 정보 접근 시도
- IP 기반 접근 제한
구현 특징[편집 / 원본 편집]
- 응답 예시:
HTTP/1.1 403 Forbidden Content-Type: application/json { "error": "insufficient_permissions", "message": "You don't have permission to access this resource" }
해결 방법[편집 / 원본 편집]
- 필요한 권한 획득
- 적절한 역할/그룹 할당 요청
- 관리자에게 접근 권한 요청
주요 차이점[편집 / 원본 편집]
인증과 인가[편집 / 원본 편집]
- 401 (인증 문제)
- 신원 확인이 필요한 상태
- "당신이 누구인지 모릅니다"
- 로그인이나 인증 정보 제공으로 해결
- 403 (인가 문제)
- 신원은 확인되었으나 권한이 부족한 상태
- "당신이 누군지 알지만, 접근 권한이 없습니다"
- 적절한 권한을 부여받아야 해결
보안 구현 시 고려사항[편집 / 원본 편집]
401 구현 시[편집 / 원본 편집]
- 인증 메커니즘 명시: WWW-Authenticate 헤더를 통해 지원하는 인증 방식 안내
- 재시도 가능성: 클라이언트가 다시 인증을 시도할 수 있도록 정보 제공
- 보안 취약점 예방: 너무 자세한 오류 메시지는 피해야 함
403 구현 시[편집 / 원본 편집]
- 최소 권한 원칙: 필요한 최소한의 권한만 부여
- 명확한 메시지: 왜 접근이 거부되었는지 설명 (단, 보안을 저해하지 않는 선에서)
- 로깅: 권한 없는 접근 시도에 대한 기록 유지
모범 사례[편집 / 원본 편집]
올바른 상태 코드 선택[편집 / 원본 편집]
- 인증되지 않은 요청 → 401 사용
- 인증된 사용자의 권한 부족 → 403 사용
- 리소스 존재 여부 숨김 필요 → 404 고려
보안 관련 주의사항[편집 / 원본 편집]
- 정보 노출 최소화: 오류 메시지에 민감한 정보 포함 금지
- 일관된 응답: 동일한 상황에 대해 일관된 상태 코드 사용
- 적절한 로깅: 보안 감사를 위한 접근 거부 로그 유지