[Spring Security] Spring Security 개념과 작동 방식

권하준·2024년 5월 29일
1

Spring Boot

목록 보기
13/14

JWT 공부에 앞서, Spring Security에 대한 이해가 너무 부족하여, 해당 부분을 먼저 선행하고자 한다.
이번에는 본격적으로 Spring Security를 사용하기에 앞서, 개념과 작동 방식에 대해 공부해보고자 한다.

01. Spring Security란?

✨ Spring Security 개념

Spring Security는 Spring 프로젝트에서 애플리케이션의 인증, 인가 등의 보안을 담당하는 스프링 하위의 프레임워크이다.

🎈 인증과 인가

  • 인증(Authentication): 애플리케이션에 접근하는 유저의 신원을 확인하는 과정
  • 인가(Authorization): 유저가 어떠한 자원(Resource)에 접근할 수 있는지 검증하는 과정

✨ Spring Security 사용 이유

  • 특정 URL에 대하여 인증되지 않은 사용자의 접근을 막아준다.
    예를 들어 Path Parameter 방식으로 정의된 아래와 같은 URL이 존재한다고 가정해보자

    • http://post/***{post-id}***/edit/
      위 URL에는 해당 POST를 작성한 User만 접근해야하는데, 해당 글에 대한 인가 처리를 하지 않는다면 그 외의 사용자가 위 URL에 직접 접근할수도 있다.
      Spring Security를 통해 이러한 URL에 인증/인가를 간편하게 구현할 수 있다.
  • CSRF(Cross-site request forgery)를 막아준다.

    🎈 CSRF
    사용자가 자신의 의지와 무관하게, 공격자가 의도한 행위를 특정 웹사이트에 요청하도록 공격하도록 하는 행위

    • ex) 어느 사용자가 특정 링크를 클릭하면, 자신도 모르게 해당 게시글이 삭제됨
    • 이는 승인되지 않은 사용자가 인증/인가 없이 특정 요청(Request)를 보낼수 있기 때문
    • 스프링 시큐리티를 사용하면 이러한 요청에 대한 인증/인가를 요구하여, CSRF를 막아준다.
  • 세션 고정 약점(Session Fixation)을 막아준다.

    🎈 세션 고정 약점(Session Fixtion)

    • 서버는 종종 클라이언트의 정보를 기억해야할 필요가 있음(ex. 쇼핑몰 장바구니 등)
    • 이를 위해 세션 아이디(Session Id) 를 사용, 클라이언트가 서버에 처음 방문할때 서버는 각 클라이언트에 대한 세션 아이디를 서버에 저장이후 클라이언트 구별에 사용
    • 이러한 세션 아이디를 외부의 사용자가 갈취 및 이후 서버 접근에 사용할 경우, 인가되지 않은 페이지에 접근 허용
    • 이를 세션 고정 약점(Session Fixation)이라 부름
    • Spring Security에서는 이러한 세션 고정 약점 방어 로직이 기본적으로 적용되어 있음
  • 이 외에도 다양한 장점이 존재한다.

✨ Spring Security의 특징

  • Spring Security는 세션-쿠키 인증을 사용한다.

    🎈 세션-쿠키 인증

    클라이언트를 식별할수 있는 세션 아이디를 서버에 저장, 이후 클라이언트의 요청시 이를 사용하여 식별하는 방법. 동작 과정은 아래와 같음

    • 클라이언트가 서버에 처음으로 접근(서버에 Requset를 보냄)
    • 서버는 Session id 쿠키가 함께 왔는지 확인, 그렇지 않으면 새로운 세션 아이디를 발급후 클라이언트에 응답
    • 클라이언트는 응답받은 세션 아이디를 쿠키에 저장
    • 이후 클라이언트는 서버에 접근할 때 마다, 쿠키에 저장된 세션 아이디를 함께 보냄
    • 서버는 날아온 세션 아이디를 통해 클라이언트 식별
    • 이후 브라우저가 종료되면 세션 아이디 제거
  • 아노테이션을 사용해 쉽고 간단하게 구현할 수 있다.

  • Security Filter Chain기반으로 동작한다.

    🎈 Security Filter Chain
    인증, 인가 등 보안과 관련된 여러가지 필터들의 모음

    필터 체인에 관련된 자세한 내용은 아래에서 설명한다.


02. Spring Security 작동 방식

스프링 시큐리티는 Security Filter Chain을 기반으로 동작한다.
이에 대한 전체 작동 방식은 아래와 같다.

✨ Security Filter Chain 전체 작동 구조

클라이언트가 Request를 보내면, Servlet에 도착하기 전에 여러가지 필터를 거치게 된다.
여기서 이러한 Filter들을 Servlet까지 엮어서 Filter Chain이라고 부른다.
Security Filter는 이러한 필터중 Delegating Filter Proxy를 통해 동작한다.

- Delegating Filter Proxy

스프링에서 제공하는 필터중 하나. 필터체인에 속하지 않은 객체를 필터처럼 동작할 수 있게 해준다.

Delegating Filter Proxy를 통해, 외부에서도 Filter Chain에 필터를 추가 할 수 있다.

스프링 시큐리티는 이 중 Filter Chain Proxy을 사용한다.

- Filter Chain Proxy

스프링 시큐리티에서 제공하는 특수 필터이다. FilterChainProxy는 Bean 객체이므로, 일반적으로 Delegating Filter Proxy로 분류된다.

- Security Filter Chain

스프링 시큐리티 필터들이 묶여있는 필터 체인.
하나의 애플리케이션에 여러개의 시큐리티 필터 체인이 존재할 수 있다.

✨ 전체 작동 구조2(좀더 구체적으로)

Application Context 초기화/시큐리티 필터 체인 생성


스프링 개발자들은, WebSecurityConfigurerAdopter 클래스를 사용해 스프링 시큐리티를 정의한다.(버전이 업데이트 되면서 더 이상 Adopter는 사용하지 않고 현재는 SecurityFilterChain를 사용한다.)

처음 시큐리티 필터를 초기화 할 때는 이러한 WebSecurityConfigurerAdopter(현재는 SecurityFilterChain)를 참조하여 필터를 생성한다.

이때 실제로 필터의 생성은 WebSecurity가 담당하며, 생성된 필터들은 WebSecurity 클래스 -> FilterChainProxy 로 순차적으로 전달된다.

시큐리티 필터 체인

이후 사용자의 요청이 날아오면 아래와 같은 시큐리티 필터 체인을 거치게 된다.
각 필터에 대한 설명은 아래에 기술한다.

  • SecurityContextPersistenceFilter: SecurityContext를 가져오거나 생성
  • LogoutFilter: 로그아웃 요청을 처리
  • UsernamePasswordAuthenticationFilter: ID, Password를 기반으로 유저 인증을 처리한다(로그인)
  • ConcurrentSessionFilter: 동시 세션 처리에 관련된 필터. 하나의 계정에 대한 사용자가 여러명일 때 실행되는 필터
  • RememberMeAuthenticationFilter: 사용자의 세션이 사라지거나 만료된 경우, 쿠키나 DB 등으로 인증을 처리하는 필터
  • AnonmouAuthenticationFilter: 인증되지 않은 사용자에 대한 접근을 처리하는 필터
  • SessionManagementFilter: 로그인 후 세션에 관한 처리를 담당하는 필터
  • EceptionTranslationFilter: 인증/인가에서 발생되는 에러를 처리하는 필터
  • FilterSecurityInterceptor: 권한 부여 등을 외부에서 설정할 수 있게 넘겨줌

자세한 설명은 여기를 참고하자.



🎈 Reference

profile
자바 BE 개발자 지망생입니다.

0개의 댓글