본문 바로가기

Full Stack 교육 회고록

9/26(오전) jsp 쿠키와 세션

728x90
SMALL

<쿠키와 세션의 필요성>

[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(세션)
사용자 정보 저장 위치 클라이언트 서버
보안 상대적으로 불안전 상대적으로 안전
속도 상대적으로 빠름 상대적으로 느림
생명 주기 만료일이 되면 삭제 브라우저 종료 시 삭제

- 세션은 서버의 자원을 사용하기 때문에 무분별하게 만들다보면 서버의 메모리가 감당할 수 없어질 수가 있고 속도가 느려질 수 있다

728x90
LIST