HTTP는 무상태(stateless) 프로토콜( protocol)
수 만명의 회원 정보를 연결 상태를 유지 한다면 엄청난 과부화가 걸릴 것입니다. 그리하여 서버가 응답을 보낸 후 Client와 Server의 연결을 끊게 됩니다. 물론 무수히 많은 요청을 처리할 수 있기에 좋은 방법이지만 Client의 상태를 지속적으로 확인하는 데 어려움이 있으므로 쿠키와 세션을 통해 사용자의 상태 정보를 관리하게 됩니다.
로그인 상황을 생각해 봅시다.
로그인에 성공하게 되었을 때 로그인 상태를 유지 시키지 못한다면 로그인을 했어도 안 한 상태와 마찬가지일 것입니다.
예를 들어, 게임이던지 쇼핑몰이던지 로그인 상태를 유지시키지 못한다면 플레이를 할 때마다 키워놨던 게임 케릭터를 못 불러 온다던지 아니면 주문을 한 것이 있는데 주문내역을 못 본다든지 이러한 문제점이 발생할 것 입니다.
그렇기 때문에 로그인 상태를 유지 시키기 위해 쿼리 파라미터를 계속 유지 시키며 보낼 수도 있지만 이는 무척 번거롭기 때문에 쿠키 및 세션을 사용하게 됩니다.
JSESSIONID라는 값으로 세션 아이디가 만들어 집니다!
로그인 서비스와 같은 기본적인 로그인 처리 기술은 이미 개발되었다는 전제 하에 세션이 어떻게 사용되는지만 간략히 코드로 보여드리겠습니다!
loginController
@PostMapping("/login")
public String login(@ModelAttribute LoginForm form, HttpServletRequest request){
Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
HttpSession session = request.getSession();
session.setAttribute("loginMember",loginMember);
return "redirect:/";
}
logoutController
@PostMapping("/logout")
public String logout(HttpServletRequest request){
HttpSession session = request.getSession(false);
if(session!=null){
session.invalidate();
}
return "redirect:/";
}
Session 값 다른 컨트롤러에서 활용하기
서블릿만을 이용할 때는 session.getAttribute()라는 코드를 활용하여 세션에서 반환된 값을 판단하는 별도의 로직이 필요하였습니다.
이제는! 스프링에서 @SessionAttribute를 지원함으로서 더 쉽게 사용 가능합니다!!
@GetMapping("/test")
@ResponseBody
public String test(
@SessionAttribute(name=SessionConst.LOGIN_MEMBER,required = false)Member member, HttpServletRequest request){
if(member==null){
return "home";
}
return member.getName();
}
@SessionAttribute는 현재 웹브라우저에 설정된 세션의 값을 member 객체에 반환 시켜줍니다.
추가로
세션을 제거하기 위해서는 로그아웃 버튼을 눌러야하지만 대부분 로그아웃 버튼을 누르지 않고 웹 브라우저를 종료합니다.
이렇게 되면 세션이 남아있을 수도 있으므로 따로 서버에서 세션을 만들 때 세션을 끊어주는 시간을 정해야 합니다.
session.setMaxInactiveInterval(1800); 처럼 사용하면 됩니다. 파라미터는 초 단위로 설정 됩니다.
이렇게 설정 해 놓으면 세션의 종료 시점은 사용자의 마지막 요청으로 부터 +1800초 이후에 세션이 종료되게 됩니다.
세션의 종료 시점이 세션이 생성된 시점이라면 매우 불편하겠죠?? 1800초마다 막 끊기고 이래버리면 ..
로그인 화면
@SetAttribute활용
request-header에 JSESSIONID라는 값의 쿠키가 존재하는 지
실행 결과가 모두 위에서 설명드린바와 같이 일치하는 모습을 보여드리고 있습니다! : )
이 글은 인프런 김영한님의 '스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술'을 수강하고 작성합니다.
출처:https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard