로그인 기능은 로그인 상태가 유지되어야 함. -- 서버가 로그인 상태를 지속해야 함.
그러나!
http 프로토콜(웹) 특징은 연결 유지 안한다는 것.
서버 | <<< response | 클라이언트 |
request >>> | ||
<<< new response | ||
new request >>> |
새로운 요청이 들어오면 기존 응답을 끊고 새로운 응답을 돌려줌. (like 단기기억상실증)
=> 로그인 기능 지속 불가능
=> session 과 cookie는 계속 연결이 유지되는 것처럼 프로그래밍하는 객체.
session | cookie |
서버에 저장 (안전) |
클라이언트 컴퓨터에 저장 (보안 취약) |
객체 형태로 저장 (object로 업캐스팅됨) autoboxing.. |
텍스트 형태로 저장 |
크기에 제약 없음 | 크기에 제약 있음 |
scope 객체 : 정보를 담을 수 있는 jsp/Servlet 내장 객체
=> page, request, session, application
- 모두 setAttribute(), getAttribute(), removeAttribute() 를 가짐. but, 정보 보유 시간이 다름
page : 현재 페이지에서만 쓸 수 있음.
==> 너무 짧음
application : 프로젝트가 서버에 올라갔을 때부터 내릴때까지 정보를 가지고 있음. 모든 페이지 사용 가능.
==> 시스템 정보 제외한 사용자 정보를 계속 가지고 있을 이유 없음.
그래서 request와 session 위주로 사용됨.
request -- 한 요청이 응답을 보낼 때까지 정보 살아있음.
session -- 세션이 invalidate 할 때까지 정보 살아있음. -- 보안에 민감한 정보는 담지 말기~
forward 방식으로 request가 전달되면, (forward(request, response))
사용자에게 응답페이지가 전달될 때까지 여러페이지를 거칠 수 있음.
그러나 request에 대한 응답이 끝나면 request의 정보 사라짐.
session 은 프로젝트 내의 모든 파일에 사용 가능함. 로그아웃하고 session이 종료될 때까지 정보 살아있음.
1. session
- 로그아웃 할 때까지 지속해야 하는 정보가 있을 때 session 을 사용
- 여러 기능, 여러 페이지에서 사용할 정보를 세션에 저장
=> 로그인 아이디, 멤버타입 (판매자, 구매자), 등급..
용도: 클라이언트에 대해서 유지해야하는 정보 저장
- 요청 한 개에 필요한 정보는 request에 담고, 로그아웃할 때까지 유지해야 하는 정보는 session에 담는다.
* 세션 트래킹
- 웹 어플리케이션에 첫 요청을 하면, 세션 id를 쿠키에 담아서 발급
- 클라이언트는 매 요청시 request 헤더에 발급받은 세션 id를 담아서 보냄.
1) 클라이언트가 서버에 요청 (request)
2) 요청받은 서버는 session 번호를 생성 -> 쿠키에 담음 -> 쿠키를 response에 담아서 클라이언트에게 전달
3) 클라이언트는 매 요청시 request 헤더에 발급받은 session id를 함께 보냄
1) session 생성
-- 자동생성 됨. 세션을 invalidate()해도 바로 새 세션이 생성됨.
-- 새로 웹브라우저 창을 가져오면 세션 만료.
JSP ▶ session 내장 객체 사용
Servlet ▶
HttpSession session = request.getSession();
--으로 세션 객체 가져와야 함.
2) session에 정보 저장
session.setAttribute("이름", 값);
-- object 타입으로 업캐스팅 되어 session에 저장
3) session 에서 정보 꺼내기
JSP ▶
${sessionScope.이름}
Servlet ▶
String val = (String)session.getAttribute("이름");
-- 원래 타입으로 다운캐스팅해야 함
4) session 정보 삭제
session.removeAttribute("이름");
-- 로그아웃하지 않아도 session에 저장한 정보 삭제할 수 있음.
5) 로그아웃
session.invalidate();
-- 세션 무효화. 바로 새 세션 생성.
2. Cookie
: 클라이언트 컴퓨터에 정보 저장.
- 텍스트 파일 형태로 보관
- 쿠키 저장 유효시간을 설정할 수 있음.
1) Cookie 생성
Cookie 변수명 = new Cookie("키", "값");
2) 생성한 Cookie를 response에 담음.
response.addCookie(변수명);
=> c에 담긴 정보가 클라이언트에 저장
3) Cookie 값 저장
-- 클라이언트에게 한 번 갔다와야 함 (jsp 이든 servlet이든간에)
response.sendRedirect(request.getContextPath()+"/index.jsp");
4) 다음 요청 시 request에서 Cookie를 꺼냄
JSP
${cookie.키.name } / 변수명.getName() => name 속성 (이름)
${cookie.키.value } / 변수명.getValue() => value 속성 (값)
Servlet
request.getCookies();
=> request에 담긴 전체 쿠키 읽음. (하나만 있어도 배열에 담김)
- 반환값 -- 배열 (Cookie[])
5) Cookie 값 수정
Cookie 동일한변수명 = new Cookie("변경할 쿠키 이름", "새 값");
-- 배열 마지막 순서로 들어감
6) Cookie 유효 시간 설정
cookie.setMaxAge(60*60*24); => 유효시간 하루. (초*분*시)
7) Cookie 삭제
- 쿠키 유효시간 0으로 설정
cookie.setMaxAge(0);
0) test 코드
CookieTest.java
package test;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CookieTest
*/
@WebServlet("/CookieTest")
public class CookieTest extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public CookieTest() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
// String name = request.getParameter("name");
// String hobby = request.getParameter("hobby");
// Servlet cookie 로 import
// Cookie 생성해서 response에 담기
Cookie c1 = new Cookie("name", "쿠키");
Cookie c2 = new Cookie("hobby", "먹기");
response.addCookie(c1);
response.addCookie(c2);
// 클라이언트에게 한 번 갔다 와야 쿠키가 저장됨.
response.sendRedirect(request.getContextPath()+"/CookieRead");
// response.sendRedirect(request.getContextPath()+"/index.jsp");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
index.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>
<h3>게시판</h3>
<a href = "${pageContext.request.contextPath }/member/login">로그인</a>
<h3>쿠키값</h3>
<!-- 쿠키값 가져오기 -->
${cookie.name.name }: ${cookie.name.value }<br/>
${cookie.hobby.name }: ${cookie.hobby.value }<br/>
<%-- ${cookie.JSESSIONID.name }: ${cookie.JSESSIONID.value }<br/> --%>
</body>
</html>
CookieRead.java
package test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class CookieRead
*/
@WebServlet("/CookieRead")
public class CookieRead extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public CookieRead() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
// 쿠키 값 읽는 서블릿.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.append("<html><body>");
// request에 담긴 모든 쿠키 객체 읽음 -> 배열에 담아서 줌
Cookie[] cookies = request.getCookies();
for (Cookie c:cookies) {
pw.append("<h3>");
pw.append(c.getName() + ": "); // Cookie.getName(): 쿠키이름 반환
pw.append(c.getValue() + "<br/>"); // Cookie.getValue(): 쿠키값 반환
pw.append("</h3>");
}
pw.append("</body></html>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}