Framework/Springboot

[Springboot] Session이란?

웹개발자(진) 2024. 5. 30. 21:21
반응형

 

 

세션(Session)이란?

세션은 클라이언트와 서버 간의 지속적인 상태를 유지하기 위한 방법입니다. 웹 애플리케이션에서는 HTTP 프로토콜이 기본적으로 무상태(stateless) 프로토콜이기 때문에, 클라이언트가 요청할 때마다 새로운 요청으로 간주됩니다. 이러한 특성 때문에 사용자 인증 정보, 쇼핑 카트 내용 등과 같은 상태 정보를 유지하기 위해 세션을 사용합니다.

 

세션의 동작 원리

  1. 세션 생성: 클라이언트가 서버에 처음 요청을 보내면 서버는 새로운 세션을 생성합니다. 이때 서버는 고유한 세션 ID를 발급합니다.
  2. 세션 ID 전달: 서버는 생성된 세션 ID를 클라이언트에게 쿠키를 통해 전달합니다. 클라이언트는 이 세션 ID를 로컬에 저장합니다.
  3. 세션 유지: 클라이언트는 이후의 모든 요청에 세션 ID를 함께 전송하여 서버가 클라이언트를 식별할 수 있도록 합니다.
  4. 세션 종료: 세션은 일정 시간 동안 활동이 없으면 만료되거나, 사용자가 명시적으로 로그아웃하는 경우 종료됩니다.

 

Spring Boot에서의 세션 사용

Spring Boot에서는 HttpSession을 통해 세션을 관리할 수 있으며, 더 확장된 기능을 제공하기 위해 Spring Session 모듈을 사용할 수 있습니다. Spring Session은 Redis, JDBC, Hazelcast 등 다양한 백엔드에 세션 데이터를 저장할 수 있도록 지원합니다.

 

기본 세션 사용 예제

Spring Boot에서 기본적인 세션 사용 예제를 보여드리겠습니다.

1. 의존성 추가: Spring Boot 프로젝트의 build.gradle 파일에 필요한 의존성을 추가합니다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

 

2. 세션 설정: application.properties 파일에서 세션 관련 설정을 할 수 있습니다. 예를 들어, 세션 타임아웃을 설정할 수 있습니다.

server.servlet.session.timeout=30m

 

3. 컨트롤러에서 세션 사용: 세션을 사용하여 사용자 정보를 저장하고 읽어오는 컨트롤러를 작성합니다.

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.ui.Model;

@Controller
public class SessionController {

    @GetMapping("/login")
    public String login(String username, HttpSession session, Model model) {
        // 세션에 사용자 이름을 저장합니다.
        session.setAttribute("username", username);
        // 로그인 성공 페이지로 이동합니다.
        return "loginSuccess";
    }

    @GetMapping("/welcome")
    public String welcome(HttpSession session, Model model) {
        // 세션에서 사용자 이름을 가져옵니다.
        String username = (String) session.getAttribute("username");
        if (username != null) {
            model.addAttribute("message", "Welcome, " + username);
            // 환영 페이지로 이동합니다.
            return "welcome";
        } else {
            // 세션이 없는 경우 로그인 페이지로 리다이렉트합니다.
            return "redirect:/login";
        }
    }

    @GetMapping("/logout")
    public String logout(HttpSession session) {
        // 세션을 무효화하여 사용자 로그아웃 처리합니다.
        session.invalidate();
        // 로그아웃 페이지로 이동합니다.
        return "logout";
    }
}
 

4. 뷰 템플릿 작성: Thymeleaf를 사용하여 뷰 템플릿을 작성합니다.

loginSuccess.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Login Success</title>
</head>
<body>
    <p>Login successful for user: <span th:text="${username}"></span></p>
    <a href="/welcome">Go to Welcome Page</a>
    <a href="/logout">Logout</a>
</body>
</html>

 

welcome.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Welcome</title>
</head>
<body>
    <p th:text="${message}"></p>
    <a href="/logout">Logout</a>
</body>
</html>

 

logout.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Logout</title>
</head>
<body>
    <p>You have been logged out.</p>
    <a href="/login?username=testUser">Login Again</a>
</body>
</html>

 


 

이 컨트롤러는 세션을 사용하여 사용자의 로그인 상태를 관리합니다. /login 엔드포인트에서는 사용자 이름을 세션에 저장하고, /welcome 엔드포인트에서는 세션에서 사용자 이름을 가져와서 환영 페이지에 표시합니다. /logout 엔드포인트에서는 세션을 무효화하여 사용자를 로그아웃합니다.

반응형