세션 어트리뷰트(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' 카테고리의 다른 글

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

+ Recent posts