(Hyper Text Transfer Protocol)
비연결형 프로토콜
✔ 그래서 Client의 정보를 지속적으로 유지하기 위한 방법으로 Cookie & Session이 필요하다~
: 전달할 데이터를 Web Browser(Client)로 보냈다가 Web Server로 되돌려 받는 방법
Chrome 설정에서 서드 파티 쿠키 허용해줌.

Chrome 웹 스토어에서 EditThisCookie 확장 프로그램 설치해줌

https://chromewebstore.google.com/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?hl=ko&pli=1

Cookie의 특징
1. 쿠키는 Client의 브라우저(PC)에 저장된다.
2. Text형태만 값을 저장할 수 있다.
3. 도메인당 20개, 쿠키 하나당 4KB
4. Session에 비해 상대적으로 보안에 취약하다.
① 쿠키 만들기 - 생성자 안에 이름과 값을 넣어준다.
Cookie cookie = new Cookie("visit", "OK");

→ broswer를 다 꺼버리는 순간 보통 Cookie는 사라지는데 쿠키의 유통기한을 정할 수 있다
② 쿠키의 유통기한 정하기 (초단위로 되어있다)
cookie.setMaxAge(60*60*24*365); // 1년

→ 1년으로 유통기한 설정해봄
③ 쿠키 보내기
response.addCookie(cookie);
[실습] Client가 가지고 있는 쿠키들의 이름을 출력하시오
<%-- jsp --%>
<body>
<%
// Client가 가지고 있는 쿠키 가져오기
Cookie[] cookies = request.getCookies();
// [문제] 쿠키 배열에 있는 쿠키들의 이름을 출력하시오
for(int i = 0; i < cookies.length; i++){
out.println(cookies[i].getName() + "<br>");
}
%>
</body>

[실습] Client가 가지고 있는 쿠키들의 이름과 값을 출력하시오
<%-- jsp --%>
<body>
<%
Cookie[] cookies = request.getCookies();
// [문제] 쿠키 배열에 있는 쿠키들의 이름과 값을 출력하시오
for(int i = 0; i < cookies.length; i++){
out.println(cookies[i].getName() + "-");
out.println(cookies[i].getValue() + "<br>");
}
%>
</body>

쿠키 삭제하기
<%-- jsp --%>
<body>
<%
Cookie cookie = new Cookie("visit", "");
cookie.setMaxAge(0); // 보내지자마자 삭제하기
response.addCookie(cookie);
%>
</body>

visit cookie는 사라짐
Session의 특징
1. Session에는 Object 형태로 저장가능 (다 가능) - 객체말고 class object임
2. 용량 제한이 따로 존재하지 않는다
3. 세션은 브라우저당 하나씩 발급이 된다
✔ 세션은 브라우저를 종료하는 순간 만료된다
✔ 세션의 만료시간은 기본 30분이다 (아무 행동하지 않을 시)
✔ 쿠키 삭제시 세션은 자동적으로 사라짐
4. Cookie에 비해 상대적으로 보안에 강력하다
(1) session.setAttribute(name, value) 형태로 세션 값 저장하기
→ 세션에 값을 저장하는 순간 어떠한 데이터든 다 Object로 변환된다. (UpCasting)
(2) 세션 안에 저장된 값 확인하기
→ 세션 안에 저장된 데이터는 다 Object 형태로 저장되어 있다.
→ 원하는 데이터 타입으로 사용하기 위해서는 자식데이터 타입을 변환해줘야 한다. (DownCasting)
<%-- jsp --%>
<body>
<%
// 세션에 값을 저장하기 (UpCasting)
session.setAttribute("nickName", "마루는강쥐");
// 세션 안에 저장된 값 확인하기 (DownCasting)
String nickName = (String)session.getAttribute("nickName");
%>
<%= nickName %>님 환영합니다!
<body>

(3) session.setMaxInactiveInterval() 세션에 생명주기 (초단위로 입력)
<%-- jsp ①--%>
<body>
<%
session.setAttribute("nickName", "마루는강쥐");
session.setMaxInactiveInterval(80); // 세션에 생명주기 (초단위)
String nickName = (String)session.getAttribute("nickName");
%>
<%= nickName %>님 환영합니다!
<body>
→ 80초 이후시 세션 종료됨!
[실습] 'nickname' + '여기는 개인정보 페이지입니다' 출력하기
<%-- jsp ② --%>
<body>
<%
String nickName = (String)session.getAttribute("nickName");
%>
<%= nickName %> 여기는 개인정보 페이지입니다.
</body>
jsp① 실행 후 jsp② 실행해보기
- 세션 만료가 되면 nickName을 가져올 수 없어서 null값이 뜬다
- 새로고침(실행)시 세션은 계속 초기화된다.
로그인 후 세션 있을 시

세션 만료시 NULL 값 출력

[실습] 로그인 창 만들기

<%-- jsp ① (ex07login.jsp)--%>
<body>
<form action="Ex07LoginService" method="post">
<h3>로그인</h3>
아이디 : <input type="text" name="id"><br>
비밀번호 : <input type="password" name="pw"><br>
<input type="submit" value="로그인">
</form>
</body>

입력받은 id는 maru, pw는 1122일 경우 Session에
'nick'을 '마루'로 정하여 저장하고 'ex07main.jsp'로 보내기
// .java(Servlet) (Ex07LoginService)
String id = request.getParameter("id");
String pw = request.getParameter("pw");
if(id.equals("maru") && pw.equals("1122")) {
// 로그인 성공
// Servlet에서 Session 사용하는 방법
HttpSession session = request.getSession();
// 'nick'을 '마루'로 정해주기
session.setAttribute("nick", "마루");
response.sendRedirect("ex07main.jsp");
} else {
// 로그인 실패시 - ex07login.jsp로 이동시키시오
response.sendRedirect("ex07login.jsp");
}
}
[실습]
1. 로그인 성공한 사람의 nick을 표현하세요
예) '마루'님 환영합니다.
2. 입력받은 id, pw가 'maru', '1122'가 아니면 '로그인페이지로 이동'
<%-- jsp ② (ex07main.jsp)--%>
<body>
<%
// session "nick" 가져와서 String으로 변환 후 String nick에 담아줌
String nick = (String)session.getAttribute("nick");
%>
<% if (nick != null){ %>
'<%= nick %>'님 환영합니다.
<a href="ex07logoutService">로그아웃</a>
<% }else { %>
<a href="ex07login.jsp">로그인 페이지로 이동</a>
<% } %>
</body>
세션 있을 시

로그아웃 누르거나 세션 만료시
