스프링 시큐리티 의존성 추가 및 기능
- 의존성 추가하는 코드 (pom.xml에 추가)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 서버가 기동되면 스프링 시큐리티의 초기화 작업 및 보안 설정이 이루어진다.
- 별도의 설정이나 구현을 하지 않아도 기본적인 웹 보안 기능이 현재 시스템에 연동되어 작동함.
- 모든 요청은 인증이 되어야 자원에 접근이 가능하다.
- 인증 방식은 폼 로그인 방식과 httpBasic로그인 방식을 제공한다.
- 기본 로그인 페이지 제공한다.
- 기본 계정 한 개 제공한다. - username (user)/ password (랜덤)
인증 API - 사용자 정의 보안 기능 구현
- WebSecurityConfigurerAdapter 메소드
- configure(HttpSecurity http)
- 서버에 어떤 request 요청이 와도 인증을 받겠다라는 메소드.
- 권한이 없는 클라이언트가 서버에 접근시 자동적으로 로그인 폼을 보여주고 폼로그인 방식과 httpbasic방식의 인증을 받겠다는 메소드를 구현함.
- configure(HttpSecurity http)
protected void configure(HttpSecurity http) throws Exception {
this.logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).");
http.authorizeRequests((requests) -> {
((ExpressionUrlAuthorizationConfigurer.AuthorizedUrl)requests.anyRequest()).authenticated();
});
http.formLogin();
http.httpBasic();
}
- SecurityConfig 설정
- @EnableSecurity
- 보안 설정을 하기위한 여러가지 class들을 자동으로 불러와 주고 자동으로 설정을 잡아주는 어노테이션이다.
- @Configuration
- IoC 에 등록하는 어노테이션으로 다른 클래스에서 DI를 통해 해당 클래스를 사용할 수 있다.
- @EnableSecurity
- 기존에 WebSecurityConfigurerAdapter가 가지고 있던 method를 override하여 원하는 기능을 구현하였음.
- .authorizeRequests() : 요청에 대한 것에 보안 검증을 수행
- .anyRequest() .authenticated() : 어떠한 요청에도 보안 검증을 수행함
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest()
.authenticated();
http
.formLogin();
}
}
인증 API - Form 인증
- Client가 /home 주소로 접근
- 인증이 되지 않은 사용자로 로그인 페이지로 Redirect
- 사용자는 login 폼에 아이디와 패스워드를 입력하고 다시 접근 신청
- server에서는 session 및 인증 토큰을 생성하고 저장
- Client는 세션에 저장된 인증 토큰으로 접근 / 인증유지
- 각각의 코드에 대한 설명
- .formLogin() : security에서 기본적으로 제공하는 로그인 폼을 사용
- .loginPage("/loginPage") : 개인 폼을 만들어서 사용을 할 수 있음.
- .defaultSuccessUrl("/") : 로그인 성공시 이동하게 될 Url.
- .failureUrl("/login") : 로그인 실패시 이동하게 될 Url
- .usernameParameter("userId") : form에 사용되는 id의 name 값
- .passwordParameter("passwd") : form에 사용되는 password의 name 값
- .successHandler(new AuthenticationSuccessHandler() {} : 로그인 성공시 수행되는 handler
- .failureHandler(new AuthenticationFailureHandler() {} : 로그인 실패시 수행되는 handler
- .permitAll : 모든 페이지에 대한 접근을 허용함.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest()
.authenticated();
// 윗 부분은 글 위쪽에 설명 해두었음.
http
.formLogin()
// .loginPage("/loginPage")
.defaultSuccessUrl("/")
.failureUrl("/login")
.usernameParameter("userId")
.passwordParameter("passwd")
.loginProcessingUrl("/login_proc")
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
System.out.println("authentication : " + authentication.getName());
httpServletResponse.sendRedirect("/");
}
})
.failureHandler(new AuthenticationFailureHandler() {
@Override
public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
System.out.println("exception : " + e.getMessage());
httpServletResponse.sendRedirect("/login");
}
})
.permitAll();
'Backend > Security' 카테고리의 다른 글
Logout 처리 및 LogoutFilter (0) | 2023.01.03 |
---|---|
UsernamePasswordAuthenticationFilter (0) | 2023.01.03 |
JWT(JSON Web Token) (0) | 2023.01.02 |
CIA, RSA, RFC (1) | 2022.12.29 |
OSI 7계층과 TCP(전송 제어 프로토콜) (0) | 2022.12.29 |