* 세션(Session)
- 세션도 쿠키와 마찬가지로 서버와의 관계를 유지하기 위한 수단이다.
- 단, 쿠키와 달리 클라이언트의 특정 위치에 저장되는 것이 아니라, 서버상에 객체형태로 존재한다.
- 서버당 하나의 세션 객체를 가질 수 있다.
- 세션객체의 장점은 페이지가 달라지더라도 쿠키와 달리 계속 로그인이 되어있다. 브라우저 창을 종료하면 삭제된다.
- 따라서 세션은 서버에서만 접근이 가능하여 보안이 좋고, 저장할 수 있는 데이터에 한계가 없다.
- 세션은 클라이언트의 요청이 발생하면 자동 생성되고 고유한 ID값을 클라이언트에 넘겨주며 이것은 쿠키에 저장된다.
- JSP에서는 session이라는 내장 객체를 지원하여 세션의 속성을 설정할 수 있다. 즉 쿠키처럼 객체를 만들어줄 필요가 없다.
ex) 브라우저가 실행되면 브라우저당 1개 객체를 생성한다.
브라우저 종료, 시간이 만료되면 소멸된다. 그래서 자동로그인 생략하고 아무페이지를 종료하고 재접속하면 로그인이 풀려있다. (세션으로 만들어서 그렇다.) 은행페이지를 보면 세션도 시간을 주고 있다.
- session 객체 관련 메서드
1. setAttribute() - 세션에 데이터를 저장한다.
2. getAttribute() - 세션에 저장되어 있는 데이터를 얻는다.
3. getAttributeNames() - 세션에 저장되어 있는 모든 데이터의 세션 이름(key)을 얻는다.
4. getId() - 자동생성된 세션의 유니크한 아이디를 얻는다.
5. getCreationTime() - 세션이 생성된 시간을 구한다.
6.getLastAccessdTime() - 웹 브라우저가 가장 마지막에 세션에 접근한 시간을 구한다.
7. setMaxInactiveInterval() - 세션의 유효시간을 설정한다. 초단위로 기록한다.
8. getMacInactiveInterval() - 세션의 유효시간을 얻습니다. 가장 최근 요청시점을 기준으로 카운트됩니다.
9. removeAttribute() - 특정 세션을 삭제한다.
* 쿠키 vs 세션
- 쿠키 대신에 세션을 사용하는 가장 큰 이유는 세션이 쿠키보다 보안에서 앞서기 때문이다.
session_make.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
/*
- 세션은 쿠키와 마찬가지로 http통신 데이터를 유지하기 위한 수단으로 사용한다.
- 세션에 데이터를 저장할 때는 JSP내장객체 session이 지원하는 setAttribute()메서드를 사용한다.
- 해당 메서드의 첫번째 매개값으로 세션의 이름을 정하고, 두번째 매개값으로 세션에 저장할 값을 정해준다.
*/
session.setAttribute("nickname", "홍길동");
session.setAttribute("hobbys", new String[] {"축구", "게임", "독서"});
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="session_check.jsp">세션 데이터 활용하기</a>
</body>
</html>
session_check.jsp
<%@page import="java.util.Arrays"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
/*
- 세션에 저장된 데이터는 브라우저 창이 종료될 때까지 혹은 세션의 유효시간이 만료되기 전까지
웹 어플리케이션의 모든 jsp페이지에서 사용할 수 있습니다.
- 세션에 저장된 데이터를 가져오려면 session객체의 getAttribute()메서드를 사용하며
매개값으로 가져올 데이터의 세션명을 적는다.
*/
String nick = (String)session.getAttribute("nickname");
String[] hobbys = (String[])session.getAttribute("hobbys");
out.println(nick + "<br/>");
out.println(Arrays.toString(hobbys) + "<br/>");
out.println("======================<br/>");
//세션의 유효시간 설정.
session.setMaxInactiveInterval(60 * 60); //1시간 설정.
int sTime = session.getMaxInactiveInterval();
out.println("세션의 유효시간: " + sTime + "초<br/>");
out.println("============================<br/>");
//특정세션 데이터 삭제.
session.removeAttribute("nick");
nick = (String)session.getAttribute("nick");
out.println("삭제 후 nick의 값: " + nick + "<br/>");
out.println("============================<br/>");
//모든 세션 데이터 삭제.
session.invalidate();
//세션이 존재하는지 확인
if(request.isRequestedSessionIdValid()){
out.println("유효한 세션이 존재한다.");
}else {
out.println("유효한 세션이 존재하지 않음.");
}
%>
쿠키와 세션은 잘 알아두어야한다.
- 쿠키의 삭제는 세션과 달리 메서드가 존재하지 않는다. 대신 쿠키 유효시간을 0으로 두면 된다.setMaxAge(0);
- 쿠키를 사용하는 페이지는 로그인 페이지에 자동로그인 체크라인이 있다. 자동로그인을 체크하면 아이디 패스워드가 저장되어 유효시간이 끝날때 까지 계속 그 페이지를 자동로그인상태로 사용할 수 있다. 대신 보안에 취약
- 반면 세션은 자동로그인 기능이 없다. 유효시간이 만료되거나 브라우저 창이 닫히면 세션도 종료된다.
두번째 실습.
session_login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
fieldset {
width: 50%;
align-content: center;
}
</style>
</head>
<body>
<%
if(session.getAttribute("user_id") != null){
String nick = (String)session.getAttribute("user_nick");
%>
<p><%=nick %>님이 현재 로그인중입니다.</p>
<a href="session_welcome.jsp">메인페이지로</a>
<% } else {%>
<form action = "session_login_ok.jsp" method="post">
<fieldset>
<legend>로그인 폼</legend>
<input type="text" name="id" size="10" placeholder="ID" /><br/>
<input type="password" name="PW" size="10" placeholder="PW" /><br/>
<input type="text" name="nick" size="10" placeholder="별명" /><br/>
<input type="submit" value="로그인" />
</fieldset>
</form>
<% } %>
</body>
</html>
session_login.jsp
<%@page import="java.awt.Window.Type"%>
<%@page import="javax.script.ScriptContext"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 중간 연결 로직 -->
<%
request.setCharacterEncoding("utp-8");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String nick = request.getParameter("nick");
if(id.equals("kkk7777") && pw.equals("7777")) {
session.setAttribute("user_id", id);
session.setAttribute("user_nick", nick);
response.sendRedirect("session_welcome.jsp");
}else {
%>
//잠시 자바스크립트 언어를 사용하겠다.
<!--
*HTML내부에 자바스크립트 코드를 사용하려면 <script>태그를 사용한다.
-js 내장함수 alert()은 브라우저에 경고창을 띄운다.
-js내장객체 history가 제공하는 back()메서드는 뒤로가기 기능을 수행한다.
-->
<Script type="text/javascript">
alert("로그인을 실패했습니다.");
history.back();
</script>
}
<%} %>
session_welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
/*
1. 로그인하지 않은 사용자가 주소창에 이 페이지를 URL을 적고 들어왔을 경우
로그인창으로 돌려보내는 코드르 작성하세요.
2. 로그인한 회원의 아이디와 별명을 통해 "nick(id)님 환영하세요"를 출력하세요.
3. a태그로 로그인창으로 돌아가는 링크와 request폴더에 앨범페이지로 갈 수 있는 링크 2개를 작성하세요.
*/
if(session.getAttribute("user_id") == null) {
response.sendRedirect("session_login,jsp");
}
String nick = (String)session.getAttribute("user_nick");
String id = (String)session.getAttribute("user_id");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3><%= nick %>(<%= id %>)님 환영합니다.~~!</h3>
<a href="../JspObjRequest/req_album.jsp">앨범 리스트 보기</a>
<a href="session_Login.jsp">로그인 페이지로</a>
<a href="session_Logout.jsp.jsp">로그아웃</a>
</body>
</html>
session.logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
session.invalidate();
response.sendRedirect("session_login.jsp");
%>
쿠키(Cookie)
HTTP의 일종으로 사용자가 어떠한 웹 사이트를 방문할 경우,
그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장하는 작은 기록 정보 파일이다.
HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장하였다가 필요시 정보를 참조하거나 재사용할 수 있다.
- 쿠키 특징
- 이름, 값, 만료일(저장기간), 경로 정보로 구성되어 있다.
- 클라이언트에 총 300개의 쿠키를 저장할 수 있다.
- 하나의 도메인 당 20개의 쿠키를 가질 수 있다.
- 하나의 쿠키는 4KB(=4096byte)까지 저장 가능하다.
- 쿠키의 동작 순서
- 클라이언트가 페이지를 요청한다. (사용자가 웹사이트에 접근)
- 웹 서버는 쿠키를 생성한다.
- 생성한 쿠키에 정보를 담아 HTTP 화면을 돌려줄 때, 같이 클라이언트에게 돌려준다.
- 넘겨받은 쿠키는 클라이언트가 가지고 있다가(로컬 PC에 저장) 다시 서버에 요청할 때 요청과 함께 쿠키를 전송한다.
- 동일 사이트 재방문 시 클라이언트의 PC에 해당 쿠키가 있는 경우, 요청 페이지와 함께 쿠키를 전송한다.
- 사용 예시
- 방문 사이트에서 로그인 시, "아이디와 비밀번호를 저장하시겠습니까?"
- 팝업창을 통해 "오늘 이 창을 다시 보지 않기" 체크
세션(Session)
일정 시간 동안 같은 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 유지시키는 기술이다.
여기서 일정 시간은 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점부터 웹 브라우저를 종료하여 연결을 끝내는 시점을 말한다.
즉, 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라고 한다.
- 세션 특징
- 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장한다.
- 웹 서버의 저장되는 쿠키(=세션 쿠키)
- 브라우저를 닫거나, 서버에서 세션을 삭제했을 때만 삭제가 되므로, 쿠키보다 비교적 보안이 좋다.
- 저장 데이터에 제한이 없다. (서버 용량이 허용하는 한에서)
- 각 클라이언트에 고유 Session ID를 부여한다. Session ID로 클라이언트를 구분해 각 요구에 맞는 서비스를 제공
- 세션의 동작 순서
- 클라이언트가 페이지에 요청한다. (사용자가 웹사이트에 접근)
- 서버는 접근한 클라이언트의 Request-Header 필드인 Cookie를 확인하여, 클라이언트가 해당 session-id를 보냈는지 확인한다.
- session-id가 존재하지 않는다면 서버는 session-id를 생성해 클라이언트에게 돌려준다.
- 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 서버에 저장한다.
- 클라이언트는 재접속 시, 이 쿠키를 이용해 session-id 값을 서버에 전달
- 사용 예시
- 화면을 이동해도 로그인이 풀리지 않고 로그아웃하기 전까지 유지
쿠키와 세션의 차이
- 쿠키와 세션은 비슷한 역할을 하며, 동작 원리도 비슷하다. 그 이유는 세션도 결국 쿠키를 사용하기 때문이다.
- 큰 차이점은 사용자의 정보가 저장되는 위치이다. 쿠키는 서버의 자원을 전혀 사용하지 않으며, 세션은 서버의 자원을 사용한다.
- 보안 면에서 세션이 더 우수하며,
- 쿠키는 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스니핑 당할 우려가 있어서 보안에 취약하지만
- 세션은 쿠키를 이용해서 session-id만 저장하고 그것으로 구분하여 서버에서 처리하기 때문에 비교적 보안성이 높다.
- 라이프 사이클은 쿠키도 만료기간이 있지만 파일로 저장되기 때문에 브라우저를 종료해도 정보가 유지될 수 있다. 또한 만료기간을 따로 지정해 쿠키를 삭제할 때까지 유지할 수도 있다.
- 반면에 세션도 만료기간을 정할 수 있지만, 브라우저가 종료되면 만료기간에 상관없이 삭제된다.
- 속도 면에서 쿠키가 더 우수하며,
- 쿠키는 쿠키에 정보가 있기 때문에 서버에 요청 시 속도가 빠르고
- 세션은 정보가 서버에 있기 때문에 처리가 요구되어 비교적 느린 속도를 낸다.
보통 쿠키와 세션의 차이에 대해서 저장 위치와 보안에 대해서는 잘 알고 있지만, 사실 가장 중요한 것은 라이프사이클이다.
Q. 세션을 사용하면 좋은데 왜 쿠키를 사용할까?
A. 세션이 쿠키에 비해 보안이 높은 편이나 쿠키를 사용하는 이유는 세션은 서버에 저장되고, 서버의 자원을 사용하기에
서버 자원에 한계가 있고, 속도가 느려질 수 있기 때문에 자원관리 차원에서 쿠키와 세션을 적절한 요소 및 기능에 병행 사용하여
서버 자원의 낭비를 방지하며 웹사이트의 속도를 높일 수 있다.
참고:
'IT' 카테고리의 다른 글
12. 자바 - This, Super (1) | 2022.09.21 |
---|---|
11-1. 자바 - 상속, 오버라이딩, 오버로딩 (0) | 2022.09.17 |
8-1. JSP Action Tag - forward, include, param, sendRedirect 와 forward의 차이 (0) | 2022.09.13 |
8. JSP 에러페이지 처리 (0) | 2022.09.13 |
6. JSP - 클라이언트와 서버간의 데이터 유지 cookie (로그인창 구현) (0) | 2022.09.07 |