꿈틀꿈틀 개발일기

20240123 / TIL

by jeongminy

DispatchServlet

DispatchServlet은 Spring MVC에서 핵심적인 역할을 수행하는 컴포넌트입니다. 이해를 돕기 위해 비유하자면, DispatchServlet은 웹 애플리케이션의 트래픽을 관리하는 교통 경찰 역할을 한다고 할 수 있습니다.

DispatchServlet의 주요 역할은 클라이언트로부터 들어오는 HTTP 요청을 받아서 적절한 핸들러(Handler)에게 전달하고, 핸들러의 실행 결과를 클라이언트에게 반환하는 것입니다. 이를 위해 DispatchServlet은 다음과 같은 주요 작업을 수행합니다:

요청의 분석: DispatchServlet은 클라이언트로부터 들어오는 HTTP 요청을 분석하여 어떤 핸들러가 처리해야 할지 결정합니다. 요청 URL, HTTP 메서드, 요청 파라미터 등을 분석하여 적절한 핸들러를 찾습니다.
핸들러 매핑: DispatchServlet은 핸들러 매핑(Handler Mapping)을 사용하여 요청과 매핑된 핸들러를 찾습니다. 핸들러 매핑은 요청 URL과 핸들러(컨트롤러) 사이의 매핑 정보를 관리하고, 요청에 대응하는 핸들러를 찾아줍니다.
핸들러 실행: DispatchServlet은 찾아낸 핸들러를 실행합니다. 핸들러는 실제로 요청을 처리하고, 비즈니스 로직을 수행합니다. 핸들러는 주로 컨트롤러(Controller)의 역할을 수행하며, 요청을 처리한 후에는 실행 결과를 반환합니다.
뷰 리졸버와 뷰 렌더링: 핸들러가 실행한 결과를 바탕으로 DispatchServlet은 뷰 리졸버(View Resolver)를 사용하여 해당하는 뷰(View)를 찾습니다. 뷰 리졸버는 뷰의 논리적인 이름을 실제 뷰 객체로 매핑해주는 역할을 합니다. 그리고 DispatchServlet은 뷰를 렌더링하여 클라이언트에게 응답으로 보냅니다.
인터셉터 처리: DispatchServlet은 핸들러 실행 전후에 인터셉터(Interceptor)를 활용하여 요청 전후의 로직을 추가할 수 있습니다. 인터셉터는 요청 전처리, 응답 후처리 등의 작업을 수행할 수 있으며, 보안, 로깅, 인증 등 다양한 기능을 구현할 수 있습니다.
예외 처리: DispatchServlet은 요청 처리 중 발생하는 예외를 적절하게 처리합니다. 예외 처리는 에러 페이지로 리다이렉트하거나, JSON 형태로 에러 메시지를 반환하는 등의 방식으로 처리될 수 있습니다.
요약하자면, DispatchServlet은 클라이언트로부터 들어오는 요청을 분석하고, 적절한 핸들러에게 전달하여 요청을 처리하고 응답을 반환하는 역할을 수행합니다. 이를 통해 Spring MVC는 웹 애플리케이션의 흐름을 제어하고, 요청과 응답의 처리를 효과적으로 관리할 수 있습니다.

 

DelegatingFilterProxy

DelegatingFilterProxy는 스프링 프레임워크에서 제공하는 필터(Filer) 기반의 보안 및 인증 처리를 위한 프록시(Proxy)입니다. DelegatingFilterProxy는 비유를 사용하자면 보안 담당자로서의 역할을 수행합니다.

DelegatingFilterProxy의 주요 역할은 웹 애플리케이션의 보안 관련 기능을 구현하기 위해 실제 필터 기능을 담당하는 다른 필터(인증 필터, 권한 필터 등)로 작업을 위임하는 것입니다. 이를 통해 스프링은 다양한 보안 기능을 필터 체인으로 구성하여 관리할 수 있습니다.

DelegatingFilterProxy는 다음과 같은 특징과 역할을 가지고 있습니다:

필터 체인 위임: DelegatingFilterProxy는 웹 애플리케이션의 필터 체인에서 자신을 등록하고, 실제 필터 처리를 담당하는 다른 필터로 작업을 위임합니다. 이를 통해 보안 및 인증과 관련된 필터 체인의 구성과 처리를 스프링에 위임할 수 있습니다.
스프링 빈 활용: DelegatingFilterProxy는 스프링의 IoC(Inversion of Control) 컨테이너에 등록된 빈을 활용합니다. 따라서 보안 처리와 관련된 필터 구현체는 스프링 빈으로 등록되어야 합니다. 이를 통해 필터의 생성, 초기화, 종료 등의 라이프사이클 관리를 스프링에 위임할 수 있습니다.
보안 및 인증 처리: DelegatingFilterProxy는 주로 보안 및 인증과 관련된 기능을 처리하기 위해 사용됩니다. 예를 들어 인증 필터는 사용자의 로그인 여부를 확인하고, 권한 필터는 특정 리소스에 대한 접근 권한을 확인하는 역할을 수행합니다. DelegatingFilterProxy는 이러한 필터들을 관리하고 실행하는 역할을 담당합니다.
필터 체인의 관리: DelegatingFilterProxy는 스프링의 보안 기능을 구성하는 필터 체인의 관리를 담당합니다. 필터 체인은 여러 개의 필터가 순차적으로 실행되는 구조로, 요청에 대한 처리를 필터들이 차례로 수행합니다. DelegatingFilterProxy는 이러한 필터 체인의 구성과 실행을 관리하여 보안 처리를 수행합니다.
요약하자면, DelegatingFilterProxy는 스프링에서 필터 기반의 보안 처리를 위해 사용되는 프록시입니다. 필터 체인의 구성과 필터의 처리를 관리하며, 보안 및 인증과 관련된 기능을 실제 필터로 위임하여 처리합니다. 이를 통해 스프링은 웹 애플리케이션의 보안 처리를 유연하게 구현할 수 있습니다.

 

 

Application Context

Application Context는 스프링 프레임워크에서 중요한 개념 중 하나입니다. 비유를 사용하면 Application Context는 스프링 애플리케이션의 '도감'이라고 할 수 있습니다.

Application Context는 스프링 컨테이너의 인스턴스로, 스프링 애플리케이션에서 빈(Bean) 객체의 생성, 관리, 검색 등을 담당합니다. 빈은 스프링에서 구성 요소를 나타내는 객체로, 일반적으로 애플리케이션의 핵심 기능을 구현한 클래스입니다.

Application Context는 다음과 같은 주요한 기능과 역할을 수행합니다:

빈의 생성과 관리: Application Context는 스프링 컨테이너로서, 빈 객체들의 생성과 관리를 담당합니다. 빈의 정의는 XML, Java 설정 파일, 어노테이션 등을 통해 등록하며, Application Context는 이를 기반으로 빈 객체를 생성하고 필요에 따라 초기화 및 종료 처리를 수행합니다.
의존성 주입(Dependency Injection): Application Context는 빈 객체들 사이의 의존성을 자동으로 주입해주는 기능을 제공합니다. 의존성 주입은 객체 간의 결합도를 낮추고 유연한 애플리케이션 구조를 구성하는 데 중요한 역할을 합니다. 이를 통해 코드의 가독성과 유지보수성이 향상됩니다.
리소스 관리: Application Context는 애플리케이션에서 사용되는 다양한 리소스(파일, 데이터베이스 연결 등)를 관리합니다. 리소스의 경로, 설정 정보 등을 관리하고 필요한 곳에서 쉽게 접근할 수 있도록 지원합니다.
AOP(Aspect-Oriented Programming) 지원: Application Context는 스프링의 핵심 기능 중 하나인 AOP를 지원합니다. AOP는 애플리케이션에서 공통적으로 발생하는 기능(로깅, 트랜잭션 처리 등)을 모듈화하여 재사용할 수 있는 방법을 제공합니다. Application Context는 AOP를 구현하고 적용하는 데 필요한 기능을 제공합니다.
국제화(i18n)와 로컬화(l10n) 지원: Application Context는 다국어 지원 및 지역화 기능을 제공합니다. 다국어 메시지 번들, 날짜 및 통화 형식 설정 등과 같은 기능을 통해 애플리케이션의 국제화와 로컬화를 지원합니다.
요약하자면, Application Context는 스프링 애플리케이션에서 빈 객체의 생성과 관리, 의존성 주입, 리소스 관리, AOP 지원, 국제화와 로컬화 기능을 제공하는 스프링 컨테이너의 인스턴스입니다. 이를 통해 스프링은 애플리케이션의 객체들을 효과적으로 관리하고 유연한 구조를 구성할 수 있습니다.

 

Filter chain

Filter chain은 웹 애플리케이션에서 HTTP 요청을 처리하는 과정에서 필터(Filter)들이 연속적으로 적용되는 구조를 말합니다. 비유를 사용하면 Filter chain은 웹 애플리케이션의 '여과기 체인'이라고 할 수 있습니다.

Filter는 웹 애플리케이션에서 HTTP 요청과 응답을 가로채어 특정 작업을 수행하는 컴포넌트입니다. 예를 들어, 인증, 권한 부여, 로깅, 데이터 변환 등의 작업을 처리할 수 있습니다. Filter는 Servlet API의 일부로 제공되며, javax.servlet.Filter 인터페이스를 구현하여 개발할 수 있습니다.

Filter chain은 웹 애플리케이션에 등록된 여러 개의 Filter들이 순차적으로 실행되는 구조입니다. 클라이언트의 HTTP 요청이 도착하면, Filter chain은 첫 번째 Filter부터 시작하여 순서대로 실행됩니다. 각 Filter는 요청을 처리하고 다음 Filter로 체인을 전달하거나, 응답을 생성하여 클라이언트에게 반환할 수 있습니다.

Filter chain의 동작은 다음과 같습니다:

클라이언트의 HTTP 요청이 도착하면, Filter chain은 첫 번째 Filter를 호출합니다.
첫 번째 Filter는 요청을 가로채어 특정 작업을 수행한 후, 다음 Filter로 체인을 전달합니다.
다음 Filter도 마찬가지로 요청을 가로채어 작업을 수행한 후, 다음 Filter로 체인을 전달합니다.
이러한 과정을 마지막 Filter까지 반복합니다.
마지막 Filter가 작업을 수행한 후, 응답을 생성하여 클라이언트에게 반환합니다.
응답이 반환되면, Filter chain의 실행이 종료됩니다.
Filter chain은 웹 애플리케이션에서 다양한 작업을 수행하기 위해 사용됩니다. 예를 들어, 인증 필터는 클라이언트의 인증 여부를 확인하고, 권한 필터는 특정 리소스에 대한 접근 권한을 검사할 수 있습니다. 또한, 로깅 필터는 요청과 응답에 대한 로그를 기록하고, 데이터 변환 필터는 요청 및 응답 데이터의 형식을 변환할 수 있습니다.

요약하자면, Filter chain은 웹 애플리케이션에서 HTTP 요청을 처리하는 과정에서 여러 개의 Filter가 연속적으로 실행되는 구조를 말합니다. 각 Filter는 요청을 가로채어 특정 작업을 수행하고, 다음 Filter로 체인을 전달합니다. 이를 통해 웹 애플리케이션은 다양한 작업을 효과적으로 처리할 수 있습니다.

 

Servlet filter

Servlet Filter는 웹 애플리케이션에서 HTTP 요청과 응답을 가로채어 처리하는 컴포넌트입니다. 비유를 사용하면 Servlet Filter는 웹 애플리케이션의 '여과기'라고 할 수 있습니다.

Servlet Filter는 javax.servlet.Filter 인터페이스를 구현하여 개발할 수 있습니다. 웹 애플리케이션에 등록된 Filter는 클라이언트의 HTTP 요청이 서블릿에 도달하기 전에 실행되며, 응답이 클라이언트에게 전달되기 전에도 실행됩니다. 이를 통해 Filter는 다양한 작업을 수행할 수 있습니다.

Servlet Filter는 주로 다음과 같은 작업에 사용됩니다:

인증과 권한 부여: Filter를 사용하여 클라이언트의 인증 여부를 확인하고, 특정 리소스에 대한 접근 권한을 검사할 수 있습니다. 예를 들어, 인증 필터는 로그인 상태인지 확인하고, 권한 필터는 특정 역할이나 권한을 가진 사용자만이 특정 기능에 접근할 수 있도록 제한할 수 있습니다.
로깅과 감사: Filter를 사용하여 요청과 응답에 대한 로그를 생성하거나 감사 작업을 수행할 수 있습니다. 이를 통해 웹 애플리케이션의 동작을 모니터링하고, 보안 및 디버깅에 도움을 줄 수 있습니다.
데이터 변환과 압축: Filter를 사용하여 요청 및 응답 데이터의 형식을 변환하거나 압축할 수 있습니다. 예를 들어, 데이터 압축 필터를 사용하여 요청한 클라이언트에게 압축된 응답 데이터를 제공할 수 있습니다.
예외 처리: Filter를 사용하여 예외 상황을 처리할 수 있습니다. 예를 들어, 예외 처리 필터를 사용하여 예외가 발생한 경우 사용자에게 적절한 오류 페이지를 표시할 수 있습니다.
Servlet Filter는 웹 애플리케이션의 여러 컴포넌트 간에 공통된 작업을 수행하고, 코드의 중복을 피할 수 있는 장점이 있습니다. 또한, Filter는 웹 애플리케이션의 동작을 유연하게 제어할 수 있는 기능을 제공합니다.

요약하자면, Servlet Filter는 웹 애플리케이션에서 HTTP 요청과 응답을 가로채어 특정 작업을 수행하는 컴포넌트입니다. 인증, 권한 부여, 로깅, 데이터 변환 등 다양한 작업에 사용될 수 있으며, 웹 애플리케이션의 여러 컴포넌트 간에 공통된 작업을 처리하는 데 유용합니다.

 

Filterchainproxy

FilterChainProxy는 스프링 시큐리티(Spring Security)에서 사용되는 필터 체인의 구현체입니다. 비유를 사용하면, FilterChainProxy는 스프링 시큐리티의 '보안 경비원'이라고 할 수 있습니다.

스프링 시큐리티는 웹 애플리케이션의 보안을 강화하기 위해 사용되는 프레임워크로, 인증(Authentication)과 권한 부여(Authorization)를 처리하는데 특화되어 있습니다. FilterChainProxy는 스프링 시큐리티의 필터 체인을 관리하고 처리하는 핵심적인 역할을 수행합니다.

FilterChainProxy는 스프링 시큐리티 필터 체인에 등록된 여러 개의 필터(Filter)를 순차적으로 실행합니다. 각각의 필터는 특정한 보안 작업을 수행하며, 예를 들어 사용자 인증, 권한 검사, 세션 관리 등을 담당할 수 있습니다. 필터 체인은 클라이언트의 요청이 서버로 들어왔을 때 실행되며, 응답이 클라이언트에게 전달되기 전에도 실행됩니다.

FilterChainProxy는 다양한 스프링 시큐리티 필터들을 조합하여 구성할 수 있습니다. 각 필터는 특정한 보안 작업을 처리하고, 필터 체인의 다음 필터로 요청을 전달하거나 응답을 처리합니다. 이를 통해 스프링 시큐리티는 다양한 보안 기능을 제공하며, 개발자는 필요한 필터를 추가하거나 커스터마이징하여 보안 정책을 구성할 수 있습니다.

FilterChainProxy는 웹 애플리케이션의 보안을 담당하는 중요한 컴포넌트로, 스프링 시큐리티의 필터 체인을 관리하고 보안 작업을 처리합니다. 이를 통해 클라이언트의 요청에 대한 인증과 권한 검사, 보안 설정 등을 효과적으로 처리할 수 있습니다.

요약하자면, FilterChainProxy는 스프링 시큐리티에서 사용되는 필터 체인의 구현체로, 보안 작업을 처리하는 역할을 합니다. 클라이언트의 요청을 받아 다양한 보안 필터를 순차적으로 실행하여 인증과 권한 검사 등을 처리합니다. 스프링 시큐리티의 필터 체인을 관리하고 보안 정책을 설정하는 중요한 컴포넌트입니다.

 

csrf

CSRF(Cross-Site Request Forgery)는 웹 애플리케이션의 취약점 중 하나로, 인증된 사용자의 권한을 이용하여 악의적인 요청을 실행하는 공격 기법입니다. 비유를 사용하면, CSRF는 웹 애플리케이션의 '사칭 공격'이라고 할 수 있습니다.

일반적으로 웹 애플리케이션은 사용자의 인증 정보(세션, 쿠키 등)를 사용하여 요청을 처리하고, 사용자의 권한에 따라 특정한 작업을 수행합니다. 그러나 CSRF 공격은 사용자가 웹 애플리케이션에 접속한 상태에서 악의적인 웹 사이트를 방문하거나, 악성 이메일을 통해 특정한 요청을 자동으로 실행시키는 방식으로 이루어집니다.

공격자는 피해자의 인증 정보를 알지 못하지만, 피해자가 이미 웹 애플리케이션에 인증된 상태에서 악성 요청을 전송하도록 유도합니다. 이러한 공격은 사용자가 의도하지 않은 동작을 수행하게 만들어, 예를 들어 계정 정보 수정, 금전적인 거래 등을 악용할 수 있습니다.

CSRF 공격을 방지하기 위해 스프링 시큐리티(Spring Security)에서는 CSRF(Cross-Site Request Forgery) 토큰을 활용합니다. 이 토큰은 웹 애플리케이션의 폼(Form)에 포함되어 사용자의 요청과 함께 전송되며, 서버는 이 토큰을 검증하여 요청의 유효성을 판단합니다. 이를 통해 악의적인 요청을 걸러내고 CSRF 공격을 방지할 수 있습니다.

요약하자면, CSRF(Cross-Site Request Forgery)는 웹 애플리케이션의 취약점으로, 인증된 사용자의 권한을 이용하여 악의적인 요청을 실행하는 공격 기법입니다. CSRF 공격은 사용자의 인증 정보를 알지 못하지만, 악성 요청을 전송하도록 유도하여 사용자의 의도하지 않은 동작을 수행하게 합니다. 스프링 시큐리티는 CSRF 토큰을 활용하여 이러한 공격을 방지합니다.

 

 

Spring Security의 인증처리과정

SecurityContext는 이 Authentication 객체를 담는 Container 역할을 하고, 
SecurityContextHolder는 다시 SecurityContext 를 관리하는 역할을 한다고 볼 수 있습니다. 

 

 

SecurityContextHolder

SecurityContextHolder는 Spring Security에서 현재 사용자의 보안 컨텍스트를 저장하고 관리하는 클래스입니다. 비유를 사용하자면, SecurityContextHolder는 사용자의 '보안 카드'를 관리하는 역할을 한다고 할 수 있습니다.

Spring Security는 웹 애플리케이션에서 인증(Authentication)과 권한 부여(Authorization)를 처리하기 위한 프레임워크입니다. 사용자의 인증 정보와 권한은 SecurityContext라는 객체에 저장되며, 이를 SecurityContextHolder를 통해 접근할 수 있습니다.

SecurityContextHolder는 ThreadLocal을 사용하여 현재 스레드에서만 유효한 보안 컨텍스트를 관리합니다. 즉, 각각의 스레드는 독립적인 보안 컨텍스트를 가지며, 다른 스레드와 공유되지 않습니다. 이를 통해 동시에 여러 사용자의 요청을 처리할 때 보안 컨텍스트의 충돌이나 혼동을 방지할 수 있습니다.

SecurityContextHolder는 다음과 같은 주요 메서드를 제공합니다:

  • getContext(): 현재 스레드의 보안 컨텍스트를 반환합니다.
  • setContext(SecurityContext context): 현재 스레드의 보안 컨텍스트를 설정합니다.
  • clearContext(): 현재 스레드의 보안 컨텍스트를 제거합니다.

SecurityContextHolder를 사용하면 Spring Security에서 제공하는 다양한 기능을 활용할 수 있습니다. 예를 들어, 현재 사용자의 인증 정보를 가져오거나, 사용자의 권한을 확인하는 등의 작업을 수행할 수 있습니다.

요약하자면, SecurityContextHolder는 Spring Security에서 현재 사용자의 보안 컨텍스트를 저장하고 관리하는 클래스입니다. SecurityContextHolder를 사용하면 현재 사용자의 인증 정보와 권한을 효과적으로 관리할 수 있습니다.

 

 

SecurityContext

SecurityContext는 Spring Security에서 현재 사용자의 인증(Authentication) 정보와 권한(Authorization) 정보를 담고 있는 객체입니다. 비유를 사용하자면, SecurityContext는 사용자의 '보안 도장'이라고 할 수 있습니다.

Spring Security는 웹 애플리케이션에서 보안 관련 작업을 처리하기 위한 프레임워크로, 사용자의 인증과 권한을 관리합니다. 인증은 사용자의 신원을 확인하고, 권한은 사용자가 특정한 작업을 수행할 수 있는 권한을 부여하는 과정입니다.

SecurityContext는 사용자의 인증 정보와 권한 정보를 담고 있으며, 인증 정보는 Authentication 객체로, 권한 정보는 GrantedAuthority 객체로 표현됩니다. SecurityContext는 현재 사용자의 보안 상태를 유지하고, 다양한 보안 관련 작업을 수행하는 데 사용됩니다.

SecurityContext는 주로 Spring Security의 인증 과정에서 설정되고, 인증된 사용자의 요청을 처리하는 동안 유지됩니다. 보통은 인증된 사용자의 정보가 SecurityContext에 저장되어, 애플리케이션에서 필요한 시점에 해당 정보를 조회하거나 활용할 수 있습니다.

Spring Security에서는 SecurityContextHolder를 통해 SecurityContext에 접근합니다. SecurityContextHolder는 ThreadLocal을 사용하여 현재 스레드에서만 유효한 SecurityContext를 관리합니다. 이를 통해 다중 스레드 환경에서도 각각의 스레드가 독립적으로 보안 컨텍스트를 유지할 수 있습니다.

요약하자면, SecurityContext는 Spring Security에서 현재 사용자의 인증 정보와 권한 정보를 담고 있는 객체입니다. SecurityContext는 사용자의 보안 상태를 유지하고, Spring Security에서 제공하는 다양한 보안 기능을 활용하는 데 사용됩니다.

 

 

Authentication 인터페이스

public interface Authentication extends Principal, Serializable {

	Collection<? extends GrantedAuthority> getAuthorities();

	Object getCredentials();

	Object getDetails();

	Object getPrincipal();

	boolean isAuthenticated();

	void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'📒 TIL - Today I Learned' 카테고리의 다른 글

20240126 / TIL  (0) 2024.01.26
20240124 / TIL  (1) 2024.01.24
20240119 / TIL  (0) 2024.01.19
20240117 / TIL  (0) 2024.01.17
20240112 / TIL  (1) 2024.01.12

블로그의 정보

꿈틀꿈틀 개발일기

jeongminy

활동하기