세션은 서로 관련된 요청들을 하나로 묶은 것
쿠키를 이용한다
브라우저마다 개별 저장소(세션 객체)를 서버에서 제공한다
쿠키는 브라우저에 저장, 세션은 서버에 저장
원래 요청들은 서로 독립적
브라우저가 요청을 보내면 서버는 응답헤더에 세션 id를 쿠키에 저장해서 응답한다
그 다음부터는 요청에 쿠키가 자동으로 따라 간다
다음 요청부터 서버는 요청의 쿠키를 보고 같은 세션 id를 갖는 저장소를 사용한다
HttpSession session = request.getSession();
session.serAttribute("id", "asdf");
(아래 메서드는 pageContext, request, session, application에서 공통으로 사용하는 메서드)
HttpSession session = request.getSession();
session.invalidate(); // 1. 즉시 종료
session.setMaxInactiveInterval(30*60); // 2. 예약종료 (초단위, 30분 후)
<session-config>
<session-timeout>30</session-timeout> //분단위
</session-config>
- 서버 다중화
서버가 한 대 뒤에 여러 대가 연결되어 있는 서버 다중화 상태의 경우
요청이 오면 맨 앞 한 대가 요청을 받아 변환하고 다른 서버들로 분산한다
쿠키의 경우 브라우저에 id정보가 저장되어 있기 때문에 어느 서버에 가도 같은 상태를 유지하는데
세션의 경우 서버마다 다른 id의 세션이 생겨서 이를 동기화해주어야 한다
<c:url value="/../"/>
public class BoardController {
@GetMapping("/list")
public String list() {
return "boardList";
}
}
1, 2 결과
- 화면에서 Board를 클릭하면 게시판으로 넘어간다
- 로그인을 하지 않아도 넘어간다
-> 로그인 상태를 확인하도록 메서드를 만들자
private boolean loginCheck(HttpServletRequest request) {
HttpSession session = request.getSession();
return session.getAttribute("id")!=null;
}
public String list(HttpServletRequest request) {
if(!loginCheck(request))
return "redirect:/login/login?toURL="+request.getRequestURL();
return "boardList";
}
3, 4 결과
- 로그인을 하지 않으면 다시 로그인 화면으로 넘어간다
- 요청(request) 세션 객체(getSession)에 id가 없어서 로그인을 해도 id가 있는지(로그인을 했는지) 모른다
-> 로그인 하면 세션 객체를 얻어 와서 세션 객체에 id 저장하도록 만든다
loginController에서 id, pwd가 일치하면 세션에 id 저장
if(!loginCheck(id, pwd)) {
String msg = URLEncoder.encode("id 또는 pwd가 일치하지 않습니다.", "utf-8");
return "redirect:/login/login?msg="+msg;
}
HttpSession session = request.getSession();
session.setAttribute("id", id);
@GetMapping("/logout")
public String logout(HttpSession session) {
//세션 종료
session.invalidate();
//홈으로 이동
return "redirect:/";
}
<c:set var="loginOutLink" value="${sessionScope.id==null ? '/login/login' : '/login/logout'}"/>
<c:set var="loginOut" value="${sessionScope.id==null ? 'Login' : 'Logout'}"/>
.
.
<li><a href="<c:url value='${loginOutLink}'/>">${loginOut}</a></li>
8. 로그인 안되어 있을 때 게시판 누르면 로그인 창이 뜨고,
로그인 하면 다시 홈이 아니라 바로 게시판 창으로 갈 수 있도록
- BoardController
from: /ch2/ (홈)
to : /boardList/- loginForm.jsp
from: /ch2/
to: /login/login/@GetMapping("/login") public String loginForm() { return "loginForm"; }
- LoginController
from: login/login/
to: login/login/if(!loginCheck(id, pwd)) { String msg = URLEncoder.encode("id 또는 pwd가 일치하지 않습니다.", "utf-8"); return "redirect:/login/login?msg="+msg; } HttpSession session = request.getSession(); session.setAttribute("id", id);
HttpServletRequest req = (HttpServletRequest)request;
String referer = req.getHeader("referer"); //어디서 요청했는지
String method = req.getMethod(); // 요청한 메서드
System.out.print("["+referer+"] -> "+ method+ "["+req.getRequestURI()+"]");
return "redirect:/login/login?toURL="+request.getRequestURL();
<input type="hidden" name="toURL" value="${param.toURL}">
toURL = toURL==null || toURL.equals("") ? "/" : toURL;
return "redirect:"+toURL;
<%@ page session="false" %>