세션이란
세션은 브라우저를 구별하기 위해 서버에서 생성하는 객체이다.
서버 세션을 사용하면 클라이언트의 상태를 저장할 수 있다.
쿠키와의 차이점은 세션은 웹 브라우저가 아닌 서버에 값을 저장한다는 점이다.
또 세션에는 모든 타입의 객체가 저장될 수 있다.
서버는 세션을 사용해서 클라이언트 상태를 유지할 수 있기 때문에
로그인, 장바구니 등에 사용된다.
기본객체와 영역에서 살펴봤듯이 서버는 브라우저별로 세션을 생성해서 관리한다.
기본적으로 브라우저가 처음 서버에 접근하면 서버는 해당 브라우저에 관한
세션을 생성한다. 그 후로는 이미 생성된 세션을 사용한다.
세션 동작방식
1.브라우저가 처음으로 요청할 때는 아무런 쿠키 없이 요청을 한다.2. 쿠키가 없는 요청이기 때문에 서버에서는 새로운 브라우저라는걸 인식한다.
3. 서버는 새로운 브라우저에대한 세션을 생성한다. 이 때 session에 ID로 고유한 값을 설정한다.4. session에 대한 고유ID값을 쿠키에 담아서 보낸다. 쿠키(JSESSIONID,세션고유ID)
5.이후 브라우저는 요청을 보낼때마다 JSESSIONID 쿠키를 보내게 된다.
서버는 가지고 있는 세션들 중에 JSESSIONID에 담긴 고유값이랑 같은 세션을 찾는다.
이렇게 브라우저별로 세션 1개씩 가지고 있게해서, 서버는 브라우저를 구별하게된다.
세션실습
세션 기본 정보
세션은 기본적으로 브라우저가 요청할 시 서버가 자동적으로 생성한다.
이 때 생성시간과 접근시간을 비교해보자.
접근시간은 브라우저가 서버에 접근할 때의 시간인데 서버는 한번 세션을 생성한 후
이미 생성된 세션을 사용하므로 재 요청시 세션 생성 시간과는 차이가 있게된다.
01sessionInfo.jsp
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<%@include file="/WEB-INF/inc/header.jsp" %>
<%
request.setCharacterEncoding("utf-8");
%>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@include file="/WEB-INF/inc/top.jsp" %>
session ID : <%=session.getId()%><br>
시간<%=session.getCreationTime() %>
<%
long createIime =session.getCreationTime();
long accessTime=session.getLastAccessedTime();
Date createDate=new Date();
Date accessDate=new Date();
SimpleDateFormat sdf=
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
createDate.setTime(createIime);
accessDate.setTime(accessTime);
session.setMaxInactiveInterval(15);
%><br><br><br>
생성시간 : <%=sdf.format(createDate)%> <br>
접근시간 : <%=sdf.format(accessDate) %>
</body>
</html>
LocalDateTime 사용
<%@ page import="java.time.LocalDateTime" %>
<%@ page import="java.util.TimeZone" %>
<%@ page import="java.time.Instant" %>
<%@ page import="java.time.format.DateTimeFormatter" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
session Id : <%=session.getId()%><br>
<%
long creationTime= session.getCreationTime();
long lastAccessedTime= session.getLastAccessedTime();
LocalDateTime creationTimeLDT=LocalDateTime.ofInstant(Instant.ofEpochMilli(creationTime), TimeZone.getDefault().toZoneId());
LocalDateTime lastAccessedTimeLDT=LocalDateTime.ofInstant(Instant.ofEpochMilli(lastAccessedTime), TimeZone.getTimeZone("Asia/Seoul").toZoneId());
session.setMaxInactiveInterval(10);
%>
생성시간 : <%=creationTimeLDT.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))%> <br>
접근시간 : <%=lastAccessedTimeLDT.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))%> <br>
</body>
</html>
실행결과
처음
10초 후 새로고침
10초가 지난 이후에 새로고침을 한다면 세션이 새로 생성된걸 알 수 있다.
getCreationTime(), getLastAccesdTime()은 말 그대로
세션생성시간,접근시간을 return해준다.
setMaxInactiveInterval()은 세션의 지속시간을 설정해준다.
기본적으로 session은 한번 생성된 후 계속 사용되지만 setMaxInactiveInterval()을 설정하면
해당 시간동안 session객체에 접근이 없으면 session을 삭제한다.
(접근이 없으면이다. 설정된 시간동안 존재하는게 아니라...
네이버 로그인하고 이런저런일을 3시간해도 로그인은 유지되어있지만,
1시간동안 아무것도안하다가 오면 로그아웃되어있다.)
기본적으로 session의 지속시간은 30분 or 60분이다.
세션삭제
invalidate()함수를 이용해 세션을 삭제한다. 이후 해당 브라우저가 다시 요청하면
서버는 세션을 다시 생성한다.
01deleteSession.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<%@include file="/WEB-INF/inc/header.jsp" %>
<%
request.setCharacterEncoding("utf-8");
%>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@include file="/WEB-INF/inc/top.jsp" %>
<%
session.invalidate();
%>
</body>
</html>
session은 지속시간에 관계없이 invalidate() 메소드 실행을 하면 세션이 삭제된다.
01deleteSession.jsp를 실행한 후
01sessionInfo.jsp를 실행하면 세션이 다시 생성된걸 알 수 있다.
세션에 속성 저장하기, 속성 제거하기
02setSessionInfo.jsp
session에 UserVO를 저장하는 코드다.
<%@page import="com.study.login.vo.UserVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<%@include file="/WEB-INF/inc/header.jsp" %>
<%
request.setCharacterEncoding("utf-8");
%>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@include file="/WEB-INF/inc/top.jsp" %>
<%
UserVO user1=new UserVO();
user1.setUserId("aaa");
UserVO user=new UserVO();
user.setUserId("bbb");
session.setAttribute("user", user);
session.setAttribute("user1", user1);
%>
</body>
</html>
02getSessionInfo.jsp
session에 UserVO를 저장하는 코드다.
<%@page import="com.study.login.vo.UserVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<%@include file="/WEB-INF/inc/header.jsp" %>
<%
request.setCharacterEncoding("utf-8");
%>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@include file="/WEB-INF/inc/top.jsp" %>
<%=((UserVO)session.getAttribute("user")).toString() %> <br>
<%=((UserVO)session.getAttribute("user1")).toString() %>
</body>
</html>
02setSessionInfo.jsp먼저 실행 후 02getSessionInfo.jsp를 실행해보자.
속성에 저장한 userVO를 get해서 얻을 수 있다.
다만 세션은 브라우저별로 있기 때문에
크롬에서 set한후 expoler에서 02sessionInfo.jsp를 실행해봐도 userVO를 얻을 수 없다.
02removeAttr.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<%@include file="/WEB-INF/inc/header.jsp" %>
<%
request.setCharacterEncoding("utf-8");
%>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@include file="/WEB-INF/inc/top.jsp" %>
<%
session.removeAttribute("user");
%>
</body>
</html>
session에 저장된 속성중 특정 속성을 제거할 수 있다.
02removeAttr.jsp 실행 후 02getSessionInfo.jsp를 보면
'user'는 지워저서 02getSessionInfo.jsp 중
<%=((UserVO)session.getAttribute("user")).toString() %>
부분에서 NullPointerException이 발생한다. (session.getAttribute("user")가 null이다)
세션을 이용한 로그인
https://drive.google.com/drive/folders/1uHumdQakO7YC89ZfQeIyGcoGufJGvhdj?hl=ko
jsp 기초->세션의 자료를 받자.
study의 session부분을 완성해보자