hara
Spring Boot 2.0 - 6장: 스프링보안 본문
#Spring Security란?
Spring Security는 Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크이다. Spring Security는 '인증'과 '권한'에 대한 부분을 Filter 흐름에 따라 처리하고 있다.
Filter는 Dispatcher Servlet으로 가기 전에 적용되므로 가장 먼저 URL 요청을 받지만, Interceptor는 Dispatcher와 Controller사이에 위치한다는 점에서 적용 시기의 차이가 있다.
Spring Security는 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안관련 로직을 작성하지 않아도 된다는 장점이 있다.
이러한 Spring Security의 아키텍쳐는 아래와 같다.
#Spring Security Filter
#Spring Security 기본 구성
- pom.xml > dependency
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- SecurityConfig.java
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private SecLogoutSuccessHandler logoutSuccessHandler;
@Inject
private SecAjaxAuthenticationSuccessHandler secAjaxAuthenticationSuccessHandler;
@Inject
private SecAjaxAuthenticationFailureHandler secAjaxAuthenticationFailureHandler;
@Inject
private SecAuthenticationEntryPoint authenticationEntryPoint;
@Autowired
private UserDetailsService userDetailsService;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider());
}
//허용되어야 할 경로들
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring()
.antMatchers("/assets/**")
.antMatchers("/upload/**")
.antMatchers("/font/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.headers() // 헤더 보안
.frameOptions().sameOrigin()
.httpStrictTransportSecurity().disable()
.and()
.csrf().disable()
.exceptionHandling()
.authenticationEntryPoint(authenticationEntryPoint)
.accessDeniedPage("/login")
.and()
.formLogin() //form 태그 기반의 로그인 설정
.loginProcessingUrl("/authentication")
.successHandler(secAjaxAuthenticationSuccessHandler)
.failureHandler(secAjaxAuthenticationFailureHandler)
.usernameParameter("id")
.passwordParameter("pwd")
.permitAll()
.and() //로그아웃 설정
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/admin/logout"))
.logoutSuccessHandler(logoutSuccessHandler)
.permitAll()
.and() // 페이지 인증, 비인증 설정
.authorizeRequests()
/** 인증 필요 */
.antMatchers( "/admin/**" )
.hasAnyAuthority(
Constants.AuthoritiesConsf.ADMIN
)
/** 그 외는 인증 불필요 */
.antMatchers("/**").permitAll();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService);
authenticationProvider.setPasswordEncoder(passwordEncoder());
return authenticationProvider;
}
}
- config를 통해 security 기본 설정
- @EnableWebSecurity 어노테이션을 통해 스프링 시큐리티를 사용하겠다라고 선언
- 로그인 페이지에서 보내주는 form > input의 name 매칭 필요
- <input type="text" name="id" placeholder="아이디">
- <input type="text" name="pwd" placeholder="아이디">
- SecUserDetailService.java를 통해 id, pwd확인 후
- 성공: SecAjaxAuthenticationSuccessHandler.java
- 실패: SecAjaxAuthenticationFailureHandler.java
- 인증이 불필요한 경로 처리: web.ignoring()
- 인증이 불필요한 URI 처리: .authorizeRequests().antMatchers("/**")
- 로그아웃 성공: SecLogoutSuccessHandler.java
- SecurityUtils.java
- Component로 선언된 Security Util을 만들어 프로젝트 전체에서 편하게 사용가능
- getCurrentAdmin() 외에 다양한 Util 선언
- getCurrentAdmin(): Security로 인증 된 사용자의 정보를 가지고 있음
@Component
public final class SecurityUtils {
public static Admin getCurrentAdmin() {
UserDetails userDetails = getCurrentUser();
Admin admin = null;
if(userDetails != null && userDetails instanceof Admin) {
admin = (Admin) userDetails;
}
return admin;
}
}
- java파일에서 Utils를 자유롭게 사용
- jsp파일에서 taglib를 통해 SecurityUils를 가져와 변수로 선언해서 사용
#참고
- 책: Spring Boot2 Recipes 6장
- spring security설명
- https://coding-start.tistory.com/153
- https://mangkyu.tistory.com/76
'공부 > 스프링 부트 2 레시피' 카테고리의 다른 글
Spring Boot 2.0 - 4장: 스프링 MVC - 비동기 (0) | 2020.09.16 |
---|---|
Spring Boot 2.0 - 7장: 데이터 처리 (0) | 2020.09.16 |
Spring Boot 2.0 - 5장: 스프링 웹플럭스 (0) | 2020.08.26 |
Spring Boot 2.0 - 3장: 스프링 MVC (0) | 2020.08.11 |
Spring Boot 2.0 - 2장: 스프링 부트(기본) (0) | 2020.08.11 |