Hansel
스프링 시큐리티 / 코드로 보는 동작 본문
이전에 썼던 동작 방식을 보면 순서는 다음과 같았다.
- 필터가 인증 요청을 가로챈다.
- Authentication은 자격 정보를 받고 AuthenticationManager에게 전달한다.
- manager는 적합한 provider를 찾고(supports) 그 provider의 authenticate 메서드를 호출한다.
- 그 후 userDetailsService에 유저 자격 정보로 검증을 한다(loadByUserName()).
- 검증이 완료 되면 Principal(UserDetail)을 반환한다.
- 그 Principal을 이용하여 Authentication 타입의 객체를 생성하고 그 객체를 가지고 세션을 생성한다.
이 과정을 코드로 살펴보자.

우선 기본적으로 디펜던시를 설정해줘야 한다.
필터 등록하기

WebSecurityConfigureAdapter를 상속받는 클래스를 하나 작성해야 한다.
@EnableWebSecurity
이 어노테이션을 통해 스프링 시큐리티 필터를 필터체인에 등록할 수 있다.
이 바로 아래 글로벌 메서드 시큐리티는 컨트롤러 단에 필요한 것이라 여기서는 생략한다.
그 아래 패스워드 인코더도 비밀번호 암호화에 필요한 것이기 때문에 여기서는 생략한다.
Configure
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/user/**").authenticated()
.antMatchers("/manager/**").hasAnyRole("ROLE_ADMIN","ROLE_MANAGER")
.antMatchers("/admin/**").hasRole("ROLE_ADMIN")
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/loginForm")
//.usernameParameter("원하는 유저네임(Ex LoginId 등")
.loginProcessingUrl("/login") //login이라는 주소가 호출이 되면 시큐리티가 낚아채서 로그인을 진행한다.=> 컨트롤러에 로그인매핑이 필요 없어짐
.defaultSuccessUrl("/");
}
여기서 중요한 것은 configure 메서드이다.
이 메서드는 인증 처리를 설정하기 위해 사용되는데 파라미터로는 HttpSecurity, AuthenticationManagerBuilder 등이 올 수 있다.
AuthenticationManagerBuilder를 통해 Provider를 호출하고 UserDetailsService를 호출하도록 할 수 있지만
loginProcessingUrl이 호출됨과 동시에 IoC에 등록된 UserDetailsService의 loadUserByUsername 함수를 실행시키는 방법도 있다.
여기서는 후자를 사용한다.
로그인 폼과 컨트롤러 매핑은 간단하니 생략합니다.
CSRF.disable()의 경우 상황에 맞게 사용해주면 된다.
@EnableWebSecurity 어노테이션을 적용하면 자동으로 csrf 보안이 적용되는데 REST-API 서버를 구축하고 있다면 disable 해도 괜찮다.
Credential 검증

로그인 URL이 호출되었다면 UserDetailsService의 loadUserByUsername메서드가 호출된다.
해당 메서드를 통해 유저의 Credential이 괜찮은지 검증하고 해당 객체를 Principal(UserDetails)에 담아 보낸다.

유저의 자격 검증이 제대로 이뤄졌다면 해당 Principal을 이용하여 세션을 생성하고
그렇지 않다면 UsernameNotFoundException이 터질것이다.
'Spring > Security' 카테고리의 다른 글
| 스프링 시큐리티 / 작동 방식 (0) | 2022.04.25 |
|---|---|
| 스프링 시큐리티 기초 용어 (0) | 2022.04.25 |