반응형
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
반응형
'Development > Spring Security' 카테고리의 다른 글
[Spring Security] WebSocketSecurity (0) | 2023.10.29 |
---|---|
[Spring Security] Jwt Authentication(Custom Filter로 직접 구현하기) (0) | 2023.10.29 |
[Spring Security] OAuth2 Authentication (0) | 2023.10.29 |
[Spring Security] Basic Authentication (0) | 2023.10.29 |
[Spring Security] 기본 (0) | 2023.10.29 |