Spring Security는 Spring Application 개발시에 보안을 적용하기 위해 사용하는 보안 프레임워크 입니다. Spring Security는 웹 보안을 위하여 인증 및 보안 관련 로직을 제공합니다. 특히 Spring Security의 가장 중요한 기능 중 하나는 리소스별 권한 제어인데, Spring Security에서는 설정을 통해 리소스별 권한 제어, 리소스별 인증 로직 구현을 쉽게 구현할 수 있습니다.
Spring Security는 Filter 한 종류로 사용자의 요청이 Servlet Application에 도착하기 전에 사용자의 요청을 먼저 받아 사용자의 요청의 권한 및 보안 점검을 시행합니다. D Spring Seucity는 어떤 식으로 동작할까요?
우리가 HTTP 요청을 Servlet이 HTTP 요청을 받아 Controller에 HTTP 요청을 전달해줍니다. 그러나 때로는 Servlet에 HTTP 요청에 전처리를 해주거나 사용자에게 전달하는 응답에 후처리를 해줘야할 때가 있습니다. 예를 들면 모든 요청과 응답에 대한 로깅, 요청의 보안 검사가 있습니다. 이런 전처리 후처리를 담당하는 컴포넌트를 Filter라고 합니다.
위의 그림은 Filter의 동작 방식을 나타낸 그림입니다. 여러 Filter는
1 -> 2 -> 3 -> Servlet -> 3 -> 2 -> 1
순서대로 처리가 되는 것을 볼 수 있습니다. 이를 Filter Chain
라 합니다. Filter들을 순서대로 거치면서 요청의 전처리 후처리가 되는 것이죠.
Spring Security는 앞서 설명한 Filter를 이용하여 보안을 수행합니다. 일반적인 Filter의 경우 모든 요청에 모든 Filter가 동작합니다. 그러나 Spring Security는 사용자가 접근하는 리소스에 따라서 보안 및 인증 처리를 하기 때문에 일반적인 Filter가 아닌 FilterChainProxy
를 구현하여 사용합니다.
위의 구조는 Spring Security의 Filter 구조입니다. DelegatingFilterProxy는 Spring Bean을 Filter로 등록할 수 있게 해주는 Proxy 객체입니다. Spring Security는 SecurityFilterChain이라는 FilterChainProxy를 Filter로 등록하는데, 이는 Rosource 별로 다른 FilterChain을 등록하게 만들어 주는 역할을 합니다. Spring Security는 이러한 구조를 통해서 사용자가 접근하려는 리소스별로 보안 로직을 다르게 하는 유연한 구조를 가지고 있습니다.
우리는 이제 리소스별로 어떠한 Filter를 적용할 것인지 선언만 해주면 Spring Security가 그에 맞는 보안을 수행하게 할 수 있습니다. Spring Security에서 사전에 구현해 놓은 Filter를 적용하여도 되고, 아니면 커스텀 Filter를 만들어 적용할 수도 있습니다.
위의 그림은 Spring Security에서 기본적으로 제공하는 Filter의 동작 순서와 리스트 입니다. 다음 시간에는 실제로 설정 파일에서 사용할 Filter를 설정하고 사용하지 않을 Filter를 제거하고, URL별로 권한 체크와 Filter를 적용하는 방법에 대해서 알아보도록 하겠습니다.
couchcoding
2022-12-07
Firebase로 Google 로그인 구현하기 2 (Spring 파트)
이전 포스팅에 이어 구글 로그인응 이용하기 위하여 Java Backend(SpringBoot)를 통해 Resource Service를 구현하는 것을 배워보겠습니다. 예제는 자바로 진행하나 구조를 익히면 다른 백엔드 프레임워크에서도 사용할 수 있을 것입니다. ...
백엔드
couchcoding
2022-12-07
[Spring] QueryDSL로 조건검색 API를 만들어보자(동적 쿼리)
조건 검색을 만들기 위해서 QueryDSL이라는 라이브러리를 사용하려고 합니다. QueryDSL은 JPA만으로는 복잡한 쿼리를 만들기 어렵고 JPQL과 같이 직접 SQL을 사용하는 방식은 SQL을 실행 전까지는 SQL을 검증할 수 없어 오류가 생기기 쉽습니다. ...
백엔드
couchcoding
2022-12-07
[Spring] 개발환경에 따라 Profile 분리하는 방법과 활용 예제를 알아보자
개발 환경과 Product 실행 환경을 분리하기 위해서 사용 ex) 로컬 개발환경에서는 h2 데이터베이스를 사용하고, 실제 배포환경에서는 postgres db를 사용하는 경우 ex) 보안 파일이나 암호를 모든 개발자에게 공개할 수 없는 경우 ex) 로컬 개발환경에서는...
백엔드
couchcoding
카우치코딩 공식 계정입니다.