<aside> 💡

진행 순서

  1. 의존성 설치
  2. SecurityFilterChain설정 빈 등록
  3. UserDetails 구현
  4. UserDetailsService 구현
  5. UserDetailsService Bean 등록
  6. 커스텀 로그인 서비스, 컨트롤러 구현

extra. 인메모리 사용법

</aside>

Member라는 가상의 엔티티가 존재하고, email이 식별자인 경우이다.

✅ 세션 기반 로그인 흐름

  1. 사용자가 로그인 폼에서 POST /login 요청을 보냄
  2. Spring Security의 **UsernamePasswordAuthenticationFilter(기본?)**가 요청을 가로챔
  3. DaoAuthenticationProviderUserDetailsService를 이용해 사용자 인증 수행
  4. 인증 성공 시 세션을 생성하고(JSESSIONID 발급), defaultSuccessUrl("/")으로 이동
  5. 인증된 사용자는 세션을 통해 계속 로그인 상태 유지

1. 의존성 설치

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

1. SecurityFilterChain설정 빈 등록

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/login", "/resources/**").permitAll()
                .anyRequest().authenticated() // 그외 모든 곳은 인
            )
            .formLogin(login -> login
                .loginPage("/login") // 커스텀 로그인 페이지
                .defaultSuccessUrl("/home", true) // 로그인 성공시 url
                .permitAll()
            )
            .csrf(csrf -> csrf.disable())  // CSRF 보호 비활성화
            .logout(logout -> logout
                .logoutUrl("/logout") // 로그아웃 엔트포인트
                .logoutSuccessUrl("/login?logout") // 로그아웃 성공시 url
                .invalidateHttpSession(true) // 세션 무효화
                .deleteCookies("JSESSIONID") // 쿠키 삭제
                .permitAll()
            )
            .sessionManagement(session -> session
                .sessionCreationPolicy(SessionCreationPolicy.ALWAYS) // 기본 세션 설정
            );
        return http.build();
    }
}