✅ 1. AuthenticationManager - 사용자 인증을 관리하는 핵심 인터페이스
🔹 (1) 코드 분석
@Bean
public AuthenticationManager authenticationManager(MemberDetailService memberDetailService, PasswordEncoder passwordEncoder) {
DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
daoAuthenticationProvider.setUserDetailsService(memberDetailService);
daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
return new ProviderManager(daoAuthenticationProvider);
}
✔️ AuthenticationManager는 Spring Security에서 인증(Authentication)을 관리하는 핵심 인터페이스
✔️ 사용자의 ID/PW가 올바른지 확인하는 역할
✔️ DaoAuthenticationProvider를 사용하여 DB에서 사용자 정보를 조회하고 비밀번호 검증
🔹 (2) AuthenticationManager의 동작 과정
📌 1) 사용자가 로그인 요청을 보냄
POST /auth/loginAction.do
Content-Type: application/x-www-form-urlencoded
mbEmail=admin@example.com&mbPassword=password123
✔️ 사용자가 아이디와 비밀번호를 입력하고 로그인 버튼을 누름
✔️ .loginProcessingUrl("/auth/loginAction.do") 설정 덕분에 Spring Security가 이 요청을 자동으로 가로챔
📌 2) AuthenticationManager가 인증 요청을 처리
public AuthenticationManager authenticationManager(MemberDetailService memberDetailService, PasswordEncoder passwordEncoder) {
DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
daoAuthenticationProvider.setUserDetailsService(memberDetailService);
daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
return new ProviderManager(daoAuthenticationProvider);
}
✔️ AuthenticationManager는 ProviderManager를 통해 여러 AuthenticationProvider를 관리
✔️ 여기서는 DaoAuthenticationProvider를 사용하여 로그인한 사용자의 정보를 검증
📌 3) DaoAuthenticationProvider가 사용자 정보 검증
daoAuthenticationProvider.setUserDetailsService(memberDetailService);
daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
✔️ MemberDetailService를 통해 DB에서 사용자 정보를 가져옴
✔️ 입력된 비밀번호와 저장된 비밀번호를 PasswordEncoder를 사용하여 비교
✔️ 비밀번호가 일치하면 인증 성공
📌 4) 인증 성공 시 SecurityContextHolder에 저장
✔️ AuthenticationManager가 인증이 성공하면 SecurityContextHolder에 인증 정보를 저장
✔️ 이후 로그인된 사용자만 보호된 페이지(/admin 등)에 접근 가능
🔹 (3) AuthenticationManager를 사용하는 이유
| 역할 | 설명 |
| AuthenticationManager | 사용자의 인증(로그인)을 관리하는 핵심 인터페이스 |
| ProviderManager | 여러 개의 인증 제공자(AuthenticationProvider)를 관리 |
| DaoAuthenticationProvider | DB에서 사용자 정보를 가져와 비밀번호 검증을 수행하는 기본 제공 Provider |
| UserDetailsService | DB에서 사용자 정보를 가져오는 인터페이스 |
| PasswordEncoder | 비밀번호 암호화 및 검증 |
✔️ 즉, AuthenticationManager는 로그인 요청을 받아서 사용자의 아이디와 비밀번호를 검증하는 역할을 함
✅ 2. PasswordEncoder - 비밀번호 암호화 및 검증
🔹 (1) 코드 분석
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
✔️ 비밀번호를 암호화하고, 로그인 시 입력한 비밀번호와 저장된 비밀번호를 비교하는 역할
✔️ PasswordEncoderFactories.createDelegatingPasswordEncoder()는 기본적으로 BCrypt 암호화를 사용
🔹 (2) PasswordEncoder의 동작 과정
📌 1) 비밀번호 저장 시 암호화
사용자가 회원가입할 때 비밀번호를 암호화하여 DB에 저장
PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
String encodedPassword = passwordEncoder.encode("password123");
System.out.println(encodedPassword);
✔️ 출력 결과 예시 (BCrypt 암호화 적용됨)
{bcrypt}$2a$10$NPe7A5d7ZJtRY8zR...
✔️ BCrypt 방식으로 암호화되어 원래 비밀번호를 알 수 없음 (복호화 불가능)
✔️ 대신, 로그인할 때 입력한 비밀번호와 DB에 저장된 암호화된 비밀번호를 비교하여 일치 여부를 확인
📌 2) 로그인 시 비밀번호 검증
로그인할 때 입력한 비밀번호와 DB에 저장된 암호화된 비밀번호를 비교
boolean matches = passwordEncoder.matches("password123", "{bcrypt}$2a$10$NPe7A5d7ZJtRY8zR...");
System.out.println(matches); // true
✔️ matches() 메서드를 사용하여 입력한 비밀번호가 저장된 암호화된 비밀번호와 일치하는지 확인
🔹 (3) PasswordEncoder의 주요 기능
| 메서드 | 설명 |
| encode(비밀번호) | 비밀번호를 암호화하여 저장 |
| matches(입력한 비밀번호, 저장된 암호화된 비밀번호) | 비밀번호 비교 후 일치 여부 반환 (true/false) |
🔹 (4) PasswordEncoderFactories.createDelegatingPasswordEncoder()의 장점
✔️ 여러 암호화 알고리즘을 지원 (기본: bcrypt)
✔️ BCryptPasswordEncoder를 사용하면 비밀번호가 자동으로 해싱되므로 보안성이 높음
✔️ matches() 메서드가 알아서 저장된 암호화 방식에 맞춰 검증을 수행
✅ 3. AuthenticationManager와 PasswordEncoder 정리
| 설정 | 역할 |
| AuthenticationManager | 사용자 인증(로그인)을 수행하는 핵심 인터페이스 |
| DaoAuthenticationProvider | DB에서 사용자 정보를 가져와 비밀번호 검증 |
| UserDetailsService | DB에서 사용자 정보를 로드하는 인터페이스 |
| PasswordEncoder | 비밀번호 암호화 및 검증 |
| encode() | 비밀번호를 암호화하여 저장 |
| matches() | 입력한 비밀번호와 암호화된 비밀번호 비교 |
✔️ AuthenticationManager는 로그인 요청을 처리하여 인증을 수행
✔️ PasswordEncoder는 비밀번호를 안전하게 저장하고 비교하는 역할
✔️ DaoAuthenticationProvider는 DB에서 사용자 정보를 가져와 인증을 수행하는 Provider
✅ 4. 결론
💡 Spring Security에서 로그인 과정이 안전하게 동작하는 이유
✔️ AuthenticationManager가 로그인 요청을 받아 사용자 인증을 수행
✔️ UserDetailsService가 DB에서 사용자 정보를 로드
✔️ PasswordEncoder가 비밀번호를 안전하게 암호화하여 저장하고 비교
✔️ DaoAuthenticationProvider가 DB에 저장된 비밀번호와 입력된 비밀번호를 비교하여 인증 처리
'Spring > 09. spring-security' 카테고리의 다른 글
| Spring Security는 로그인/로그아웃 컨트롤러를 안 만들어도 되는가? (0) | 2025.03.05 |
|---|---|
| Spring Security는 로그인 & 로그아웃을 위한 API인가? (0) | 2025.03.05 |
| .logout()과 .sessionManagement() (0) | 2025.03.05 |
| Spring Security의 보안 구성 흐름 / 설정 설명 (0) | 2025.03.05 |
| Spirng Security 개념 및 동작 방식 정리 (0) | 2025.03.05 |