반응형

Form Authentication이란?

  • Session을 활용하는 방식
  • Login Page에서 로그인하여 인증을 성공하면 인증정보를 Session에 저장하고 이후 인증정보도 Session의 정보를 활용
  • UsernamePasswordAuthenticationFilter를 사용
    • 로그인 요청이 아니면 해당 필터는 패스
    • 로그인 요청일 경우 인증정보 생성(UsernamePasswordAuthenticationToken) 후 아래 로직 수행
    • ThreadLocalSecurityContextHolderStrategy.setContext() 를 호출하여 인증정보를 컨텍스트에 세팅
    • HttpSessionSecurityContextRepository.saveContext() 를 호출하여 인증정보를 세션에 저장(세션키: SPRING_SECURITY_CONTEXT)

의존성 추가

implementation("org.springframework.boot:spring-boot-starter-security")

SecurityConfig

@EnableWebSecurity(debug = true)
@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
            .authorizeRequests(authorize -> {
                authorize.requestMatchers("/error/**").permitAll();
                authorize.anyRequest().authenticated();
            })
            .formLogin(login -> {
                // login.loginPage("/login-page").permitAll();  // 로그인 페이지 URL(default: /login)
                login.defaultSuccessUrl("/api/v1/demo");        // 로그인 성공시 해당 URL로 리다이렉트
            })
            .csrf(AbstractHttpConfigurer::disable)
            .build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
        User.UserBuilder users = User.builder();
        UserDetails user = users
            .username("tyler")
            .password(passwordEncoder.encode("1234"))
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

웹페이지에서 요청 테스트

  • 아무 API나 요청 시도. ex) http://localhost:8080/api/v1/demo
  • 인증정보가 없으면 로그인 페이지로 이동
  • 로그인 페이지에서 username: tyler, password: 1234 입력 후 로그인
  • 로그인 성공시 defaultSuccessUrl()로 지정한 URL로 리다이렉트

curl로 요청 테스트

로그인

% curl -i -d 'username=tyler&password=1234' -X POST http://localhost:8080/login
HTTP/1.1 302
Set-Cookie: JSESSIONID=7CB4EC09E2DFE8FBC67E51C4AEE9710A; Path=/; HttpOnly
...

API 요청

% curl -H 'Cookie:JSESSIONID=7CB4EC09E2DFE8FBC67E51C4AEE9710A' http://localhost:8080/api/v1/demo
Hello World
반응형

+ Recent posts