우선 코드는 깃허브에 있다.
일단 문서로 정리한 것을 토대로 로그인과 회원가입 어떤 순서로 동작하는지 알아보려고 했다.
일단 시큐리티에 대한 설정은 SecurityConfig
라는 클래스 설정파일을 만들어서 진행했다.
WebSecurityConfigurerAdapter
는 WebSecurityConfigurer
라는 인터페이스를
조금 더 쉽게 생성하기 위해 존재하는 클래스이다. 이 클래스의 구현을
그러니까 기본으로 적용되어 있는것 외에 재정의 하여 사용할 수 있다.
아래는 해당 추상클래스에 대한 설명을 가져와봤다.
우리는 이 추상 클래스에서 구현되어있는 configure(HttpSecurity http)
메소드를 재정의 하여 설정을 진행한다.
package io.github.lsj8367.security.configuration;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/", "/h2-console/**"); // "/" 와 "/h2-console"은 접근 가능
//여기서 무시하는 과정이 아래의 configure()보다 우선순위가 높다.
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated() //모든 요청은 인증이 필요함 위의 ignoring()에 포함된 애들은 제외시킨다. 추가적으로 permitAll()로 해제해준 url은 접근 가능
.and()
.formLogin() //formLogin 설정 default /login
.and()
.logout().permitAll(); //logout에 대한 모든권한 적용 default /logout
}
}
여기 설정에서 formLogin()
은 uri를 잡아주지 않았기에 기본값인 /login
으로 로그인을 처리한다.
이때 동작하는 필터가 UsernamePasswordAuthenticationFilter
인데 이 클래스는
AbstractAuthenticationProcessingFilter
를 상속받아 처리해준다.
UsernamePasswordAuthenticationFilter
클래스는 기본값인 /login
에 대해 응답한다고
설명에 명시되어 있다. 여기서 사용되는 username
, password
는 configure()
에서
usernameParameter()
와 passwordParameter()
로 변경해서 매칭해줄 수 있다.
인증에 대한 검증을 수행하게 되는데
HTTP 메소드가 POST
인지를 먼저 판단한다.
그 후에 obtainUsername
, obtainPassword
로 파라미터 설정한것을 가져온다.
나는 기본값으로 두었기에 form안에 input id가 username
, password
이다.
그다음에 null인지, 빈문자열인지 검증을 한 뒤에
UsernamePasswordAuthenticationToken
을 발급해준다.
이렇게 로그인 인증이 일단락 되었다.