Spring Security : 사용자 정의 보안 기능 구현

    이 글은 인프런 정수원님의 강의를 복습하며 정리한 글입니다. 

    Spring Security 사용자 정의 보안 기능

    앞선 게시글에서 Spring Security는 아주 기초적인 보안 기능을 제공한다고 했다. 그렇지만 아주 기초의 기초이기 때문에 그걸 그대로 사용할 수 없다. 따라서 사용자는 Spring Security가 제공하는 기능을 확장해서 사용자 정의 보안 기능을 구현해야한다. 

    기본적으로 Spring Security는 WebSecurityConfigurerAdapter 클래스를 이용해 보안을 설정해준다. 따라서 사용자 정의 보안 설정을 하고 싶다면, WebSecurityConfigurerAdapter 클래스를 상속한 클래스를 만들어주고, 빈으로 등록해줘야 한다. 

     

    Spring Security Form 인증 방식

    1. 사용자가 서버에게 요청을 한다.
    2. 서버는 접근 권한이 없는 사용자인 경우, 로그인 페이지로 Redirect 해준다.
    3. 사용자는 Form 형식으로 인증을 시도한다. 이 때, 서버는 세션을 생성한다. 
    4. 인증이 완료되면 인증 객체를 만든다. 그리고 인증 객체를 Security Context에 담는다. Security Context는 Session에 담긴다.
    5. 서버는 사용자에게 응답을 내려줄 때, 헤더에 JSESSIONID를 담아서 전달해준다.
    6. 사용자는 다음부터 요청을 할 때, JSESSIONID를 포함해서 접근하고, 서버는 JSESSIONID를 이용해 인증받은 토근이 있는지 확인한다. 토큰으로 로그인 유지 기능을 구현해준다. 

     

     

    Spring Security 사용자 정의 보안 기능 실습

    • WebSecurityConfigurerAdapter 클래스를 상속한 클래스 만들기
    • 상속 클래스에 @Configuration / @EnableWebSecurity 어노테이션 붙이기
    • 상속 클래스에서 configure(HttpSecurity http) 메서드 오버라이드 하기 

    Spring Security 사용자 정의 보안 기능을 구현하려면 위의 세 가지를 해줘야 한다. 

     

    WebSecurityConfigurerAdapter는 앞서 이야기 했던 것처럼 이 클래스를 통해 스프링 Securiy가 해당 웹의 전체 보안 정보를 설정한다고 했다. 따라서 사용자 정의의 기능을 등록하기 위해서 개발자는 이 클래스를 상속받은 클래스를 만들어야 한다. 

    상속받은 클래스는 사용할 것이기 때문에 @Configuration 어노테이션을 이용해 스프링 빈으로 등록해준다. @EnableWebSecurity는 내부적으로 4개의 설정 정보 클래스를 Import 해서 추가적인 설정을 해주는 것을 볼 수 있다. 이 설정 정보가 Import 되어야 해당 클래스가 Spring Security의 보안 클래스로 동작한다고 한다. 자세한 내용은 아직 모르기 때문에 추후 포스팅에서 업데이트를 하고자 한다. 

    위 메서드를 오버라이드 한다. WebSecurityConfigurerAdapter 클래스는 이미 완벽히 구현된 클래스이기 때문에 이걸 상속받은 클래스를 만들어도 무언가를 구현하라고 하지 않는다. 따라서 개발자가 필요한 메서드를 구현해야 하는데, 인증 / 인가 관련 설정하는 메서드는 configurer(HttpSecurity http) 메서드이기 때문에 이 메서드를 오버라이드 해준다. 

     

     

    Spring Security 사용자 정의 보안 코드 작성

    @Configuration
    @EnableWebSecurity
    public class BasicSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
    
            // 인가
            http
                    .authorizeRequests()
                    .anyRequest().authenticated();
            // 인증
            http
                    .formLogin();
    
        }
    }

    http 객체는 Spring Security와 관련된 보안 설정 기능을 제공한다. http 객체에 여러가지 API를 적용해서 원하는 보안 기능을 추가로 설정할 수 있다. 인가 / 인증 관련된 모든 API를 설정할 수 있는데 우선 위와 같이 설정했다. 

    먼저 인가 관점에서는 authorizedRequests() + anyRequest()를 통해 어떤 요청이든 검증(authenticated) 하겠다라고 설정했다. 따라서 WAS로 들어오는 모든 Request들은 앞으로 Spring Security가 제공하는 보안 인증을 통과해야 리소스에 접근이 가능해진다. 

    formLogin 기능을 이용해서 어떤 형태로 로그인할지를 설정했다. Spring Security는 Form 로그인 기능 / HttpBasic 로그인 방식을 지원하는데, formLogin API를 사용하면 Form Login 형식으로 인증되도록 설정이 된다.

    localhost:8080

    위의 설정 정보를 등록하고 localhost:8080으로 접속하면 위와 같이 Spring Security가 제공하는 기본 로그인 페이지가 정상적으로 뜨는 것을 볼 수 있다. 

     

    정리

    • 사용자 정의 보안 기능을 구현하려면 WebSecurityConfigurerAdatpter를 상속받은 클래스를 만들고, 그 클래스에 @Configuration / @EnableWebSecurity 어노테이션을 붙여준다.
    • 이렇게 할 경우, 사용자 정의 보안 기능을 시작할 수 있게 된다. 

    댓글

    Designed by JB FACTORY