[BOOK 개인프로젝트] 2. Spring Security 적용

이재민·2024년 6월 1일
0

JPA 

목록 보기
4/21
post-thumbnail

Spring Security 사용 이유

-> 아무래도 개발을 하다보면 보안 문제도 생기고 회원과 비회원을 구분해야 하는 상황도 생기기 때문에 Spring Security를 적용하여 보안 관리를 해주고, 확장성과 유연성을 높여준다!

적용 방법

build.gradle에 적용

	implementation 'org.springframework.boot:spring-boot-starter-security'

SecurityConfig


/**
 * SecurityConfig -> Spring Security 설정을 담당하는 클래스
 * -> 애플리케이션의 보안 설정 정의 및 사용자의 인증과 권한 부여 설정
 */

@Configuration
@EnableWebSecurity
@AllArgsConstructor
public class SecurityConfig {

    //SecurityFilterChain - HTTP 보안 설정 정의
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                //HTTP 요청에 대한 접근 권한 설정
                .authorizeHttpRequests((authorize) -> authorize
                        .requestMatchers("/", "signup").permitAll()
                        .anyRequest().permitAll()
                )
                //폼 로그인 설정 정의
                .formLogin(login -> login
                        .loginPage("/") // 사용자 정의 로그인 페이지 경로 지정
                        .permitAll() // 로그인 페이지에 대한 접근 허용
                )
                //CSRF 보호 비활성화
                .csrf().disable();
        return http.build();
    }

    //AuthenticationManager - 인증 매니저 구성
    @Bean
    public AuthenticationManager authenticationManager(
            UserDetailsService userDetailsService,
            PasswordEncoder passwordEncoder) {

        //DaoAuthenticationProvider - 데이터베이스 기반 인증 처리 인증 제공자
        DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
        authenticationProvider.setUserDetailsService(userDetailsService);
        authenticationProvider.setPasswordEncoder(passwordEncoder);

        //ProviderManager - 인증 제공자 관리 매니저
        ProviderManager providerManager = new ProviderManager(authenticationProvider);
        providerManager.setEraseCredentialsAfterAuthentication(false);

        return providerManager;
    }

    //UserDetailsService - 사용자 세부 정보 관리
    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails userDetails = User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();

        //InMemoryUserDetailsManager - 메모리 내 사용자 세부 정보 관리 서비스
        //생성한 UserDetails 객체를 사용하여 초기 사용자 정보 설정
        return new InMemoryUserDetailsManager(userDetails);
    }


    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

}

주석으로 적어놓은 것처럼 SecurityConfig 클래스를 통해 HTTP 보안 설정 정의, 인증 매니저 구성, 사용자 세부 관리 등 여러 보안 문제를 이 클래스를 통해 처리하도록 한다.
그리고 passwordEncoder를 통해서 비밀번호 저장시 암호화하여 저장하도록 한다!

    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

여기서 또 중요한 점은 Spring security를 적용하면 자연스럽게 세션 id가 생성이 되어서 상태 유지 및 보안성을 높여준다.

세션이 적용되었는지 확인하는 방법

F12 -> Application에 들어가서 JSESSIONID가 존재하는지 확인하면 정상 동작 하고 있는 것이다.

profile
복학생의 개발 일기

0개의 댓글

관련 채용 정보