세션을 직접 만들어보고 사용하는것으로 세션을 이해할 수 있을것이다.
세션의 주요기능은 다음과 같다.
이렇게 직접 만든 sessionID를 사용하면
이런 결과물이 나온다.
@PostMapping("/login")
public String loginV3(@Validated @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletRequest request) {
if (bindingResult.hasErrors()) {
return "login/loginForm";
}
Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
log.info("login? {}", loginMember);
if (loginMember == null) {
bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.");
return "login/loginForm";
}
HttpSession session = request.getSession();
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
return "redirect:/";
}
기본으로 제공해주는 세션은 위와 같이 사용한다.
세션이 있다면 사용하고 없다면 하나 만드는 방식이다.
그 후, 세션에 세션이름과 내용을 집어넣어준다.
@PostMapping("/logout")
public String logoutV3(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
return "redirect:/";
}
session을 가지고 오고, null이 아닌 경우 invalidate한다.
여기서 주의할점은, getSession은 기본적으로 세션이 없으면 생성하도록 되어있다. 따라서 기본값을 false처리 해야한다.
@GetMapping("/")
public String homeLoginV3(HttpServletRequest request, Model model) {
HttpSession session = request.getSession(false);
if (session == null) {
return "home";
}
Member loginMember = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);
if (loginMember == null) {
return "home";
}
model.addAttribute("member", loginMember);
return "loginHome";
}
session에서 getAttribute를 통해 Member를 꺼내고, 그 값이 없다면 return, 있다면 model에 넣어서 처리한다.
@GetMapping("/")
public String homeLoginV3Spring(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) {
if (loginMember == null) {
return "home";
}
model.addAttribute("member", loginMember);
return "loginHome";
}
혹은 스프링 기능을 이용해서 더 간단하게 표현 할 수 있다.
세션을 너무 장기간 보관하게 되면 탈취되었을 때 해킹의 위험이 존재하고, 또한 수십만개의 세션을 지속적으로 보관하기에는 세션메모리가 부족해진다.
따라서 세션 종료시간을 지정해야한다.
사용자가 가장 최근에 요청을 보낸 시간으로부터 30분씩 계속 연장을 시키는 방식을 사용하면 생명주기를 용이하게 관리할 수 있다.
혹은 브라우저 종료시 사라지거나 하는 방식 역시 고려해볼 수 있다.
application.properties에서
session.setMaxInactiveInterval(1800);
를 설정한다.
1800은 30분이다.
글로벌 세션은 무조건 초단위로 설정한다.