로그인 과정 3가지
1. 아이디와 비밀번호를 보낸다.
2. 시간제한 있는 임시 아이디를 보낸다
3. 일정 시간 동안 인가에 유효한 정보로 대체한다.(JWT)
'JWT'
를 쓰면 인가가 수월함. 서버가 유저 정보를 갖고 있으므로 데이터에서 유저의 권한 정보도 읽어들이면 됨.implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.security:spring-security-test'
@Configuration
@EnableWebSecurity --(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter { --(2)
@Override
protected void configure(HttpSecurity http) throws Exception { --(3)
http
.authorizeRequests() --(4)
.anyRequest().authenticated();
http
.formLogin(); --(5)
}
}
WebSecurityConfigurerAdapter
를 상속 받아야 HttpSecurity
를 사용할 수 있다HttpSecurity
클래스를 이용해 인증 API 와 인가 API 설정을 해준다@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated();
http
.formLogin()
.loginPage("/loginPage") //사용자 정의 로그인 페이지
.defaultSuccessUrl("/") //로그인 성공 후 이동페이지
.failureUrl("/login") //로그인 실패 후 이동페이지
.usernameParameter("userId") //아이디 파라미터명 설정
.passwordParameter("passwd") //패스워드 파라미터명 설정
.loginProcessingUrl("/login_proc") //로그인Form Action Url
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
System.out.println("authentication : " + authentication.getName());
System.out.println("getAuthorities : " + authentication.getAuthorities());
System.out.println("getCredentials : " + authentication.getCredentials());
System.out.println("getDetails : " + authentication.getDetails());
System.out.println("getClass : " + authentication.getClass());
response.sendRedirect("/");
}
})
.failureHandler(new AuthenticationFailureHandler() {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
System.out.println("getMessage : " + exception.getMessage());
System.out.println("getCause : " + exception.getCause());
System.out.println("getStackTrace : " + exception.getStackTrace());
System.out.println("getLocalizedMessage : " + exception.getLocalizedMessage());
System.out.println("getSuppressed : " + exception.getSuppressed());
response.sendRedirect("/login");
}
})
.permitAll() // 위에 인가API 설정에서 모든 페이지 인가 필요하다 설정하였는데
;
}