<aside> 💡 들어가기 앞서 인증인가의 명확한 차이를 구분할 줄 알아야 한다. 인증 : 사용자의 신원을 확인 (로그인) 인가 : 특정 리소스나 기능에 접근할 수 있는 권한 (등급)

</aside>

1. Overview

만약 인증인가의 체계를 갖추지 않은 경우, 애플리케이션에 악성 코드가 삽입될 가능성이 있다. 또 데이터베이스나 파일 시스템 등에 대한 무분별한 접근을 허용하게 되면, 중요한 데이터가 노출될 가능성이 있다.

따라서 애플리케이션을 개발하는 데 있어 보안은 필수적이라고 할 수 있다.

MyShop 애플리케이션은 REST API이다. REST API는 stateless하다는 특징을 갖고 있는데, 이는 서버가 클라이언트의 상태 정보를 저장하지 않는다는 것을 의미한다. 따라서 클라이언트는 모든 요청에 필요한 정보를 요청에 포함시켜 보내야 한다.

예를 들어, 전통적인 웹 애플리케이션은 클라이언트가 로그인을 하고 세션 ID를 서버에 저장하는 방식이지만, REST API는 클라이언트가 로그인 후 서버에서 발급된 액세스 토큰을 사용해 모든 요청에 대한 인증 및 인가를 처리한다.

정리하면 REST API는 stateless한 특징을 가지고 있어 확장성이 뛰어나고 여러 서버로 작업 부하를 분산시킬 수 있다는 장점을 가지고 있다. stateless한 특징으로 인해 서버가 세션 등에 인증 정보를 유지하거나 저장하지 않다는 점인데, 이를 보완하기 위해 JWT를 이용한 인증 및 인가를 많이 사용한다.

2. 스프링 시큐리티

스프링 시큐리티는 애플리케이션의 인증, 인가 등의 보안 기능을 제공하는 스프링 하위 프로젝트 중 하나이다.

2.1. 스프링 시큐리티의 동작 구조

스프링 시큐리티는 서블릿 필터를 기반으로 동작하고 디스패처 서블릿 앞에 필터가 배치되었다.

Untitled

여기서 나오는 필터 체인은 서블릿 컨테이너에서 관리하는 **ApplicationFilterChain**을 말한다.

클라이언트에서 애플리케이션으로 요청을 보내면 서블릿 컨테이너는 URI를 확인 후 필터와 서블릿을 매핑한다. 스프링 시큐리티는 사용하고자 하는 필터체인을 서블릿 컨테이너의 필터 사이에서 동작시키기 위해 **DelegatingFilterProxy**를 사용한다.

DelegatingFilterProxy 내의 FilterChainProxy 구조

Untitled

DalegatingFilterProxy는 서블릿 컨테이너의 생명주기와 스프링 애플리케이션 컨텍스트 사이에서 다리 역할을 수행하는 필터 구현체다. 표준 서블릿 필터를 구현하며, 역할을 위임할 필터체인 프록시를 내부에 가지고 있다. (필터체인 프록시는 스프링 부트에의 자동 설정에 의해 자동으로 생성됨)