본문 바로가기

spring/[Spring Security] 기본

요청처리

맵과 컬렉션 프레임워크

맵(Map)은 자바 컬렉션 프레임워크에 포함되지 않는다. 따라서 이터레이터(Iterator)를 사용할 수 없어 직접적으로 순회할 수 없다. 하지만 맵을 순회하기 위해서는 맵의 엔트리셋(entrySet()), 키셋(keySet()), 또는 값 컬렉션(values())을 이용해 이터레이터 속성이 있는 셋(Set)이나 컬렉션(Collection)으로 변환하면 된다. 이를 통해 맵의 각 엔트리(key-value pair)를 순회할 수 있다.

 

 

패스워드 인코딩과 인증 과정

스프링 시큐리티에서 패스워드 인코딩은 중요한 보안 절차이다. 패스워드 인코딩은 사용자가 입력한 비밀번호를 암호화하여 저장하고, 인증 시에는 입력된 비밀번호를 동일한 방식으로 암호화하여 저장된 값과 비교하는 과정이다.

  1. 패스워드 인코딩: 사용자가 입력한 비밀번호를 인코딩하여 컨테이너를 통해 처리한다. 이는 비밀번호를 안전하게 저장하기 위해 필수적이다.
  2. 유저 디테일 서비스 호출: 인코딩된 비밀번호는 UserDetailsService를 호출하여 인증 과정에 사용된다. UserDetailsService는 사용자 정보를 제공하는 서비스로, 사용자의 크리덴셜(신원 증명 정보)을 데이터베이스(DB)와 같은 크리덴셜 저장소에서 가져온다.
  3. 크리덴셜 생성 및 가져오기: 인증 과정에서 사용자의 크리덴셜을 생성하고 가져온다. 이 과정에서 사용자의 비밀번호는 안전하게 처리된다.
  4. 인증 프로바이더(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