해당 내용은 카카오 테크 캠퍼스의 1단계 1주차 강의를 들으며 작성한 내용입니다.
세션 - 이론
01. 세션이란?
서로 관련된 요청들을 하나로 묶은 것 - 쿠키를 이용 브라우저마다 개별 저장소(session 객체)를 서버에서 제공
A collection of related HTTP transactions made by one browser to one server
02. 세션의 생성과정
- 응답헤더에
세션 ID(Set-Cookie: JESSIONID=23DA…
) 담아서 브라우저에 보냄 - 브라우저에 쿠키를 저장하고 서버에 요청할때마다 쿠키를 담아서 보냄
03. 세션 객체 얻기
// request 객체로부터 session 객체를 얻어오는 메서드
HttpSession session = request.getSession() // 요청 헤더의 JSESSIONID와 일치하는 세션 반환
session.setAttribute("id", "asdf") // 저장
04. 세션과 관련된 메서드
method | 설명 |
---|---|
String getId() | 세션의 ID 반환 |
long getLastAccessedTime() | 세션 내에서 최근 요청을 받은 시간 반환 |
boolean isNew() | 새로 생성된 세션인지를 반환 |
request.getSession()호출 후 사용 | |
void invalidate() | 세션 객체 제거(저장된 객체도 함께) |
void setMaxInactiveInterval(int interval) | 지정된 시간(초)후에 세션을 종료(예약 종료) |
int getMaxInactiveInterval() | 예약된 세션 종료 시간 반환 |
속성 관련 메서드 | 설명 |
---|---|
void setAttribute(String name, Object value) | 지정된 값(value)을 지정된 속성 이름(name)으로 저장 |
Object getAttribute(String name) | 지정된 이름으로 저장된 속성의 값 반환 |
void removeAttribute(String name) | 지정된 이름의 속성 삭제 |
Enumeration getAttributeNames() | 기본 객체에 저장된 모든 속성의 이름 반환 |
05. 세션의 종료
종료 → 새로운 세션 ID 발급됨(새로운 세션 객체 생성)
수동 종료
HttpSession session = request.getSession();
session.invalidate(); // 세션 즉시 종료
session.setMaxInactiveInterval(30*60); //예약 종료(30분 후)
자동 종료 - web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
06. 쿠키 vs 세션
🍪 쿠키
- 브라우저에 저장
- 서버 부담 X
- 보안에 불리
- 서버 다중화에 유리
🌐 세션
- 서버에 저장
- 서버 부담 O
- 보안에 유리
- 서버 다중화에 불리
사용자가 쿠키를 허용 안 했을 가능성이 있으므로
처음엔 Url 뒤에 붙여주고 응답 헤더에도 set cookie에도 담아줌
쿠키가 허용됐으면 다음부터는 Url 뒤에 없어짐
세션(Session) - 실습
01. 게시판 이용시, 미로그인이면 로그인 화면으로 이동
1-1. boardController.java 생성 → 로그인 유무에 따른 처리
@Controller
@RequestMapping("/board")
public class boardController {
@GetMapping("/list")
public String list(HttpServletRequest request) {
if (!loginCheck(request))
return "redirect:/login/login"; // 로그인 안했으면 로그인 화면으로 이동
return "boardList"; // 로그인 했으면 게시판으로 이동
}
private boolean loginCheck(HttpServletRequest request) {
// 1. 세션을 얻어서
HttpSession session = request.getSession();
// 2. 세션에 id가 있는지 확인, 있으면 true로
return session.getAttribute("id") != null;
}
}
1-2. loginController.java 에서 로그아웃, 세션에 id 저장하기
@Controller
@RequestMapping("/login")
public class LoginController {
...
@GetMapping("/logout")
public String logout(HttpSession session) {
//1. 세션 종료
session.invalidate();
// 2. 홈으로 이동
return "redirect:/";
}
@PostMapping("/login")
public String login(String id, String pwd, boolean rememberId,
HttpServletRequest request, HttpServletResponse response) throws Exception {
...
// 2-2. id와 pwd 일치하면
// 세션 객체 얻어오기
HttpSession session = request.getSession();
// 세션 객체에 id 저장
session.setAttribute("id", id);
...
// 3. 홈으로 이동
return "redirect:/";
}
...
}
1-3. 로그인 유무에 따른 메뉴 및 url 변경 - index.java
<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>
02. 로그인 후, 게시판으로 이동
2-1. PerformFilter에서 어디서 어디로 보냈는지 확인
HttpServletRequest req = (HttpServletRequest)request;
String referer = req.getHeader("referer");
String method = req.getMethod();
// 어디서 어디로 보냈는지 알 수 있음
System.out.print("["+referer+"] ->"+ method + "[" + req.getRequestURI()+"]");
[http://localhost:8080/ch2/] ->GET[/ch2/login/login] 소요시간=4ms
[http://localhost:8080/ch2/] ->GET[/ch2/] 소요시간=3ms
...
2-2. boardController.java에서 이 정보를 loginForm.jsp에 보냄(GET)으로 loginForm.jsp에서 hidden input으로 만들어서 LoginController.java으로 보냄 boardList.jsp로 가도록 해줌!!
@GetMapping("/list")
public String list(HttpServletRequest request) {
if (!loginCheck(request))
return "redirect:/login/login?toURL=" + request.getRequestURL(); // 로그인 안했으면 로그인 화면으로 이동
return "boardList"; // 로그인 했으면 게시판으로 이동
}
<input type="hidden" name="toURL" value = "${param.toURL}">
http://localhost:8080/ch2/login/login?toURL=http://localhost:8080/ch2/board/list
@PostMapping("/login")
public String login(String id, String pwd, String toURL, boolean rememberId,
HttpServletRequest request, HttpServletResponse response) throws Exception {
...
// 3. 홈, 또는 게시판으로 이동
toURL = (toURL==null || toURL.equals("")) ? "/" : toURL;
return "redirect:" + toURL;
}
03. 세션을 시작할까? 에 대한 정보: session = “true” or session = “false”?
세션은 서버에 부담을 많이 주기 때문에 최대한 짧아야 한다.
session = true → 세션 없을때 새로 생성, session=false → 세션 없을때 새로 생성 X
3-1. index.jsp에서 session=false 추가
<%@ page session = "false" %>
⛔ 주의!!
session = false
일때sessionScope
와pageContext.session
사용 불가sessionScope.id
를pageContext.request.getSession(false).getAttribute(”id”)
로 변경해야 함getSession(true)는 session이 없는 경우 session을 새로 생성하기 때문에 session이 없어도 새로 생성하지 않도록
getSession(false)
사용
→ 로그인 페이지(loginForm)까지는 세션 생성 안됨
→ board누르면 세션 생성됨
📌 (참고)
@CookieValue("id") String cookieId
사용해서 쿠키 정보 읽어올 수 있당