[ 정수원 스프링 시큐리티 #1 ] 스프링 시큐리티 기본 API & Filter 이해 (1)

김수호·2024년 3월 3일
0
post-thumbnail

이번 섹션에서는 [스프링 시큐리티 기본 API 및 Filter 이해]에 대해서 알아보자.

👉 목차는 다음과 같다.

1) 인증 API - 프로젝트 구성 및 의존성 추가
2) 인증 API - 사용자 정의 보안 기능 구현

3) 인증 API - Form Login 인증
4) 인증 API - Form Login 인증 필터 : UsernamePasswordAuthenticationFilter
5) 인증 API - Logout 처리, LogoutFilter
6) 인증 API - Remember Me 인증
7) 인증 API - Remember Me 인증 필터 : RememberMeAuthenticationFilter
8) 인증 API - 익명사용자 인증 필터 : AnonymousAuthenticationFilter
9) 인증 API - 동시 세션 제어, 세션 고정 보호, 세션 정책
10) 인증 API - 세션 제어 필터 : SessionManagementFilter, ConcurrentSessionFilter
11) 인가 API - 권한 설정 및 표현식
12) 인증/인가 API - 예외 처리 및 요청 캐시 필터 : ExceptionTranslationFilter, RequestCacheAwareFilter
13) Form 인증 - 사이트 간 요청 위조 : CSRF, CsrfFilter

이번 섹션은 1) ~ 2), 3) ~ 5), 6) ~ 8), 9), 10), 11), 12), 13) 로 나눠서 포스팅하고자 한다.

바로 하나씩 확인해보자.


1) 프로젝트 구성 및 의존성 추가

API에는 크게 인증 API와 인가 API 두 가지로 나눠서 학습한다. 먼저 인증 API에 대해서 알아볼 것이다.

그 전에 먼저 프로젝트를 생성하자.

① 프로젝트 구성 및 의존성 추가

  • Project: Maven Project
  • Language: Java
  • Spring Boot: 2.2.1
  • Project Metadata
    • Group: io.security
    • Artifact: corespringsecurity
    • Name: corespringsecurity
    • Package name:io.security.corespringsecurity
    • Packaging: Jar
    • Java version: 1.8
  • Dependencies
    • Spring Web

 

👉 프로젝트 생성 후, SecurityController 클래스를 생성해서 실행해보자.

  • SecurityController 생성
  • 실행해보자.
    • 루트 경로 접속 시, 정상적으로 "home" 문자열이 출력되는 것을 확인할 수 있다.

 

❗ 그런데 지금 우리 시스템에는 문제점이 있다. 아무런 보안이 적용되지 않았다는 점이다. 따라서 누구라도 우리 시스템에 접근이 가능하다. ( 특별한 권한이 없어도, 사용자마다 인증을 받지 않고도, 모든 자원에 접근이 가능하다. )

 

👉 그러면 이제 우리 시스템을 보안이 적용된 시스템으로 변경해보자.

  • 가장 먼저 해야할 작업은 pom.xml 에 시프링 시큐리티 의존성을 추가하는 작업이다.
    • 이렇게 dependency를 추가하면, 우리의 시스템은 그 즉시 보안이 작동하는, 보안이 적용된 시스템으로 바뀌게 된다.
  • 이제 서버 재기동 후 다시 접근해보자. ( Load Maven Changes 후 재기동 하자. )
    • 스프링 시큐리티 의존성을 추가 후 접근해보니, 루트 경로로 접근되지 않고 로그인 페이지가 생성되어 화면이 출력되는 것을 볼 수 있다. ( 참고로 로그인 페이지는 스프링 시큐리티가 기본으로 제공해준다. )
    • 이제 우리는 루트 경로를 포함해서 어떤 경로에 접근을 하기 위해서는 반드시 인증을 받아야만 그 자원에 접근이 가능한 구조로 변경되었다.
  • 기본적으로 제공하는 계정 정보는 다음과 같다.
    • username : user
    • password : console에 출력된 임의의 랜덤값이다.
  • 위 정보로 로그인 하면, 이제 루트 경로에 접근 가능해진다.
    • 이렇게 우리가 의존성을 추가한 이후부터는, 인증을 받은 사용자만 자원에 접근이 가능하고, 인증을 받지 않으면 로그인 페이지로 이동되어 인증을 받도록 보안 기능이 작동하는 시스템으로 변경되었다.

 

🤔 그러면 우리가 의존성을 추가했을 때, 어떤 절차를 거쳐서 이러한 보안 기능이 작동하게 되는 것일까?

✔️ 스프링 시큐리티의 의존성 추가 시 일어나는 일들

  • 서버가 기동되면 스프링 시큐리티의 초기화 작업 및 보안 설정이 이루어진다.
  • 따라서 우리가 별도의 설정이나 구현을 하지 않아도 기본적인 웹 보안 기능이 현재 시스템에 연동되어 작동한다. 기본적인 웹 보안 기능은 아래와 같다.
    • 1) 모든 요청은 인증이 되어야 자원에 접근이 가능하다.
    • 2) 인증 방식은 폼 로그인 방식과 httpBasic 로그인 방식을 제공한다.
      • 참고) 위에서 우리는 폼 로그인 방식으로 인증했다.
    • 3) 기본 로그인 페이지를 제공한다.
    • 4) 기본 계정 한 개를 제공한다.
      • username : user
      • password : 랜덤 문자열

✔️ 문제점

  • 계정 추가, 권한 추가, DB 연동 등
  • 기본적인 보안 기능 외에 우리의 시스템에서 필요로 하는 더 세부적이고 추가적인 보안기능이 필요하다.

다음 내용부터는 현재의 시스템의 문제점을 개선해서 좀 더 나은 보안 시스템으로 만들어보자.


2) 사용자 정의 보안 기능 구현

이전 내용에서 스프링 시큐리티 의존성을 추가했다.

의존성을 추가하고 서버를 기동하게 되면, 스프링 시큐리티가 초기화 되면서 웹 보안 기능을 활성화하고, 그리고 보안 기능이 우리 시스템에 반영되어 작동되는 것을 확인했다.

그런데 문제점이 있었다. 먼저, 보안 기능이 작동되긴 하지만 현재 우리 시스템에 계정이 하나밖에 없다는 점. 그리고 권한을 추가하거나 변경할 수 없다는 점. 그리고 해커의 침입에 대비할 수 있는 보안 옵션 기능 등이 없다. 지금 우리의 보안 시스템은 아주 단순한 최소한의 기능만 가지고 있다. 따라서 안전한 시스템을 만들기 위해서는 이러한 문제점들을 개선하고 보완할 필요성이 있다.

그래서 이번 내용에서는 사용자 정의 보안 기능을 구현하는 방법에 대해서 알아보자. ( 먼저, 보안 기능을 구현하기 위해서 우리가 알아야 할, 우리가 이해하고 있어야 할 항목들에 대해서 살펴보고, 사용자 정의 보안 기능 설정 클래스를 만들어서 확인해보자. )

✔️ WebSecurityConfigurerAdapter

  • 스프링 시큐리티의 웹 보안 기능을 초기화하고 설정하는 클래스이다.
  • HttpSecurity 클래스를 생성한다. 생성된 HttpSecurity 는 세부적인 보안 기능을 설정할 수 있는 API를 제공한다.
  • 따라서 WebSecurityConfigurerAdapter, HttpSecurity 이 두 클래스가, 우리가 스프링 시큐리티 의존성을 추가했을 때, 우리의 시스템에 가장 기본적인 웹 보안 기능을 활성화하고 그 보안 기능이 작동하게끔 하는 역할을 한다.
  • (참고) WebSecurityConfigurerAdapter 클래스는 스프링 시큐리티의 웹 보안 기능의 초기화 및 설정들을 담당하는 내용이 담겨있으며, 내부적으로 getHttp() 메소드가 실행될 때 HttpSecurity 클래스를 생성하게 된다. 이때의 HttpSecurity 는 인증/인가 API들의 설정을 제공한다.

 

✔️ 이제 SecurityConfig 라는 이름의 사용자 정의 보안 설정 클래스를 생성하자. 그리고 해당 설정 클래스가 WebSecurityConfigurerAdapter 를 상속받도록 작성하자. 그렇게 되면 우리가 만든 SecurityConfig 설정 클래스 안에서 HttpSecurity 클래스를 사용해서, 세부적이고, 좀 더 우리가 추가적으로 설정할 수 있는 API 들을 활용해서 사용자 정의 보안 기능을 구현할 수 있다. ( HttpSecurity 는 인증 API와 인가 API를 설정할 수 있는 여러가지 API들을 제공한다. )

👉 코드로 적용해보자.

  • SecurityConfig 생성
    • SecurityConfig 클래스를 생성하고, WebSecurityConfigurerAdapter 클래스를 상속받는다. 그리고 WebSecurityConfigurerAdapter 클래스가 가지고 있는 메서드 중에서 HttpSecurity 클래스를 파라미터로 전달받는 configure 메서드를 오버라이드 한다. 그래서 configure 메서드 안에서 인증이나 인가와 관련된 API를 설정해서 우리만의 사용자 정의 보안 기능을 구현할 수 있도록 하자.
    • 참고) 이번 내용에서는 최대한 스프링 시큐리티가 초기화될 때 사용하는 기본 설정과 동일하게 작성했다.
  • application.properties 추가
    • 시큐리티 인증 계정에 대한 정보를 환경 설정 파일에 직접 정의할 수 있다.
  • 실행해보면, 우리가 작성한 SecurityConfig 클래스를 기반으로 보안 기능이 작동하는 것을 확인할 수 있다.

 

이번 내용에서는 사용자 정의 보안 기능을 구현하기 위해 보안 설정 클래스를 추가했다. 그리고 애플리케이션 구동시 우리가 작성한대로 보안 기능이 작동하는 것을 확인해보았다.

다음 내용부터는 추가한 클래스에 (인증 / 인가) 처리를 위한 여러가지 내용을 더 추가하고, 보안에 필요한 보안 옵션 등 다양한 API 들을 작성하고 테스트해보자.


강의를 듣고 정리한 글입니다. 코드와 그림 등의 출처는 정수원 강사님께 있습니다.

profile
현실에서 한 발자국

0개의 댓글