개발/Spring Framework

httpSession에 대해서 개념 및 활용법

멋진놈 2022. 11. 25. 14:35
728x90

# 개념

1. Session

- 방문자가 웹 서버에 접속해 있는 상태

- WAS의 메모리에 Object의 형태로 저장

- 메모리가 허용하는 용량까지 제한없이 저장가능.

 

2. 동작순서

- 클라이언트가 페이지 요청.

- 접근한 클라이언트의 쿠키를 확인하여 해당 session-id를 보냈는지 확인.

- session-id를 생성해 클라이언트에게 돌려줌.

- 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 서버에 저장 ( 쿠키 이름: JSESSIONID)

- 클라이언트 재 접속시, 이 쿠키를 이용하여 session-id 값을 서버에 전달.

 

3. 특징 

- 웹 서버에 상태를 유지하기 위한 정보를 저장.

- 웹 서버에 저장되는 쿠키(세션쿠키)

- 서버에서 세션을 삭제 했을때만 삭제가 되므로, 쿠키보다 비교적 보안이 좋다.

- 각 클라이언트 고유 session id를 부여

 

4. 주요 기능

// 생성

HttpSession session = request.getSession();

HttpSession session = request.getSession(false);

 

// 값 저장

session.setAttribute(String name, Object value);

 

// 값 얻기

Object obj = session.getAttribute(String name);

 

// 값 제거

session.removeAttribute(String name);// 특정 이름의 속성 제거

session.invalidate(); // binding 되어 있는 모든 속성 제거

 

HttpSession Servlet Container가 만듬.

 

# 활용법 

import javax.servlet.http.HttpSession;

1. 

HttpServletRequest req
HttpSession session = req.getSession();

 

2. 

Spring Web MVC에서는 HttpSession을 주입해야 할 때, 내부적으로 Servlet Container에게 Session을 달라고 합니다.

1
httpServletRequest.getSession()
cs

그리고 그 때 Servlet Container가 HttpSession을 생성해줍니다. Spring이 Servlet Container에게 Session을 달라고 하는 시점은 HttpSession을 사용하는 방법에 따라 약간씩 다릅니다. 

 

3. 메소드에서 주입받는 방식.

1
2
3
4
5
6
7
8
9
10
11
@RestController
public class LoginController {
    
    @PostMapping("login")
    public ResponseEntity<ResponseMessage> login(@RequestBody User user, HttpSession session) {
        // TODO 일치하는지 확인하는 logic 추가
        session.setAttribute("LOGIN_USER", user);
        
        return ResponseEntity.ok(new ResponseMessage(true));
    }
}
cs

 

메소드에서 매개변수를 통해 주입받는 방식으로 구현한다면, 선언시에 Servlet Container에게 Session을 달라고 요청합니다. 따라서 위의 예제에서는 login 메소드를 호출하는 즉시 Session이 요청/생성됩니다. 

 

4. @SessionAttribute, @ModelAttribute로 주입받는 방식.

1
2
3
4
5
6
7
8
9
10
11
12
13
@Controller
@SessionAttributes("todos")
public class TodoController{
    
    @GetMapping("/form")
    public String showForm(Model model, @ModelAttribute("todos") TodoList todos){
       if(!todos.isEmpty()){
          model.addAttribute("todo", todos.peekLast());
       } else {
          model.addAttribute("todo"new TodoItem());
    }
    return "sessionattributesform";
}

cs

이 방식은 Session에 이미 저장된 데이터를 조회할 때 적합하므로 로그인을 처리하는 로직과는 어울리지 않습니다. 그래서 Baeldung의 예제를 첨부했습니다. 

2라인 : @SessionAttributes를 컨트롤러에 추가함으로써 세션 단위로 스코프를 지정하도록 명시해줍니다. 

6라인 : @ModelAttribute을 선언함으로써 Session에서 "todos"라는 키를 가진 값을 조회합니다. 그리고 TodoList로 변환해 todos 파라미터로 주입해줍니다.  

이 방식도 선언시에 Servlet Container에게 Session을 달라고 요청하기 때문에 showForm 메소드를 호출할 때 Session이 요청/생성됩니다. 

 

[Session은 어떻게 유지될까?]

위와 같이 구현하면, HttpSession을 필요로 하는 모든 요청에 대해서(Header에 특별한 키가 없다면) 새로운 Session을 발급해 줍니다. 

Tomcat의 경우 이 SessionID를 JSESSIONID라는 키의 쿠키로 생성/전달합니다.

따라서 로그인 이후의 플로우처럼 세션을 유지하기 위해서는 

- 서버의 로그인로직에서 로그인이 성공하면 발급받은 SessionId를 클라이언트에게 돌려주고, 

- 클라이언트는 이후 요청을 할 때, 서버로부터 받았던 SessionId를 함께 넘겨줍니다. 

- Servlet Container에서는 Request에 SessionId가 있으면 Session을 새로 발급하지 않고 전달받은 SessionId와 매핑되는 기존의 Session을 할당해줍니다. 

 

 

 

 

if ( session == null){

  로그인 페이지로 이동 시키게끔 

} else {

 원래 페이지로 이동 시키게끔 

   }

}

이렇게 많이 사용 함.

 

하지만 모든 요청에 대해 session을 만드는 것이 아님.

session을 만드는 것 자체도 부담이 가는 일 이기 때문에, Session을 사용할 때만 생성함.

 

 

# session & cookie 비교

 

https://soon-devblog.tistory.com/2

 

HttpSession은 "언제" 만들어질까?

이 글에서 알 수 있는 내용 -Tomcat은 WAS? No! Just Servlet Container! -HttpSession은 언제 만들어질까? -HttpSession을 사용하는 방법 -Session은 어떻게 유지될까? [Tomcat은 WAS? No! Just Servlet Container!] JAVAEE는 엔터프

soon-devblog.tistory.com

 

https://muengx2.tistory.com/55

 

[HttpSession] 기초 개념

[Session] - 방문자가 웹 서버에 접속해 있는 상태 - WAS의 메모리에 Object의 형태로 저장 - 메모리가 허용하는 용량까지 제한없이 저장가능 [동작순서] - 클라이언트가 페이지 요청 - 접근한 클라이언

muengx2.tistory.com