httpSession에 대해서 개념 및 활용법
# 개념
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