맵과 컬렉션 프레임워크
맵(Map)은 자바 컬렉션 프레임워크에 포함되지 않는다. 따라서 이터레이터(Iterator)를 사용할 수 없어 직접적으로 순회할 수 없다. 하지만 맵을 순회하기 위해서는 맵의 엔트리셋(entrySet()), 키셋(keySet()), 또는 값 컬렉션(values())을 이용해 이터레이터 속성이 있는 셋(Set)이나 컬렉션(Collection)으로 변환하면 된다. 이를 통해 맵의 각 엔트리(key-value pair)를 순회할 수 있다.
패스워드 인코딩과 인증 과정
스프링 시큐리티에서 패스워드 인코딩은 중요한 보안 절차이다. 패스워드 인코딩은 사용자가 입력한 비밀번호를 암호화하여 저장하고, 인증 시에는 입력된 비밀번호를 동일한 방식으로 암호화하여 저장된 값과 비교하는 과정이다.
- 패스워드 인코딩: 사용자가 입력한 비밀번호를 인코딩하여 컨테이너를 통해 처리한다. 이는 비밀번호를 안전하게 저장하기 위해 필수적이다.
- 유저 디테일 서비스 호출: 인코딩된 비밀번호는 UserDetailsService를 호출하여 인증 과정에 사용된다. UserDetailsService는 사용자 정보를 제공하는 서비스로, 사용자의 크리덴셜(신원 증명 정보)을 데이터베이스(DB)와 같은 크리덴셜 저장소에서 가져온다.
- 크리덴셜 생성 및 가져오기: 인증 과정에서 사용자의 크리덴셜을 생성하고 가져온다. 이 과정에서 사용자의 비밀번호는 안전하게 처리된다.
- 인증 프로바이더(AuthProvider): 마지막으로, AuthenticationProvider가 이 정보를 사용하여 사용자를 인증한다. AuthenticationProvider는 사용자 정보를 검증하고, 사용자가 제공한 크리덴셜과 저장된 크리덴셜이 일치하는지 확인한다.
예제 코드 설명
스프링 시큐리티 설정에서의 패스워드 인코딩과 유저 디테일 서비스 설정을 예제로 들어보겠다.
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.formLogin()
.loginPage("/auths/login-form")
.loginProcessingUrl("/process_login")
.failureUrl("/auths/login-form?error")
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/")
.and()
.exceptionHandling().accessDeniedPage("/auths/access-denied")
.and()
.authorizeHttpRequests(authorize -> authorize
.antMatchers("/orders/**").hasRole("ADMIN")
.antMatchers("/members/my-page").hasRole("USER")
.antMatchers("/**").permitAll());
return http.build();
}
@Bean
public UserDetailsManager userDetailsManager() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("luckykim@google.com")
.password("qwerty123")
.roles("USER")
.build();
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin@google.com")
.password("1111")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
@Bean
public PasswordEncoder passwordEncoder() {
return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}
}
위 코드에서는 패스워드 인코딩을 위한 PasswordEncoder 빈(bean)을 생성하고, 인메모리 사용자 상세 정보를 관리하는 InMemoryUserDetailsManager를 설정했다. 이 설정을 통해 사용자는 로그인 시 패스워드가 인코딩된 상태로 인증되며, UserDetailsService가 유저 정보를 가져와 AuthenticationProvider가 인증을 수행하게 된다.
결론
맵은 컬렉션 프레임워크에 속하지 않아 이터레이터를 사용할 수 없으나, 엔트리셋, 키셋, 값 컬렉션 등을 통해 순회할 수 있다. 패스워드 인코딩과 인증 과정은 스프링 시큐리티에서 매우 중요한 절차로, 사용자의 비밀번호를 안전하게 관리하고, 인증 과정에서 정확한 검증을 수행할 수 있게 한다. 이를 통해 애플리케이션의 보안을 강화할 수 있다.
'spring > [Spring Security] 기본' 카테고리의 다른 글
| 사용하는 용어 정리 (0) | 2024.08.03 |
|---|---|
| 스프링 시큐리티 (0) | 2024.07.04 |
| Cookie (0) | 2024.07.03 |
| Hashing (0) | 2024.07.03 |
| 인증/보안 (0) | 2024.07.03 |