Spring Security In Action - 기본 구성

이종찬·2023년 7월 13일
0
post-thumbnail
post-custom-banner

1. 기본 구성?

인증과 권한 부여를 처리하는 데 참여하는 구성 요소를 의미합니다. 프로젝트에 알맞게 각각의 요소들을 재정의 하여 사용해야 합니다.

위와 같은 순서로 인증 프로세스가 진행되며 각각의 역할을 확인할 수 있습니다.

✅ 인증 필터

인증 요청을 인증 관리자에게 위임하는 역할이며, 인증 관리자에게 받은 응답을 바탕으로 보안 컨텍스트를 구성합니다.

✅ 보안 컨텍스트

인증 프로세스 이후 인증된 데이터를 유지하는 역할입니다.

✅ 인증 관리자

인증 공급자를 사용하여 인증을 처리하며 처리한 결과를 필터에 반환합니다.

✅ 인증 공급자

인증 논리를 구현하는 역할입니다. 인증 공급자의 기본 구현은 서비스에 적용된 인증 논리를 정의하는 UserDetailsService , 암호 관리를 구현하는 PasswordEncoder에 제공된 기본 구현을 이용하며 Bean 으로 등록하여 인증에 필요한 자격 증명을 제공합니다.

UserDetailsService

해당 객체는 사용자에 관한 세부 정보를 관리합니다. 앱의 내부 메모리에 기본 자격 증명을 등록하는 일을 합니다. 기본 자격 증명은 이름과 암호로 구성되어있으며, 사용자 이름은 user 암호는 UUID(Universally Unique Identifier) 로 스프링컨텍스트 로드시 자동 생성됩니다.

PasswordEncoder

해당 객체는 암호를 인코딩하고 암호가 기존 인코딩과 일치하는지 확인하는 역할입니다. 기본 구현 방식은 "Basic" + 사용자의 이름과 암호가 포함된 문자열을 Base64 인코딩한 결과를 헤더를 통해 보내면 된다.

ex)


2. 기본 구성 재정의

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.authorizeHttpRequests(auth -> auth
                        .requestMatchers(
                                HttpMethod.GET,
                                "/"
                        ).permitAll()
                        .requestMatchers(
                                HttpMethod.GET,
                                "/admin"
                        ).hasRole("ADMIN")
                        .requestMatchers(
                                HttpMethod.GET,
                                "/user"
                        ).hasRole("USER")
                )
                .formLogin(withDefaults())
                .httpBasic(withDefaults())
                .logout(logout -> logout.logoutSuccessUrl("/login"))
                .build();
    }

    @Bean
    public InMemoryUserDetailsManager userDetailsService() {
        UserDetails user1 = User
                .withUsername("user1")
                .password(passwordEncoder().encode("123"))
                .roles("USER")
                .build();

        UserDetails user2 = User
                .withUsername("user2")
                .password(passwordEncoder().encode("123"))
                .roles("USER")
                .build();

        UserDetails admin = User
                .withUsername("admin")
                .password(passwordEncoder().encode("123"))
                .roles("USER", "ADMIN")
                .build();

        return new InMemoryUserDetailsManager(user1, user2, admin);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
  • userDetailsService() : InMemoryUserDetailsManager 구현을 이용하여 메모리에 자격 증명을 저장한 뒤 요청을 인증할 때 이용하기 위한 코드 입니다. 해당 메서드를 재정의 하면 PasswordEncoder 역시 재정의 해야 합니다.

  • passwordEncoder() : 해시 함수를 이용하여 패스워드를 암호화 하는 역할 입니다.

  • securityFilterChain() : 엔드포인트 권한 부여를 구성한 코드입니다. 자격증명없이 호출이 가능한 것과 Role에 따른 접근 권한으로 나뉘는 것으로 구성되어 있습니다.


profile
왜? 라는 질문이 사라질 때까지
post-custom-banner

0개의 댓글