Spring Security 를 사용하여 Config 설정을 하는데 간단한 설정만으로도 로그인/로그아웃 등의 처리가 가능하다.
URL에 대한 접근 권한 설정, 인증 전체 흐름에 필요한 로그인/로그아웃 페이지 설정, csrf 등 모든 설정을 간단한 방법으로 가능하다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Override
public void configure(HttpSecurity http) throws Exception {
http
// 페이지 권한 설정
.authorizeRequests()
.antMatchers(
"/",
"/error",
"/static/**",
"/auth/**",
"/common/callEnd",
"/api/exception/**",
"/api/internal/**",
"/api/wms/internal/**",
"/test/**"
).permitAll() //securityFilter 제외 url
.anyRequest().authenticated() //permitAll외 모든 경로는 인증이 필요
.and()
.formLogin().disable()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/user/logout"))
.addLogoutHandler(logoutAddHandler())
.logoutSuccessHandler(logoutSuccessHandler())
.invalidateHttpSession(true)
.and()
.csrf().ignoringAntMatchers(SecurityConstants.LOGIN_PROCESS_URI)
.and()
.exceptionHandling()
.accessDeniedHandler(accessDeniedHandler())
.authenticationEntryPoint(enrtyPointHandler())
.and()
.headers().frameOptions().sameOrigin()//헤더 same origin설정
.and()
.sessionManagement()
.maximumSessions(1)
.expiredUrl(SecurityConstants.CALL_END_URI);
}
}
- @Configuration
- 해당 클래스를 Java Bean 으로 등록하기 위한 어노테이션
- @EnableWebSecurity
- @Configuration 에 @EnableWebSecurity 어노테이션을 설정하면 Spring Security를 설정할 클래스라는걸 명시
- configure(HttpSecurity http)
- HttpSecurity 를 통해 HTTP 요청에 대한 웹 기반 보안을 구성할 수 있다.
- authorizeRequests()
- HttpServletRequest에 따라 접근(access)을 제한하고 검사한다.
- antMatchers() 메서드로 특정 경로(URL)를 지정한다.
- permitAll() : permitAll() 메서드로 설정된 URL 접근은 인증절차 없이 허용한다.
- hasRole() : antMatchers()와 함께 사용하며 설정된 URL에 대한 접근 권한을 설정한다.
- anyRequest().authenticated() : permitAll() 등 특정 권한 및 인증 절차가 필요없는 URL을 제외하고 모든 URL은 무조건 인증을 완료해야 접근이 가능하다는 의미
.formLogin()
.loginPage("/user/login")
.defaultSuccessUrl("/user/login/success")
.permitAll()
//로그인 api
@RequestMapping(value="/user/login")
public String userLogin(){
return "login";
}
//로그인 page (login.html)
...생략
<form action="/user/login" method="post">
...id 와 password를 입력할 input 태그
<button type="submit">로그인</button>
</form>
- formLogin()
- form 기반으로 인증을 한다. 로그인 정보는 기본적으로 HttpSession을 이용합니다.
- loginPage("/user/login")
- Spring Security 에서 제공하는 기본 form 말고 커스텀 로그인 페이지를 사용하고 싶으면 loginPage()를 설정해야 한다. 또한 /user/login api 요청에서 로그인 페이지를 return 하는데 해당 로그인 페이지에서의 form 태그의 action 과 일치해야한다. action 태그의 url과 loginPage()의 url이 일치해야 submit을 통해 인증 시도
- defaultSuccessUrl("/user/login/success")
- form 태그의 action을 통해 로그인을 시도하고 성공했을 때 이동되는 페이지이다. 해당 URL은 컨트롤러에 URL 매핑이 추가되어 있어야 한다.
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/user/logout"))
.addLogoutHandler(logoutAddHandler())
.logoutSuccessHandler(logoutSuccessHandler())
.invalidateHttpSession(true)
- logout()
- 로그아웃을 설정하는 메서드이며, WebSecurityCOnfigurerAdapter를 사용할 때 자동으로 적용된다.
- 기본적으로 설정을 안하면 "/logout"으로 접근할 시 HTTP 세션을 자동으로 제거한다.
- logoutRequestMatcher(new AntPathRequestMatcher("/user/logout"))
- Spring Security 로그아웃의 기본 URL("logout")이 아닌 다른 URL 로 재정의한다.
- "/user/logout" 으로 재정의하며 마찬가지로 컨트롤러에 URL 매핑 설정이 되어있어야 한다.
- logoutSuccessHandler()
- invalidateHttpSession(true)