본문 바로가기
Spring/09. spring-security

AuthenticationManager와 PasswordEncoder

by 989898 2025. 3. 5.

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에 저장된 비밀번호와 입력된 비밀번호를 비교하여 인증 처리