Boot Security

스프링 시큐리티 의존성 추가 및 기능

 

  • 의존성 추가하는 코드 (pom.xml에 추가)
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

  • 서버가 기동되면 스프링 시큐리티의 초기화 작업 및 보안 설정이 이루어진다.
  • 별도의 설정이나 구현을 하지 않아도 기본적인 웹 보안 기능이 현재 시스템에 연동되어 작동함.
    • 모든 요청은 인증이 되어야 자원에 접근이 가능하다.
    • 인증 방식은 폼 로그인 방식과 httpBasic로그인 방식을 제공한다.
    • 기본 로그인 페이지 제공한다.
    • 기본 계정 한 개 제공한다. - username (user)/ password (랜덤)

인증 API - 사용자 정의 보안 기능 구현

 


  • WebSecurityConfigurerAdapter 메소드
    1. configure(HttpSecurity http)
      • 서버에 어떤 request 요청이 와도 인증을 받겠다라는 메소드.
      • 권한이 없는 클라이언트가 서버에 접근시 자동적으로 로그인 폼을 보여주고 폼로그인 방식과 httpbasic방식의 인증을 받겠다는 메소드를 구현함. 
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 설정
    1. @EnableSecurity 
      • 보안 설정을 하기위한 여러가지 class들을 자동으로 불러와 주고 자동으로 설정을 잡아주는 어노테이션이다. 
    2. @Configuration
      • IoC 에 등록하는 어노테이션으로 다른 클래스에서 DI를 통해 해당 클래스를 사용할 수 있다.
  • 기존에 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 인증

 

  1. Client가 /home 주소로 접근
  2. 인증이 되지 않은 사용자로 로그인 페이지로 Redirect
  3. 사용자는 login 폼에 아이디와 패스워드를 입력하고 다시 접근 신청
  4. server에서는 session 및 인증 토큰을 생성하고 저장
  5. 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