반응형

Servlet Filter: 개념과 활용

Servlet Filter는 웹 애플리케이션에서 HTTP 요청 및 응답을 가로채 특정 작업을 수행할 수 있는 기능을 제공합니다. 주로 요청 데이터 검증, 응답 수정, 로깅, 인증 및 권한 검사 등에 사용됩니다.


Servlet Filter란?

주요 특징:

  1. 요청 및 응답 처리: 클라이언트 요청 전/후, 서블릿 호출 전/후에 작업 수행.
  2. 재사용 가능: 여러 서블릿에 동일한 필터를 적용 가능.
  3. 체이닝: 여러 필터를 순서대로 연결하여 처리 가능.

동작 흐름:

  1. 클라이언트가 요청을 보냄.
  2. 필터가 요청을 가로채고 처리.
  3. 필터 체인이 끝나면 서블릿으로 요청 전달.
  4. 서블릿에서 응답을 생성하여 필터 체인으로 반환.
  5. 필터가 응답을 처리하고 클라이언트로 반환.

자바에서 Servlet Filter 구현

1. 필터 인터페이스 구현

Servlet Filter를 구현하려면 javax.servlet.Filter 인터페이스를 구현해야 합니다.

예시: 로그인 인증 필터

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class AuthenticationFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    // 초기화 작업 (필요 시 구현)
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // 세션에서 로그인 정보 확인
        if (httpRequest.getSession().getAttribute("user") == null) {
        	// 로그인되지 않은 경우 로그인 페이지로 리다이렉트
	        httpResponse.sendRedirect("/login.jsp");
        } else {
        	// 로그인된 경우 요청을 다음 필터나 서블릿으로 전달
    	    chain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
    // 자원 정리 작업 (필요 시 구현)
    }
}

2. web.xml에 필터 등록

필터를 서블릿 컨테이너에 등록하고 URL 패턴을 매핑합니다.

<filter>
	<filter-name>AuthenticationFilter</filter-name>
	<filter-class>com.example.AuthenticationFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3. 애너테이션 기반 등록 (대체 방식)

Servlet 3.0 이상에서는 @WebFilter 애너테이션을 사용하여 필터를 등록할 수 있습니다.

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(filterName = "AuthenticationFilter", urlPatterns = {"/protected/*", "/admin/*"})
public class AuthenticationFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        if (httpRequest.getSession().getAttribute("user") == null) {
	        httpResponse.sendRedirect("/login.jsp");
        } else {
    	    chain.doFilter(request, response);
        }
    }
}

이름 및 URL 패턴 지정 이유

필터 이름 지정:

  • 필터 이름(filterName)은 필터를 식별하는 데 사용됩니다. 프로젝트가 커지고 여러 필터를 사용할 때 유지보수성과 가독성을 높이기 위해 필수적입니다.

URL 패턴 지정:

  • urlPatterns는 필터를 적용할 경로를 지정합니다. 특정 요청에만 필터를 적용하여 불필요한 작업을 줄이고 성능을 최적화할 수 있습니다.
    • 예: /protected/*protected 디렉토리 아래의 모든 요청에 필터를 적용합니다.
    • 예: /admin/*는 관리자 전용 URL에만 필터를 적용하여 권한 관리를 강화합니다.

 


로그인 필터의 활용 시나리오

  1. 로그인 검증:
    • 사용자 요청이 들어올 때 세션을 확인하여 로그인 여부를 검증.
    • 로그인되지 않은 사용자를 로그인 페이지로 리다이렉트.
  2. 로깅:
    • 요청 및 응답의 메타데이터를 기록하여 디버깅 및 감사용 로그 생성.
  3. 권한 확인:
    • 사용자의 역할(Role)을 확인하여 권한 없는 요청 차단.

권한 확인 필터 예시:

if (httpRequest.getSession().getAttribute("role") == null ||
!httpRequest.getSession().getAttribute("role").equals("ADMIN")) {
    httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
    return;
}

결론

Servlet Filter는 요청과 응답을 가로채서 처리할 수 있는 강력한 도구입니다. 이를 활용하면 인증, 권한 검사, 로깅 등 다양한 작업을 중앙화하여 효율적인 웹 애플리케이션 관리가 가능합니다. 자바에서 Servlet Filter를 구현하여 깔끔하고 확장 가능한 코드를 작성해 보세요!

 

반응형

'개발 부트캠프 > 백엔드' 카테고리의 다른 글

[Spring] IoC & DI  (0) 2025.02.04
[Java] DBCP  (0) 2025.01.16
[Java] JSON  (0) 2025.01.16
[Java] HTTP 요청 처리하기  (0) 2025.01.16
[Java] SQL Injection  (1) 2025.01.10
반응형

서블릿(Servlet)

**서블릿(Servlet)**은 자바 기반 웹 애플리케이션에서 클라이언트의 요청을 처리하고 동적 콘텐츠를 생성하는 서버 측 컴포넌트입니다. HTTP 프로토콜을 기반으로 하며, Java Servlet API를 통해 동작합니다. 주로 HTML, JSON, XML 등의 응답을 생성하여 클라이언트에 반환합니다.

이 글에서는 서블릿의 개념과 함께 클라이언트에서 데이터를 보내고 받는 방법, 그리고 서블릿에서 JSP를 통해 데이터를 반환하는 방법을 예제와 함께 설명합니다.


서블릿의 주요 기능

  1. 클라이언트 요청 처리:
    • GET, POST, PUT 등의 HTTP 요청을 처리합니다.
  2. 데이터 처리 및 로직 수행:
    • 서버에서 필요한 비즈니스 로직을 수행하고 데이터베이스와 상호작용합니다.
  3. 응답 생성:
    • 클라이언트가 이해할 수 있는 형식(HTML, JSON 등)으로 데이터를 반환합니다.

클라이언트에서 서블릿에 데이터 보내는 방법

클라이언트는 GET 또는 POST 요청을 통해 데이터를 서블릿에 보낼 수 있습니다.

1. GET 요청을 통한 데이터 전송

GET 요청은 URL에 데이터를 쿼리 문자열(Query String)로 포함하여 전송합니다.

- URL뒤에 ?와 &이용하여 데이터를 포함

 

클라이언트 요청 예시:

<a href="http://localhost:8080/MyServlet?name=John&age=30">Send Data</a>

서블릿에서 GET 요청 처리:

request.getParameter()이용하여 클라이언트가 보낸 데이터를 받습니다.

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
	    // 데이터 수신
        String name = request.getParameter("name");
        String age = request.getParameter("age");

        // 응답 작성
        response.setContentType("text/html");
        response.getWriter().println("<h1>Name: " + name + ", Age: " + age + "</h1>");
    }
}

2. POST 요청을 통한 데이터 전송

POST 요청은 데이터를 요청 본문(Body)에 포함하여 전송합니다.

- form 태그 이용하여 action에 URL, method에 POST 입력

- input 태그 이용하여 입력 받은 데이터를 요청 본문(Body)에 포함 

 

클라이언트 요청 예시:

<form action="http://localhost:8080/MyServlet" method="POST">
    <input type="text" name="name" placeholder="Enter your name">
    <input type="number" name="age" placeholder="Enter your age">
    <button type="submit">Submit</button>
</form>

서블릿에서 POST 요청 처리:

request.getParameter()이용하여 클라이언트가 보낸 데이터를 받습니다.

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;

public class MyServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 데이터 수신
        String name = request.getParameter("name");
        String age = request.getParameter("age");

        // 응답 작성
        response.setContentType("text/html");
        response.getWriter().println("<h1>Name: " + name + ", Age: " + age + "</h1>");
    }
}

서블릿에서 클라이언트에 데이터 보내는 방법 (JSP 사용)

서블릿은 JSP와 연동하여 동적 웹 페이지를 생성할 수 있습니다.

- request.setAttribute("dataName", Data)를 이용하여 JSP에 데이터 전송

 

1. 서블릿에서 JSP로 데이터 전달:

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 데이터 설정
        request.setAttribute("message", "Hello from Servlet!");

        // JSP로 포워딩
        RequestDispatcher dispatcher = request.getRequestDispatcher("/display.jsp");
        dispatcher.forward(request, response);
    }
}

2. JSP에서 데이터 출력:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Servlet to JSP</title>
</head>
<body>
<h1>Message from Servlet: ${message}</h1>
<h1>Message from Servlet: <%= message></h1>
</body>
</html>

 


서블릿과 JSP의 활용 예시

  1. 로그인 시스템:
    • 클라이언트가 로그인 폼에서 입력한 데이터를 서블릿으로 보내 검증 후 JSP로 결과를 반환.
  2. 데이터 조회 및 출력:
    • 데이터베이스에서 조회한 결과를 서블릿에서 처리하고 JSP에서 테이블 형식으로 출력.
  3. RESTful API와 연동:
    • 클라이언트에서 서블릿으로 JSON 데이터를 보내고 처리한 결과를 JSP 또는 JSON 형식으로 응답.

마치며

서블릿은 자바 기반 웹 애플리케이션에서 중요한 역할을 합니다. GET과 POST 요청을 통해 클라이언트와 데이터를 주고받고, JSP를 활용해 동적 콘텐츠를 생성하는 방법을 이해하면 더욱 효율적인 웹 개발이 가능합니다. 이를 실습하며 능력을 키워보세요!

 

반응형

'개발 부트캠프 > 백엔드' 카테고리의 다른 글

[Java] HTTP 요청 처리하기  (0) 2025.01.16
[Java] SQL Injection  (1) 2025.01.10
[Java] 계층형 아키텍처 패턴 (Layered Architecture Pattern)  (0) 2025.01.07
[Java] MVC 패턴  (1) 2025.01.07
[Java] SOLID 원칙  (0) 2025.01.07

+ Recent posts