Servlet(3)
Cookie & Session
- client와 server 통신
client | server |
---|---|
http://ip:port/컨텍스트명/a?id=jdbc | a -> AServlet -> doGet(){ request.getParameter(“id”)}; |
http://ip:port/컨텍스트명/b?id=jdbc 서버 종료 시점까지 현재 컨텍스트의 모든 서블릿끼리 공유 O |
b -> BServlet -> doGet(){ request.getParameter(“id”)}; |
쿠키와 세션
: 브라우저 종료, 혹은 시기를 정해서 그 기간만 공유를 가능하게 하는 기술
-
http프로토콜 처리 과정
1. 요청1 - 처리1(ex.게시물리스트) - 응답1(출력) doGet(HttpServletRequest req, HttpServletResponse res) 매개변수 매소드 시작 - 메모리 생성 - 지역변수 - 메소드 종료 - 메모리 삭제 2. (동일 게시물)요청2 -- 응답 - 처리 - 응답 : 다시 같은 것을 요청했을때, 그 동일 메모리는 아무것도 남아있지 않음 doGet(HttpServletRequest req, HttpServletResponse res) 매개변수 매소드 시작 - 메모리 생성 - 메소드 종료 - 메모리 삭제
- 웹서버는 이전 클라이언트 처리 결과를 남기지 않는다. (기본적인 http 프로토콜의 특성)
- 한 번 웹서버 요청한 클라이언트가 또 요청한다면, 이전의 처리 결과를 얻을 수 없다.
이러한 웹서버의 한계점에서 http의 해결은, 쿠키와 세션
- 쿠키와 세션을 이용하면 이전 클라이언트의 처리 결과를 남길 수 있다.
쿠키와 세션 기능 및 특징
쿠키 | 세션 |
---|---|
클라이언트측에 저장 크기에 한계가 있음(4kb) 한 개의 서버당 한 개 문자열값이어야 함(자바객체 안됨) 브라우저 종료시: 브라우저 쿠키 /종료 이후 저장여부 결정 가능: 파일쿠키(탐색기 폴더 파일형태로 존재) c1.setMaxAge(초단위 시간) 보안 취약 |
서버측에 저장 자바객체 전달 활용 O 크기 한계 없음 한 개의 클라이언트 당 한 개 브라우저 종료시 끝 보안 유리 |
사용 예시:
쿠키: 현재 서버 xx째 방문입니다. / 최근 방문시간은 ㅇㅇ 등 보안과 상관없는 기록
세션: 로그인 아이디, 장바구니 등 정보와 관련된 일들
- 쿠키
- 웹 페이지들 사이의 공유 정보를 클라이언트 pc에 저장해놓고 필요할 때 여러 웹페이지들이 공유해서 사용할 수 있도록 하는 매개역할
client | server |
---|---|
1. 클라이언트 요청 4. 쿠키를 저장한다 5. 클라이언트 요청하면 서버 쿠키가 생성되어 있다면, 쿠키 정보를 같이 전송 |
2. 처리한 결과로 저장 정보 만든다 Cokkie c = new Cookie(“이름”, “값”) 3. 응답 내부 포함 클라이언트 전송 = 쿠키 response.addCookie(c); 6. 요청 내부 포함 쿠키 확인 후 처리 추가/쿠키 활용 … Cookie[] coo = request.getCookies(); |
쿠키 API
package cookie;
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;
@WebServlet("/cookie1")
public class CookieServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//사용자 id-jdbc, pw-program 을 쿠키로 만들어보는 것
Cookie c1 = new Cookie("id", "jdbc"); // 쿠키문자열 규칙 - 영문자 숫자 몇 특수문자
Cookie c2 = new Cookie("pw", "jdbc");
//브라우저가 종료된 이후에도 일정 시간동안(초단위) 쿠키가 지속될 것을 설정
c1.setMaxAge(60*60*24); //24시간동안 유지
c2.setMaxAge(60*60*24);
//c1.setMaxAge(-1);//브라우저 종료시까지만 지속 default는 -1
//클라이언트로 전송
response.addCookie(c1);
response.addCookie(c2);
response.setContentType("text/html;charset=utf-8");
PrintWriter o = response.getWriter();
o.println(c1.getName() + "=" + c1.getValue() + "<br>");
o.println(c2.getName() + "=" + c2.getValue() + "<br>");
o.println("위와 같은 쿠키를 클라이언트로 전송하였습니다.");
}
}
package cookie;
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;
@WebServlet("/cookie2")
public class CookieServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter o = response.getWriter();
//사용자 id-jdbc, pw-program 을 쿠키로 만들어보는 것
//현재 서버가 만들어서 전송했던 쿠키들을 클라이언트로부터 생성된 모든 쿠키를 전달받는 것
Cookie [] coos = request.getCookies(); //getCookiees() 배열타입 리턴
for(Cookie c : coos) {
if(c.getName().equals("id")) {
o.println((c.getName() + "=" + c.getValue() + "<br>"));
}
}
o.println("클라이언트로부터 전달받은 쿠키는 위와 같습니다..");
}
}
- 세션
client | server |
---|---|
1. 클라이언트 요청 5. 클라이언트 요청2 |
2. 처리한 결과로 저장 정보 만든다 2-1. 세션 객체 생성 HttpSession session = request.getSession(); 2-2. 필요한 정보를 저장 session.getAttribute(“속성명1”, 객체1) 요청1의 session:id(클라이언트마다 식별자가 있음) [속성명1: 객체1][속성명2: 값2 .. 4. 응답 6. 서버 내부 세션 가운데 요청2 클라이언트의 저장 정보(세션확인)를 확인 7. 세션 정보를 활용 session.getAttribute(“속성명1”) session.getAttribute(“속성명2”) |
package session;
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;
@WebServlet("/session1")
public class SessionServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//클라이언트 요청 속에 세션이 포함되어있는지 여부 확인
//브라우저 열고 요청1 - 요청2 - 브라우저 종료 - 세션정보 삭제
//세션정보 서버측 저장, 세션정보사용기능식별자 클라이언트측 저장(=세션id 쿠키에 저장 - JSESSIONID)
String id = "none", pw = "none";
HttpSession session = request.getSession(); // sesion 객체 생성
/*HttpSession session = request.getSession(); 기능
* 클라이언트 요청속에 세션이 포함되어있는지를 확인 - 있다면 서버 요청한 적이 있던 것으로 간주
* - 세션 객체 생성 필요 없으니 기존 생성된 세션을 사용
* 아니라면, 서버에 요청한 적(브라우저 열고 최초 요청인가)은 없기 때문에 세션객체를 생성 */
if(session.isNew()) {//브라우저를 열고 최초로 세션이 열렷는지, 클라이언트 요청에 세션 없다 = 서버 남긴 정보가 없다 = 최초 요청
session.setAttribute("id", "jdbc");
session.setAttribute("pw", "jdbc");
}else {
id = (String)session.getAttribute("id");
pw = (String)session.getAttribute("pw");
}
response.setContentType("text/html;charset=utf-8");
PrintWriter o = response.getWriter();
o.println("세션정보확인=" + id + ":" + pw);
}
}
/*1. 브라우저 열고 http:// .../ session1을 실행한다
* 2. 세션 2개 정보 저장한다
* 3. 브라우저 열고 http:// .../ session2 실행한다
* 4. 세션에 저장된 2개 정보 추출한다
* 5. http://.../session1을 실행한다
* 6. 세션에 저장된 2개 정보 추출한다
* 7. 브라우저 닫는다
* 8. 브라우저 열고 session2를 실행하게 된다면,
* 9. 세션에 저장되어진 정보는 없어진 상태. null값.
* */
package session;
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;
@WebServlet("/session2")
public class SessionServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//클라이언트 요청 속에 세션이 포함되어있는지 여부 확인
//브라우저 열고 요청1 - 요청2 - 브라우저 종료 - 세션정보 삭제
//세션정보 서버측 저장, 세션정보사용기능식별자 클라이언트측 저장(=세션id 쿠키에 저장 - JSESSIONID)
// 이 세션은 세션 정보값만 받게 되어있음. (브라우저 닫으면 정보값 사라짐)
String id = "none", pw = "none";
HttpSession session = request.getSession();
id = (String)session.getAttribute("id");
pw = (String)session.getAttribute("pw");
response.setContentType("text/html;charset=utf-8");
PrintWriter o = response.getWriter();
o.println("세션정보확인=" + id + ":" + pw);
}
}
- : 클라이언트의 브라우저가 서버에 최초 접속하면 서버의 서블릿은 세션 객체를생성 후 세션 객체에 대한 세션 id를 브라우저에 전송. 브라우저는 이 세션 id를 브라우저가 사용하는 세션 쿠키에 저장, 쿠키 이름은 jsessionId
-
재접속해 세션 쿠키에 저장된 세션 id를 다시 서버로 전송시 서버는 이 id를 통해 브라우저의 세션 객체에 접근, 브라우저에 대한 작업 수행