업데이트:

3 분 소요

Spring Security

Spring기반의 어플리케이션을 보호할 수 있는 표준 기술. Spring Security는 사용자화 할 수 있는 강력한 접근 제어, 인증 프레임 워크이며 자바 어플리케이션에 권한 부여와 인증을 제공하는 것에 집중한다. -Spring Security Docs

Spring Security는 권한과 보안에 관한 스프링 프레임워크의 프로젝트이다.

Spring Security에 대해서 먼저 알아가기 전에, 어떤 것들이 웹 어플리케이션의 주요 보안 위협 요소에 대해 알아본다.


웹 어플리케이션의 주요 보안 위협 요소

인증(Authentication)의 절차 미비

  • 인가(Authorization)과 함께 보안 관련 핵심 개념 중 하나
  • 사용자의 신원을 확인하는 과정(로그인 기능과 관련)
  • 어플리케이션 보안의 영역
    • 인증 영역

      사용자의 개인 정보를 확인, 수정 가능한 영역

    • 익명 영역

      사용자의 민감 정보를 노출하지 않아야 하고 시스템의 상태를 변경하거나 데이터를 관리할 수 있는 기능을 제공하지 않아야하는 영역

인가(Authorization) 처리의 미비

  • 사용자에 따라 적절한 권한과 그에 맞는 특정 기능 수행이 가능하고 데이터 접근이 허용되어야 한다.
  • 적절치 못한 권한과 그에 따른 기능 수행은 개인 정보, 민감 데이터 유츨 등 과 같은 보안사고의 발생 가능성이 높아진다.

크레덴셜(Credential) 보안

  • 민감정보(연락처, 결제 정보, 비밀번호 등)는 항상 최우선적으로 보호되어야 한다.
  • 따라서 민감정보는 일반 텍스트로 저장되지 않고 암호화되어야 한다.

전송 레이어 보안

  • https 프로토콜(SSL 보호)의 적용이 필요
    • (Secure Sockets Layer)SSL

      디지털 인증서로 불린다.

      브라우저와 서버 사이의 암호화된 연결을 수립하는데 사용되는 표준 기술

    • (Transport Layer Secure)TLS

      SSL의 상위 버전

  • TLS/SSL 이 적용된 웹은 https 프로토콜이 적용된다.

Spring Security가 제공하는 기능

  • Spring 기반 어플리케이션에 쉽게 적용 가능하며 적은 노력으로 각 상황에 보안을 적용 가능
  • 사용자 인증 및 인가 처리
  • 비교적 쉬운 사용자화
  • 다양한 확장 기능과 자연스러운 추상화(세션 클러스터 기능, Oauth 등)

사용 방법

먼저 Spring Security를 사용하기 위해서는 그에 관련한 Configuration 클래스가 필요하다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

...

}

Configuration 클래스는 WebSecurityConfigurerAdapter를 상속 받아야 하며 @EnableWebSecurity

를 적용해야한다.

WebSecurityConfigurerAdapter 를 상속받게 되면 configure() 메서드를 오버라이드할 수 있게 된다.

Spring Security의 설정은 해당 메서드 안에서 일어나게 된다.

@Override
    protected void configure(HttpSecurity http) throws Exception {
        /*
		 csrf 토큰 활성화시 사용
		 쿠키를 생성할 때 HttpOnly 태그를 사용하면 클라이언트 스크립트가 보호된 쿠키에 액세스하는 위험을 줄일 수 있으므로 쿠키의 보안을 강화할 수 있다.
		*/
        //http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())

        http.csrf().disable()	// csrf 토큰을 비활성화
                .authorizeRequests() // 요청 URL에 따라 접근 권한을 설정
                .antMatchers("/boards/write/**","boards/free/post").auth
...
}

하지만 이전에 configure() 를 오버라이드 하려고 하면 3 종류의 메서드가 발견된다.

security1.png

이는 각각 인자로 AuthenticationManagerBuilder, HttpSecurity, WebSecurity 타입의 변수를 받는다.

세 타입을 인자로 받는 configure 메서드의 각 설명은 아래와 같다.

  • AuthenticationManagerBuilder

    Spring Security를 이용해 만든 웹 어플리케이션에서 사용할 기본 유저를 생성할 수 있다.

    • auth.inMemoryAuthentication
    • auth.JdbcAuthentication
  • HttpSecurity

    세부적인 웹 보안기능 설정을 처리할 수 있는 API를 제공

  • WebSecurity

    필터 체인 관련 전역 설정을 처리할 수 있는 API 제공

    ignoring()을 통해 필터 체인을 적용하고 싶지 않은 리소스에 대해 설정할 수 있다.

    • ignoring()

      일반적으로 정적 리소스(html, css, js 등 Spring Security를 통해 처리하지 않아도 되는 자원)을 AntPattern의 형식으로 설정할 수 있다.

      불필요한 서버 자원 낭비를 방지할 수 있음.

Filter chain?


Spring Security에서는 보안과 관련된 필터를 체인처럼 엮어서 놓는다. 모든 요청은 필터 체인을 반드시 거쳐야 서블릿에 도달하게 된다.

이 과정에서 DelegatingFilterProxyFilterChainProxy 를 사용하게 된다.

  • DelegatingFilterProxy

    서블릿 컨테이너와 스프링 컨테이너(어플리케이션 컨텍스트) 사이의 링크를 제공하는 ServletFilter이다.

    스프링 시큐리티는 DelegatingFilterProxy 필터를 만들어, 메인 필터 체인에 끼워넣고, 그 아래 다시 SecurityFilterChain 그룹을 등록한다. 각 SecurityFilterChain 은 url 패턴에 따라 적용시킬 수 있다.

  • FilterChainProxy

    springSecurityFilterChain의 이름으로 생성되는 필터 빈이며 DelegatingFilterProxy로부터 요청을 위임 받고 실체로 보안을 처리한다.

    스프링 시큐리티 초기화 시 생성되는 필터들을 관리하고 제어한다.

Thymleaf, Spring Security

Thymeleaf는 Spring Security와 관련된 기능을 제공한다.

주로 인증 사용자의 정보를 가져오는데 사용할 수 있다.

Depedency는 thymeleaf와 다르게 추가적으로 설정해주어야 한다.

<dependency>
      <groupId>org.thymeleaf.extras</groupId>
      <artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>

Maven의 경우


implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'

Gradle의 경우

의존성을 추가해준 후 사용하기 위해서 기존에 사용해왔던 thymleaf 사용법에 추가적으로 xmlns 부분을 추가해주어야 한다.

<html lang="ko" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/extras/spring-security">

위 내용을 추가해주면 사용법은 기존 thymeleaf 사용법과 크게 다르지 않다.

<div th:text="${#authentication.name}">
  The value of the "name" property of the authentication object should appear here.
</div>

Reference.

https://www.digicert.com/kr/what-is-ssl-tls-and-https

https://devfunny.tistory.com/615

https://docs.spring.io/spring-security/site/docs/3.0.x/reference/security-filter-chain.html

https://uchupura.tistory.com/24

댓글남기기