본문 바로가기
Network Study

세션 어트리부트 - 서블릿 컨테이너에서 세션 관리, HTTP는 무상태 프로토콜

by xogns93 2024. 10. 10.

세션 어트리뷰트(Session Attribute)서블릿 컨테이너세션(Session)을 통해 클라이언트와 서버 간의 상태를 유지하기 위해 사용하는 데이터입니다. 기본적으로 HTTP는 무상태(stateless) 프로토콜이기 때문에, 클라이언트와 서버가 한 번의 요청-응답 이후에는 연결이 끊기고, 그 전에 주고받은 데이터를 기억하지 않습니다. 그러나 세션을 사용하면 여러 요청 간에 사용자 상태 정보를 유지할 수 있습니다.

1. HTTP는 무상태 프로토콜

HTTP는 무상태 프로토콜이기 때문에, 각 요청은 독립적입니다. 서버는 이전에 클라이언트와 어떤 상호작용을 했는지 알 수 없으며, 각 요청은 처음 요청하는 것처럼 처리됩니다. 이 무상태성으로 인해, 로그인 상태 유지사용자 정보 저장과 같은 기능이 기본적으로 불가능합니다.

예를 들어, 사용자가 로그인을 한 후에 다른 페이지로 이동하면, 서버는 기본적으로 그 사용자가 누구인지 기억하지 못합니다.

2. 세션(Session)의 역할

세션(Session)은 HTTP의 무상태성을 보완하기 위해 사용됩니다. 서버는 세션을 이용해 클라이언트의 상태를 유지할 수 있습니다. 서버는 각 클라이언트에 대해 고유한 세션을 생성하고, 해당 클라이언트가 여러 번 요청을 보내더라도 동일한 세션을 통해 상태를 유지할 수 있습니다.

세션의 주요 특징:

  • 각 클라이언트에게 고유한 세션 ID를 부여하여, 요청이 올 때마다 이 세션 ID를 통해 클라이언트를 식별합니다.
  • 세션은 서버에 저장되며, 클라이언트가 특정한 상태(예: 로그인)를 유지하고 있을 때 사용됩니다.
  • 세션 데이터는 서버에 저장되며, 클라이언트는 세션 ID만을 쿠키 또는 URL 파라미터를 통해 서버로 전송합니다.

3. 세션 어트리뷰트(Session Attribute)

세션 어트리뷰트세션에 저장된 데이터를 의미합니다. 서버는 세션에 여러 가지 데이터를 저장할 수 있으며, 이 데이터는 여러 요청 간에 공유됩니다.

예시: 세션에 데이터 저장 및 가져오기

서블릿에서 세션을 사용하는 방법은 매우 간단합니다. 다음은 서블릿에서 세션 어트리뷰트를 사용하는 예시입니다.

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class MyServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        // 세션 객체를 가져옴 (없으면 생성)
        HttpSession session = request.getSession();

        // 세션에 사용자 이름 저장
        session.setAttribute("username", "JohnDoe");

        // 세션에서 데이터 가져오기
        String username = (String) session.getAttribute("username");

        // 세션 데이터 출력
        response.getWriter().println("User: " + username);
    }
}
  • session.setAttribute("username", "JohnDoe"): 세션에 "username"이라는 키로 "JohnDoe" 값을 저장합니다.
  • session.getAttribute("username"): 세션에서 "username"이라는 키에 저장된 값을 가져옵니다.

스프링에서 세션 어트리뷰트 사용

스프링에서는 세션을 더 쉽게 관리할 수 있습니다. 주로 @SessionAttributesHttpSession을 사용해 세션 데이터를 저장하고 사용할 수 있습니다.

1) @SessionAttributes 사용

@SessionAttributes는 컨트롤러에서 세션에 저장할 속성을 선언적으로 정의할 수 있습니다. 이 속성은 세션에 자동으로 저장되며, 이후의 요청에서도 계속 유지됩니다.

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;

@Controller
@SessionAttributes("user")
public class UserController {

    // 세션에 저장될 모델 속성 정의
    @ModelAttribute("user")
    public User setUpUserForm() {
        return new User();
    }

    @RequestMapping("/login")
    public String login(@ModelAttribute("user") User user) {
        // 로그인 처리 후 세션에 user 객체가 저장됨
        return "loginSuccess";
    }
}

위 예시에서는 user 객체가 세션에 자동으로 저장되며, 이후의 요청에서도 세션을 통해 동일한 user 객체를 사용할 수 있습니다.

2) HttpSession 사용

HttpSession 객체를 직접 사용하여 세션 데이터를 관리할 수도 있습니다.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpSession;

@Controller
public class SessionController {

    @RequestMapping("/addToSession")
    public String addToSession(HttpSession session) {
        session.setAttribute("user", "JohnDoe");  // 세션에 데이터 저장
        return "sessionAdded";
    }

    @RequestMapping("/getFromSession")
    public String getFromSession(HttpSession session) {
        String user = (String) session.getAttribute("user");  // 세션에서 데이터 가져오기
        return "User: " + user;
    }
}

4. 세션의 특징

  • 세션 ID: 서버는 각 클라이언트에게 고유한 세션 ID를 부여합니다. 이 세션 ID는 보통 쿠키를 통해 클라이언트와 주고받으며, 클라이언트가 서버에 요청을 보낼 때마다 세션 ID를 전송해 상태를 유지합니다.
  • 세션 만료: 세션은 일정 시간이 지나면 만료됩니다. 세션 만료 시간은 서버 설정에 따라 다르며, 사용자의 비활성화 상태(활동이 없는 시간)에 따라 세션이 자동으로 소멸될 수 있습니다.
  • 서버에 저장: 세션 데이터는 클라이언트가 아니라 서버에 저장됩니다. 클라이언트는 오직 세션 ID만 저장합니다.

5. 세션의 장점

  • 상태 유지: HTTP는 기본적으로 무상태이지만, 세션을 사용하면 로그인 상태나 사용자 정보와 같은 상태를 유지할 수 있습니다.
  • 보안성: 중요한 정보는 클라이언트가 아닌 서버에 저장되므로, 쿠키에 비해 상대적으로 안전합니다.

요약

  • HTTP는 무상태 프로토콜이므로, 서버는 클라이언트와의 이전 상호작용을 기억하지 않습니다.
  • 세션은 서버에서 클라이언트의 상태를 유지하기 위해 사용되며, 세션 어트리뷰트는 세션에 저장된 데이터입니다.
  • 세션은 세션 ID를 사용해 클라이언트를 식별하며, 서버는 이 세션을 통해 클라이언트의 상태를 유지합니다.
  • 스프링에서는 @SessionAttributes 또는 HttpSession을 사용하여 세션 데이터를 쉽게 관리할 수 있습니다.

'Network Study' 카테고리의 다른 글

JWT(JSON Web Token)  (0) 2024.10.10
로그인(Authentication) - 쿠키(Cookie), 세션(Session)  (0) 2024.10.10
RESTful API (OPEN API)  (0) 2024.10.08
URL(Uniform Resource Locator)  (0) 2024.10.08
로드밸런싱과 클러스터링  (0) 2024.10.08