๐ฑ ์คํ๋ง ์ํ๋ฆฌํฐ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๋ก๊ทธ์ธ ๋ก์ง
form์ ํตํด์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ฉด ์ธ์ ๋ฐ ์ธ์ฆ ํ ํฐ์ ์ ์ฅํ๋ค.
์ถํ์๋ ํด๋น ์ธ์ฆ์ ํตํด์ ์์ ๊ฐ๋ฅํ๋ค.
๋ก๊ทธ์ธ API
์ฌ๊ธฐ์ ๋ง๋ถ์ฌ์ ์ค๋ช ํ๋ฉด
- loginProcessingUrl : form ํ๊ทธ์ ์๋ action url , ํ์๋ฆฌํ ์ฐ๋ฉด th:action
- successHandler : ์ฑ๊ณตํ์ ๋ ๋ด๊ฐ ์ถ๊ฐ์ ์ผ๋ก ์ ์ดํ ์ ์๋ ํธ๋ค๋ฌ
- failureHandler : ์คํจํ์ ๋ ๋ด๊ฐ ์ถ๊ฐ์ ์ผ๋ก ์ ์ดํ ์ ์๋ ํธ๋ค๋ฌ
๐ successUrl์ด๋ failureUrl์ด๋ ๋น์ทํ๋ค๋ ์๊ฐ์ ํ ์๋ ์๊ฒ ์ง๋ง ์์ ๋ ๊ฐ๋ url์ค์ ๋ฐ์ ํ์ง ๋ชปํ๋ค.
Controller
@GetMapping("/loginPage")
public String loginPage() {
return "loginPage";
}
SecurityConfig
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests()
.anyRequest().authenticated();
http
.formLogin()
.loginPage("/loginpage")
.defaultSuccessUrl("/")
.failureUrl("/login")
.usernameParameter("userId")
.passwordParameter("passwd")
.loginProcessingUrl("/login_proc")
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
System.out.println("authentication" + authentication.getName());
response.sendRedirect("/");
}
})
.failureHandler(new AuthenticationFailureHandler() {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
System.out.println("exception" + exception.getMessage());
response.sendRedirect("/login");
}
})
.permitAll();
return http.build();
}
}
Login Form ์ธ์ฆ
- UsernamePasswordAuthenticationFilter : ํ์ฌ ์ฌ์ฉ์๊ฐ ์์ฒญํ ์ ๋ณด๋ฅผ ํ์ธ
- AntPathRequestMatcher : ์์ฒญ ์ ๋ณด๊ฐ ๋งค์นญ๋๋์ง ํ์ธ (๋ํดํธ ๊ฐ์ /login)
- Authentication : ์์ฒญ ์ ๋ณด๊ฐ ๋ง๋ค๋ฉด ์ฌ์ฉ์์ ์์ด๋, ํจ์ค์๋๋ก ์ธ์ฆ ๊ฐ์ฒด ์์ฑ
- chain.doFilter : ์์ฒญ ์ ๋ณด๊ฐ ๋ค๋ฅด๋ค๋ฉด filter ์คํ
- AuthenticationManager : AuthenticationProvider๋ฅผ ํตํด์ ์ธ์ฆ ๊ฐ์ฒด ์์
- AuthenticationProvider ํด๋์ค๊ฐ ์ธ์ฆ์ ์คํจํ๋ฉด AuthenticationException์์ธ ๋ฐ์ -> ์ธ์ฆ ์คํจ
- ์ธ์ฆ์ ์ฑ๊ณตํ๋ค๋ฉด Authentication ์บ์๋ฅผ ๋ง๋ค์ด์ ๊ฐ์ฒด์ ์ ์ฅํ๊ณ ๋ค์ Authentication Manager์๊ฒ ๋๊น
- ์ด๋ก์ Authentication : ๋๊ฒจ๋ฐ์ ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ๋ฐ์ (์ต์ข ์ ์ผ๋ก ์ฑ๊ณตํ ์ ์ ๊ฐ์ฒด์ ๊ถํ ์ ๋ณด๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐ์)
- SecurityContext : ํด๋น ์ ๋ณด๋ฅผ ์ ์ฅ (์ธ์ฆ ๊ฐ์ฒด ์ ์ฅ์) -> session์๋ ์ ์ฅ์ด ๋จ
- SuccessHandler : ์ฑ๊ณต ํธ๋ค๋ฌ ์๋
ํด๋น ๊ธ์ ์ธํ๋ฐ์ ์คํ๋ง์ํ๋ฆฌํฐ-Spring Boot ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐํ๋ Spring Security๋ฅผ ๋ณด๊ณ ์์ฑํ ๊ธ์ ๋๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Spring Security(์คํ๋ง ์ํ๋ฆฌํฐ) Remember-Me ์ธ์ฆ (0) | 2023.11.03 |
---|---|
[Spring] Spring Security(์คํ๋ง ์ํ๋ฆฌํฐ) Logout์ฒ๋ฆฌ, LogoutFilter (2) | 2023.11.02 |
[Spring] Spring Security(์คํ๋ง ์ํ๋ฆฌํฐ) ๊ธฐ์ด ๊ฐ๋ (1) | 2023.10.31 |
[Spring] Dirty Checking(๋ํฐ ์ฒดํน) ์ด๋? (0) | 2023.10.27 |
[Spring] Service, ServiceImpl ๊ตฌ์กฐ (0) | 2023.06.30 |