세션 어트리뷰트(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"
이라는 키에 저장된 값을 가져옵니다.
스프링에서 세션 어트리뷰트 사용
스프링에서는 세션을 더 쉽게 관리할 수 있습니다. 주로 @SessionAttributes
와 HttpSession
을 사용해 세션 데이터를 저장하고 사용할 수 있습니다.
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 |