- 인증(Authentication)의 개념, 목적
- 유저 기능과 인증 정보 관리 방식
- 이메일과 비밀번호 기반 인증 방식
- 실제 디렉토리 구조와 예제를 통해 기본 인증 흐름
- 실무 환경에서 주의할점과 팁
인증(Authentication)
사용자가 누구인지 확인하는 절차
시스템이 특정 사용자가 본인이 맞는지 검증하는 과정
웹사이트에 로그인할 때 이메일과 비밀번호를 입력함
이 때 시스템은 해당 정보가 데이터베이스에 저장된 값과 일치하는지 확인하여 사용자를 인증함
1. 인증의 정의와 목적
- 정의 : 사용자의 신원을 증명하는 과정
- 목적
- 시스템 접근 제어
- 개인정보 보호
- 비인가 사용자 차단
- 사영자별 맞춤 서비스 제공
| 구분 | 설명 |
| 인증(Authentication) | 사용자가 본인인지 확인하는 절차 |
| 인가(Authorization) | 인증된 사용자가 무엇을 할 수 있는지 결정하는 절차 |
public class AuthenticationExample {
public static void main(String[] args) {
String inputEmail = "user@example.com";
String inputPassword = "1234";
String savedEmail = "user@example.com";
String savedPassword = "1234";
System.out.println("inputEmail hash : " + inputEmail.hashCode());
System.out.println("savedEmail hash : " + savedEmail.hashCode());
if(inputEmail.equals(savedEmail) && inputPassword.equals(savedPassword)) {
System.out.println("인증 성공");
} else {
System.out.println("인증 실패");
}
}
}
inputEmail hash : 1084137992
savedEmail hash : 1084137992
인증 성공
위 코드는 매우 단순화된 예시임
실제로는 비밀번호를 그대로 저장하지 않고 암호화를 적용해야한다.(Sha 또는 크립토)
* 비밀번호는 반드시 해시(Hash) 알고리즘을 사용해서 암호화하여 저장해야함
* 인증 실패시에도 보안상 어떤 값이 틀렸는지 명확히 알려주지 않아야함
- "이메일이 틀렸습니다." 대신 "이메일 또는 비밀번호가 올바르지 않습니다."라고 알려줘야함
유저 모델과 인증 정보 관리
단순 아이디와 비밀번호만 저장하는것이 아닌, 실제 서비스에서는 다양한 유저 속성과 인증 관련 정보를 함께 관리해야함
1. 유저 모델 확장 구조
- src/
- main/
- java/
- User.java : 유저 엔티티 클래스
- UserProfile.java : 유저 프로필(닉네임, 나이, 등등..)
- UserCredential.java : 인증 정보(비밀번호, 로그인 시도 기록 등등..)
- UserRepository.java : 유저 데이터 저장소
- java/
- main/
2. User 예
public class User {
private Long id; // 고유한 ID
private String email; // 이메일
private UserProfile profile; // 프로필 정보
private UserCredential credential; // 인증 정보
private String role; // 권한(USER, ADMIN)
private LocalDateTime createdAt; // 생성일자
}
3. UserProfile 예
public class UserProfile {
private String nickname; // 닉네임
private int age; // 나이
private String phone; // 전화번호
// 주소, 프로필 이미지 등등 필드 추가 가능
}
4. UserCredential 예
public class UserCredential {
private String passwordHash; // 암호화된 비밀번호
private int failedLoginAttempts; // 로그인 실패 횟수 카운팅
private LocalDateTime lastLoginAt; // 마지막 로그인 시각
private boolean locked; // 계정 잠금 여부
}
* 인증 관련 정보(UserCredential)의 경우 보안이 중요하므로 별도로 관리한다
* 유저 정보(UserProfile)는 인증(Credential)과 분리하여 확장성을 높인다
* 권한(Role)을 필드로 두어 추후 인가(Authorization) 처리에 활용한다
이메일과 비밀번호 기반 인증 방식
가장 기본적 인증 방식은 이메일 + 비밀번호 조합이다
단순 비교가 아니라 암호화된 값 비교와 추가 인증 관리가 필요함
1. 인증 절차 흐름
- 사용자가 이메일과 비밀번호를 입력함
- 서버는 UserRepository에서 해당 이메일의 User를 찾는다
- 입력한 비밀번호를 Hash 처리하여 저장된 해시값과 비교한다
- 일치하면 인증 성공, 불일치하면 실패 횟수를 증가시킨다
- 실패 횟수가 일정 기준 이상이면, 계정을 잠근다
2. 예
import java.util.HashMap;
import java.util.Map;
public class AuthServiceTest {
private Map<String, User> users = new HashMap<>();
public boolean authenticate(String email, String rawPassword) {
User user = users.get(email);
if(user == null) {
return false;
}
UserCredential credential = user.getCredential();
String hashed = hashPassword(rawPassword); // 해시 함수 적용 예
if(credential.getPasswordHash().equals(hashed)) {
credential.setFailedLoginAttempts(0); // 성공시 실패를 초기화함
credential.setLastLoginAt(java.time.LocalDateTime.now());
return true;
} else {
credential.setFailedLoginAttempts(credential.getFailedLoginAttempts() + 1);
if(credential.getFailedLoginAttempts() > 5) {
credential.setLocked(true);
}
return false;
}
}
private String hashPassword(String rawPassword) { // 예제임. BCrypt나 Argon2 등을 사용해야함
return Integer.toHexString(rawPassword.hashCode());
}
}
팁
* 반드시 BCrypt, Argon2와 같은 강력한 해시 알고리즘을 사용하여 비밀번호를 암호화해야함
* 로그인 실패 횟수 제한 정책을 두어 보안성을 높여야함
* 로그인 성공시에는 세션(Session) 또는 토큰(Token)을 발급하여 인증 상태를 유지해야함
정리
| 단계 | 설명 |
| 입력 | 사용자가 이메일, 비밀번호를 입력함 |
| 확인 | 해시 처리 후 저장된값과 비교함 |
| 결과 | 일치시 성공, 불일치시 실패 |
| 확장 | 실패 횟수 관리, 계정 잠금, 세션/토큰 발급 |
'Spring Boot > 유저 관리 기능' 카테고리의 다른 글
| 쿠키와 세션 기반 인증 : 쿠키와 세션 보안 설정 (0) | 2026.03.08 |
|---|---|
| 쿠키와 세션 기반 인증 : 세션 기반 인증 (0) | 2026.03.07 |
| 쿠키와 세션 기반 인증 : 쿠키의 개념과 특성 (0) | 2026.03.05 |
| 유저 기능의 이해, 인증 개념 : 인증 워크플로우 (0) | 2026.03.04 |
| 유저 기능의 이해, 인증 개념 : 유저 기능의 필요성과 활용 (0) | 2026.02.28 |