일기장
Published 2023. 5. 24. 15:39
세션(Session) 웹개발

안녕하세요, 여러분. 이전 포스트에서는 쿠키에 대해 자세히 알아봤습니다. 오늘은 그와 밀접하게 연관된 또 다른 개념, 세션(Session)에 대해 알아보려고 합니다. 세션도 웹 개발에서 중요한 역할을 하는 컴포넌트로, 사용자마다 개별적으로 상태 정보를 유지하기 위한 도구입니다.

 


 

1. 세션(Session)이란 무엇인가?

세션은 서버에서 사용자의 정보를 저장하는 기술입니다. HTTP 프로토콜은 본질적으로 상태를 유지하지 않는(stateless) 프로토콜이기 때문에, 사용자가 페이지를 이동하거나 재방문할 때마다 기존의 상태 정보가 유지되지 않습니다. 세션은 이런 상태 유지 문제를 해결하기 위해 도입된 기술입니다.

 

기본적으로 세션은 서버에서 제공하는 저장소입니다. 쿠키는 브라우저에 저장되어있고, 세션은 서버에 저장되어 있습니다. 브라우저가 서버에 요청을 하면 서버는 세션의 아이디를 쿠키에 담아 전송하고, 그 세션 아이디를 통해 어떤 클라이언트가 요청을 한 것인지 식별할 수 있게됩니다.

 

 

2. 세션은 어떻게 작동하는가?

세션은 고유한 ID(세션 ID)를 가집니다. 이 ID는 보통 쿠키를 통해 사용자의 브라우저에 저장되며, 사용자가 웹사이트에 요청을 보낼 때마다 이 세션 ID가 서버에 전송됩니다. 서버는 세션 ID를 통해 사용자의 세션을 찾고, 해당 세션에 저장된 정보를 사용하여 사용자의 상태를 유지합니다.

 

 

3. 자바 스프링에서 세션 다루기

자바 스프링에서는 HttpServletRequest 객체를 통해 세션을 관리할 수 있습니다. 세션을 생성하거나 접근하는 방법은 다음과 같습니다:

HttpSession session = request.getSession();

 

세션에 데이터를 저장하는 방법은 다음과 같습니다:

session.setAttribute("key", "value");

 

세션에서 데이터를 가져오는 방법은 다음과 같습니다:

String value = (String) session.getAttribute("key");

 

세션을 종료하는 방법은 다음과 같습니다:

session.invalidate();

 

다음은 세션을 이용한 로그인 기능을 구현한 코드입니다:

import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class LoginController {

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ResponseBody
    public String login(String username, String password, HttpSession session) {
        // 여기에서는 예시를 위해 사용자 이름과 비밀번호 검증 과정을 생략합니다.
        // 실제로는 이 부분에서 사용자 이름과 비밀번호를 데이터베이스나 다른 저장소와 비교해야 합니다.

        // 로그인에 성공하면, 세션에 사용자 이름을 저장합니다.
        session.setAttribute("username", username);

        return "로그인에 성공하였습니다.";
    }

    @RequestMapping(value = "/logout", method = RequestMethod.POST)
    @ResponseBody
    public String logout(HttpSession session) {
        // 로그아웃 요청이 오면, 세션을 종료합니다.
        session.invalidate();

        return "로그아웃하였습니다.";
    }

    @RequestMapping(value = "/profile", method = RequestMethod.GET)
    @ResponseBody
    public String profile(HttpSession session) {
        // 세션에서 사용자 이름을 가져옵니다.
        String username = (String) session.getAttribute("username");

        if (username == null) {
            // 사용자 이름이 세션에 없다면, 사용자가 로그인하지 않은 것입니다.
            return "로그인이 필요합니다.";
        } else {
            // 사용자 이름이 세션에 있다면, 사용자가 로그인한 것입니다.
            return "안녕하세요, " + username + "님!";
        }
    }
}

 

 

결론

세션은 웹 개발에서 사용자의 상태 정보를 유지하기 위해 필수적인 도구입니다. 쿠키와 비슷하게 동작하지만, 데이터는 서버 측에서 관리되므로 보안성이 높습니다. 이를 통해 웹사이트의 사용자 경험을 개선하는 데 도움을 줄 수 있을 것입니다.

 


< 추가 - 쿠키와 세션의 차이 >

특징 쿠키 세션
저장 위치 클라이언트 서버
사용량 클라이언트의 자원을 사용 서버의 자원을 사용
보안성 보안성이 낮음 보안성이 높음
서버부하 서버의 자원을 사용하지 않음 서부 부하가 생김

 


 

< 세션을 이용한 로그인 - 로그아웃 구현 >

 

package com.example.demo.controller;

import javax.servlet.http.HttpSession;

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

@Controller
public class BoardController {

    @GetMapping("/board")
    public String getBoard(HttpSession session) {
        if (session.getAttribute("loggedIn") != null && session.getAttribute("loggedIn").equals(true)) {
            return "boardList";
        } else {
            return "redirect:/loginForm";
        }
    }
}

- 게시판 버튼을 눌렀을 때 실행되는 컨트롤러

 

package com.example.demo.controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class LoginController {

    @PostMapping("/login")
    public String login(@RequestParam("id") String id, @RequestParam("password") String password, HttpSession session) {
        // Note: for simplicity, we assume that the correct username and password are "user" and "pass"
        // In a real-world application, you should check these values against a database
        if (id.equals("user") && password.equals("pass")) {
            session.setAttribute("loggedIn", true);
            return "redirect:/board";
        } else {
            return "redirect:/loginForm";
        }
    }

    @GetMapping("/logout")
    public String logout(HttpSession session) {
        session.invalidate();
        return "redirect:/loginForm";
    }
}

- 로그인을 통제하는 컨트롤러

 

<!DOCTYPE html>
<html>
<body>
    <a href="/board">Go to Board</a>
</body>
</html>

- 홈화면

 

<!DOCTYPE html>
<html>
<body>
    <form action="/login" method="post">
        ID: <input type="text" name="id"><br>
        Password: <input type="password" name="password"><br>
        <input type="submit" value="Login">
    </form>
</body>
</html>

- 로그인화면

'웹개발' 카테고리의 다른 글

자바 스프링 예외처리  (0) 2023.05.26
JSP 자세히 알아보기  (0) 2023.05.25
쿠키(Cookie)  (0) 2023.05.24
GetMapping, PostMapping  (0) 2023.05.20
@RequestsParam, @ModelAttribute  (0) 2023.05.20
profile

일기장

@공군급양

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!