<쿠키와 세션의 필요성>
[http]
- connectionless(비연결성): 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징
- stateless(무상태): 통신이 끝나면 상태를 유지하지 않는 특징
==>쿠키와 세션을 사용하여 사용자의 상태를 유지할 수 있다
[쿠키(cookie)]
: 클라이언트(브라우저)에 저장되는 키(name)와 값(value)이 들어있는 작은 데이터 파일
Cookie(쿠키) 사용 예
1. ID저장, 로그인 상태 유지
2. 일주일간 다시 보지 않기
3. 쇼핑몰 장바구니 기능
Cookie(쿠키)단점
1. 보안에 취약
2. 작은 허용 용량
3 브라우저를 변경할 경우 다른 브라우저에서 저장한 쿠키 값을 사용할 수 없음
<Ex01CreateCookie.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>
</head>
<body>
<%
//1. 쿠키 생성
//쿠키 객체 Cookie(키(String),값(String)) 활용
Cookie cookie = new Cookie("test", "firstcookie");
//2. 유효기간 설정(초단위)
cookie.setMaxAge(60*60*24*365);
//-----서버 역할(쿠키 생성, 값 수정...)
//3. 서버 -> 클라이언트(응답:response)에 쿠키 전송
response.addCookie(cookie);
//4. 쿠키 생성 후 바로 전송(유효 기간 설정 생략)
response.addCookie(new Cookie("test2","smhrd"));
%>
<a href="Ex02getCookie.jsp">쿠키 확인</a>
</body>
</html>
<Ex02getCookie.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>
</head>
<body>
<%
//클라이언트가 저장하고 있는 쿠키를 서버로 전송(요청 : request)
Cookie[] cookies = request.getCookies();
//키 : 값 출력
for(Cookie c:cookies){
out.print(c.getName()+":"+c.getValue()+"<br>");
}
%>
<a href="Ex03RemoveCookie.jsp">쿠키 삭제</a>
</body>
</html>
<Ex03Removecookie.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>
</head>
<body>
<%
//1. 삭제할 쿠키의 name과 똑같은 name을 가진 쿠키 객체 생성
Cookie cookie = new Cookie("test2", "");
//2. 유효기간 0으로 설정
cookie.setMaxAge(0);
//3. 클라이언트에 쿠키 전송
response.addCookie(cookie);
%>
<a href="Ex02getCokkie.jsp">쿠키확인</a>
</body>
</html>
Session(세션)
: 브라우저가 종료되기 전까지 클라이언트의 정보를 유지하게 해주는 기술
- 사용자 정보 파일을 서버 측에서 관리
session(세션)특징
1. 각 클라이언트에게 고유id를 부여
2. 보안 면에서 쿠키보다 우수
3. 사용자가 많아질수록 서버 메모리를 많이 차지하게 됨
session(세션) 사용 예
1.로그인 같이 보안상 중요한 작업을 수행할 때 사용
<Ex04CreateSessoion.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>
</head>
<body>
<%
//1. 세션 값 설정
//2. 세션 -> 내장객체(jsp 상에서는 객체 생성 따로 하지 않아도 됨!)
//session (키(String),값(Object))
session.setAttribute("id","smhrd");
session.setAttribute("age", 20);
%>
<a href="Ex05getSession.jsp">세션확인</a>
</body>
</html>
<Ex05getSession.jsp>
<%@page import="java.util.Arrays"%>
<%@ 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>
</head>
<body>
<%
//세션 값 가져오기
//getAttribute 반환타입: Object -> 비어있으면 ->null
String id = (String)session.getAttribute("id");
Integer age = (Integer)session.getAttribute("age");
int[] arr= (int[]) session.getAttribute("number");
%>
아이디: <%= id %><br>
나이: <%=age %>
<%= Arrays.toString(arr) %>
<a href="Ex06removeSession.jsp">세션 삭제</a>
<a href="Ex07invalidate.jsp">세션전체삭제</a>
</body>
</html>
<Ex06removeSession.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>
</head>
<body>
<%
//특정 세션 삭제
session.removeAttribute("age");
%>
<a href="Ex05getSession.jsp">세션확인</a>
</body>
</html>
<Ex07invalidate.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>
</head>
<body>
<%
//세션 전체 삭제
session.invalidate();
%>
<a href="Ex05getSession.jsp">세션확인</a>
</body>
</html>
<createSession.java>
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/createSession")
public class createSession extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//session 객체 생성
HttpSession session = request.getSession();
int[] number = {1,2,3};
session.setAttribute("number", number);
response.sendRedirect("Ex05getSession.jsp");
}
}
<loginform.html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="logincheck.jsp" method="post">
아이디: <input type="text" name="id">
비밀번호: <input type="password" name="pw">
<input type="submit" value="로그인">
</form>
</body>
</html>
<logincheck.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>
</head>
<body>
<%
String id=request.getParameter("id");
String pw=request.getParameter("pw");
if(id.equals("test")&&pw.equals("12345")){//둘다 일치
//닉네임 세션 생성
session.setAttribute("nick", "핑구");
//main.jsp로 이동
response.sendRedirect("main.jsp");
}else{ //하나라도 다른 경우
//login.html 돌아가기
response.sendRedirect("login.html");
}
%>
</body>
</html>
<logout.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>
</head>
<body>
<%
//닉네임 세션 하나만 삭제
session.removeAttribute("nick");
//세션 전부 삭제
session.invalidate();
response.sendRedirect("loginform.html");
%>
</body>
</html>
<main.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>
</head>
<body>
<%
String nick = (String)session.getAttribute("nick");
%>
<%=nick %>님 환영합니다.
<a href="logout.jsp">로그아웃</a>
</body>
</html>
[쿠키와 세션의 차이]
Cookie(쿠키) | Session(세션) | |
사용자 정보 저장 위치 | 클라이언트 | 서버 |
보안 | 상대적으로 불안전 | 상대적으로 안전 |
속도 | 상대적으로 빠름 | 상대적으로 느림 |
생명 주기 | 만료일이 되면 삭제 | 브라우저 종료 시 삭제 |
- 세션은 서버의 자원을 사용하기 때문에 무분별하게 만들다보면 서버의 메모리가 감당할 수 없어질 수가 있고 속도가 느려질 수 있다
'Full Stack 교육 회고록' 카테고리의 다른 글
9/27- jsp/servelet or 리액트( jsx, component, props) (0) | 2022.09.27 |
---|---|
9/26 (오후) 리액트 [JSX문법, React 사용방법, 디렉토리 구조] (0) | 2022.09.26 |
9/23- JSP (0) | 2022.09.23 |
9/22 jsp/servlet 실습 (0) | 2022.09.22 |
9/21 jsp/servlet (was구조, servlet 특징, request vs response, url mapping) (0) | 2022.09.21 |