Spring Security란?
영어에서 번역됨-Spring Security는 엔터프라이즈 애플리케이션에 대한 인증, 권한 부여 및 기타 보안 기능을 제공하는 Java / Java EE 프레임 워크입니다. 위키백과(영어)
본인이 이해한 바로는.. 특정페이지에 대한 접근을 제어하거나 권한을 부여할 때 사용하거나,
DB의 저장되는 비밀번호를 암호화 해줄 때 사용한다. (그 외에도 많겠지만..)
우선 SpringBoot에서 Security를 사용하기 위해선.. (Spring Boot + gradle 기준)
build.gradle파일에서 dependencies 안에 추가해준다.
implementation 'org.springframework.boot:spring-boot-starter-security'
자 이제 Security의 설정을 하기 위해 Config파일을 생성한다. (클래스명은 본인 맘대로!)
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean // 로그인 시 실행되는 메소드
public AuthenticationProvider authenticationProvider(){return new LoginAuthenticationProvider();}
@Bean // 로그인 성공 시 실행되는 메소드
public AuthenticationSuccessHandler successHandlerHandler() {
return new LoginSuccessHandler();
}
@Bean // 로그인 실패 시 실행되는 메소드
public AuthenticationFailureHandler failureHandlerHandler() {
return new LoginFailureHandler();
}
@Bean // 패스워드 암호화 관련 메소드
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/css/**", "/js/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()// 세션을 사용하지 않고 JWT 토큰을 활용하여 진행, csrf토큰검사를 비활성화
.authorizeRequests() // 인증절차에 대한 설정을 진행
.antMatchers("/", "/error/*", "/login", "/loginProc").permitAll() // 설정된 url은 인증되지 않더라도 누구든 접근 가능
.anyRequest().authenticated()// 위 페이지 외 인증이 되어야 접근가능(ROLE에 상관없이)
.and()
.formLogin().loginPage("/login") // 접근이 차단된 페이지 클릭시 이동할 url
.loginProcessingUrl("/loginProc") // 로그인시 맵핑되는 url
.usernameParameter("userId") // view form 태그 내에 로그인 할 id 에 맵핑되는 name ( form 의 name )
.passwordParameter("userPw") // view form 태그 내에 로그인 할 password 에 맵핑되는 name ( form 의 name )
.successHandler(successHandlerHandler()) // 로그인 성공시 실행되는 메소드
.failureHandler(failureHandlerHandler()) // 로그인 실패시 실행되는 메소드
.permitAll()
.and()
.logout() // 로그아웃 설정
.logoutUrl("/logout") // 로그아웃시 맵핑되는 url
.logoutSuccessUrl("/") // 로그아웃 성공시 리다이렉트 주소
.invalidateHttpSession(true); // 세션 clear
}
}
설명을 해 보자면..
- @Configuration
환경 세팅(스프링의 기본 설정 정보들)을 돕는 어노테이션
클래스의 어노테이션을 @Configuration라고 선언하면 스프링에게 이 클래스는 환경 구성 파일이고 @Bean 어노테이션을 통하여 Bean임을 알려주게 된다.
- @Bean
개발자가 작성한 메서드의 return 되는 객체를 Bean으로 만드는 것이다.
그렇다면 Bean은 무엇일까?
Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 한다.
- WebSecurityConfigurerAdapter
스프링 시큐리티 설정에 관련된 클래스로 해당 클래스에 있는 메서드를 오버라이딩하여 시큐리티를 설정한다.
로그인에 관련된 메서드 : return되는 클래스들은 커스텀으로 구현하여야 한다.
@Bean
public AuthenticationProvider authenticationProvider(){return new LoginAuthenticationProvider();}
@Bean
public AuthenticationSuccessHandler successHandlerHandler() {
return new LoginSuccessHandler();
}
@Bean
public AuthenticationFailureHandler failureHandlerHandler() {
return new LoginFailureHandler();
}
패스워드 암호화와 관련된 메소드
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
정적 페이지는 어디서든 접근 가능하도록 설정하는 메서드
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/css/**", "/js/**");
}
접속 권한을 제어하는 메서드
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()// 세션을 사용하지 않고 JWT 토큰을 활용하여 진행, csrf토큰검사를 비활성화
.authorizeRequests() // 인증절차에 대한 설정을 진행
.antMatchers("/", "/error/*", "/login", "/loginProc").permitAll() // 설정된 url은 인증되지 않더라도 누구든 접근 가능
.anyRequest().authenticated()// 위 페이지 외 인증이 되어야 접근가능(ROLE에 상관없이)
.and()
.formLogin().loginPage("/login") // 접근이 차단된 페이지 클릭시 이동할 url
.loginProcessingUrl("/loginProc") // 로그인시 맵핑되는 url
.usernameParameter("userId") // view form 태그 내에 로그인 할 id 에 맵핑되는 name ( form 의 name )
.passwordParameter("userPw") // view form 태그 내에 로그인 할 password 에 맵핑되는 name ( form 의 name )
.successHandler(successHandlerHandler()) // 로그인 성공시 실행되는 메소드
.failureHandler(failureHandlerHandler()) // 로그인 실패시 실행되는 메소드
.permitAll()
.and()
.logout() // 로그아웃 설정
.logoutUrl("/logout") // 로그아웃시 맵핑되는 url
.logoutSuccessUrl("/") // 로그아웃 성공시 리다이렉트 주소
.invalidateHttpSession(true); // 세션 clear
}
'IT > Spring' 카테고리의 다른 글
[Spring] @PathVariable 과 @RequestParam 이란? (0) | 2021.11.30 |
---|---|
[Spring] 의존성 관리방법(Dependency Injection- Setter Injection/Constructor Injection) (0) | 2021.07.18 |
[Spring] Spring Bean Configuration File의 beans, bean속성과 속성값 이해하기 (0) | 2021.07.18 |
[Spring] AOP (Log 사용예시) (0) | 2021.07.14 |
[Spring] Dynamic Web Project로 스프링 프로젝트 생성하기 (2) | 2021.07.05 |