기본 인증(Basic Authentication)
- 기본 인증의 정의, 동작원리
- RFC 7617 표준에 따라 기본인증이 어떻게 정의되는지 알기
- Authorization 헤더의 구조와 실제 예시 파악
- 기본 인증이 동작하는 전체 과정을 단계별로 이해하기
- 기본 인증의 장점, 한계
기본 인증(Basic Authentication)
1) RFC 7617
기본 인증은 HTTP 표준 인증 방식중 하나로, RFC 7617에서 정의되어있음
사용자 이름과 비밀번호를 콜론으로 연결한 뒤, Base64로 인코딩하여 Authorization 헤더에 담아 서버에 전달함
매우 단순한 구조라서 구현이 쉽지만, 보안이 취약함
2) 기본 개념
클라이언트 : 사용자 이름과 비밀번호를 입력, username:password
인코딩 : username:password를 Base64로 인코딩함, 대충 알 수 없는 영문자와 숫자로 이루어짐
서버 요청 : 인코딩한 문자열을 Authorization 헤더에 담아서 요청에 전송함
GET /mypage HTTP/1.1
Host: example.com
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
서버 동작 :
1. Authorization 헤더 확인
2. Basic 접두사를 제거하고 Base64 디코딩
3. username:password 추출
4. 서버 저장소의 자격 증명과 비교 후 인증 성공 여부를 결정함
Authorization 헤더의 이해
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
1) 구조 설명
인증 방식 : Basic, RFC 7617에서 정의한 키워드
인코딩된 자격 증명 : dXNlcm5hbWU6cGFzc3dvcmQ=, user:password를 Base64로 인코딩한 값
2) 동작 흐름 다이어그램
Authorization 헤더는 클라이언트가 서버에 자신의 자격 증명을 전달하는 핵심 역할을 한다.
1. 사용자가 보호된 리소스에 접근 시도
2. 서버는 401 Unauthorized 와 함께 WWW-Authenticate: Basic realm="..." 헤더를 응답하여 인증을 요구함
3. 브라우저(클라이언트임, 사용자 x)는 사용자에게 아이디와 비밀번호 입력을 요청함
4. 입력받은 아이디, 비밀번호를 username:password 형태로 합친 후 Base64로 인코딩함
5. 인코딩된 문자열을 Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= 형태로 요청 헤더에 담아 서버에 다시 보냄
6. 서버는 Base64 디코딩 후 사용자 저장소와 비교하여 인증 성공 여부를 판단함
기본적인 인증 구현법
1) 디렉토리 구조
main/java/com/springboot/
BasicAuthHandler.java
UserRepository.java
2) 구현 예시, 러프버전
class UserRepository { // 실제 DB가 아닌 러프한 예시
public boolean validate(String username, String password) {
return "user".equals(username) && "password".equals(password);
}
}
public class BasicAuthHandler {
private final UserRepository userRepoisotry = new UserRepository();
public boolean authenticate(String authHeader) { // 요청 헤더에서 Authorization을 받아 검증함
if(authHeader == null || !authHeader.startWith("Basic ")) { // 헤더가 없거나 Basic이 아님
return false;
}
String base64Credentials = authHeader.subString("Basic ".length()); // "Basic " 제거
byte[] decodeBytes = Base64.getDecoder().decode(base64Credentials); // Base64 디코딩
String credentials = new String(decodedBytes);
String[] parts = credentials.split(":", 2); // username:password를 따로 분리한다
if(parts.length != 2) {
return false;
}
String username = parts[0];
String password = parts[1];
return userRepository.validate(username, password); // userRepository에서 사용자 검증
}
}
기본 인증의 한계, 보안 위험성
- 인코딩 != 암호화 : Base64는 단순한 인코딩일 뿐, 보안 기능이 없다.
- 재전송 위험 : 요청마다 자격 증명이 반복되어 전송되므로 탈취의 위험이 있다.
- 저장소 문제 : 서버는 사용자의 비밀번호를 안전하게 저장(해시, 솔트 등?)해야 하며, 그렇지 않으면 유출의 위험이 높다.
- 현대적 대체 수단 필요 : 실제 서비스에서는 세션 기반 인증이나 토큰 기반 인증(JWT 등등..)이 일반적으로 사용됨
* 기본 인증은 구현이 간단하지만 보안적으로 매우 취약하여 실제 서비스에서는 거의 사용되지 않음.
학습 목적, 테스트 완경, 내부 서비스 등 제한된 상황에서만 쓰도록 하자
'Spring Boot' 카테고리의 다른 글
| 헤더/토큰 기반 인증 : Authorization 헤더 (0) | 2025.10.03 |
|---|---|
| 기본 인증과 인코딩 : 인코딩과 Base64URL (0) | 2025.09.26 |
| 쿠키와 세션 기반 인증 : 쿠키와 세션 보안 설정 (0) | 2025.09.24 |
| 쿠키와 세션 기반 인증 : 세션 기반 인증 (0) | 2025.09.24 |
| 쿠키와 세션 기반 인증 : 쿠키의 개념, 특성 (0) | 2025.09.24 |