HTTP 프로토콜의 특징 이자 약점을 보완 하기 위해서 쿠키 또는 세션을 사용한다.
쿠키와 세션을 이해하기위해 HTTP의 특징을 간다한게 짚고 넘어 가려고 한다.
HTTP 프로토콜 환경은 "connectionless, stateless"
한 특성을 가지기 때문에 서버는 클라이언트가 누구인지 매번 확인해야합니다. 이 특성을 보완하기 위해서 쿠키와 세션을 사용하게 된다.
❗Connectionless 프로토콜 (비연결 지향)
클라이언트가 서버에 요청(Request)을 했을 때, 그 요청에 맞는 응답(Response)을 보낸 후 연결을 끊는 처리방식이다.
❗Stateless 프로토콜
연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성이 있다.
*쿠키사용 화면 첨부
package pack;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
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;
@WebServlet("/CookieTest")
public class CookieTest extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
// 쿠키가 없는 경우에만 로그인 화면 출력
String id = null;
String pwd = null;
try {
Cookie[] cookies = request.getCookies(); // 클라이언트 쿠기를 모두 읽음
for(int i=0; i < cookies.length; i++) {
String name = cookies[i].getName();
System.out.println("읽은 쿠키 name : " + name);
if(name.equals("id")) {
id = URLDecoder.decode(cookies[i].getValue(), "utf-8");
}
if(name.equals("pwd")) {
pwd = URLDecoder.decode(cookies[i].getValue(), "utf-8");
}
}
} catch (Exception e) {
// TODO: handle exception
}
if(id != null && pwd != null) {
out.println(id+ "님 쿠기를 통해 로그인 상태입니다");
out.println("</body></html>");
out.close();
return;
}
out.println("*로그인*");
out.println("<form method='post'>");
out.println("i d : <input type='text' name='id'><br/>");
out.println("pwd : <input type='password' name='pwd'><br/>");
out.println("<input type='submit' value='로그인'>");
out.println("</form>");
out.println("</body></html>");
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
System.out.println(id + " " + pwd);
if (id.equals("aa") && pwd.equals("11")) {
try {
// 로그인에 성공하면 쿠키 작성
id = URLEncoder.encode(id, "utf-8");
Cookie idCookie = new Cookie("id", id); // javax의 쿠키임
idCookie.setMaxAge(60 * 60 * 24 * 365);
pwd = URLEncoder.encode(pwd, "utf-8"); // 이 부분 수정
Cookie pwdCookie = new Cookie("pwd", pwd); // javax의 쿠키임
pwdCookie.setMaxAge(60 * 60 * 24 * 365);
response.addCookie(idCookie); // 클라이언트 컴에 저장
response.addCookie(pwdCookie);
out.println("로그인 성공 - 쿠키가 설정됨");
} catch (Exception e) {
out.println("쿠키 작성 실패");
System.out.println("쿠키 작성 실패: " + e);
}
} else {
out.println("로그인 실패");
}
}
}
package pack;
import java.io.IOException;
import java.io.PrintWriter;
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;
/**
* Servlet implementation class SessionTest
*/
@WebServlet("/SessionTest")
public class SessionTest extends HttpServlet {
private static final long serialVersionUID = 1L;
//세션은 방문자의 요청에 따른 정보를 방문자 메모리에 저장하는 것이 아닌 웹 서버가 세션 아이디 파일을 만들어
//서비스가 돌아가고 있는 서버에 저장을 하는 것을 말한다.
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(true); // 현재 접속한 사용자의 세션이 있으면 읽고 없으면 생성 o
// HttpSession session = request.getSession(false); // 현재 접속한 사용자의 세션이 있으면 읽고 없으면 생성 x
session.setMaxInactiveInterval(5); // 5초 간 세션 유효 (기본 값은 30분)
if(session != null) {
session.setAttribute("name", "홍길동");
}
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("session id :" + session.getId());
out.println("<br>사용자명 :" + session.getAttribute("name"));
out.println("</body></html>");
out.close();
}
}
❗ 쿠키와 세션의 저장위치, 보안, 속도, 라이프 사이클 차이를 알고있어야 한다.
종류 | 쿠키(Cookie) | 세션(Session) |
---|---|---|
저장 위치 | 클라이언트(사용자 pc) | 웹 서버 |
저장 형식 | text | Object |
만료 시점 | 브라우저가 종료되어도, 종료시점이 지나지 않으면 삭제되지않음 | 브라우저 종료시 삭제 |
사용하는 자원(리소스) | 클라이언트 리소스 | 웹서버 리소스 |
용량 제한 | 총 300개 도맨인당 20개 쿠키하나당 4kb | 서버가 허용하는 한 제한없음 |
속도 | 세션보다 빠르다 | 쿠키 보다 느리다 |
보안 | 세션보다 안좋다 | 쿠키보다 좋다 |