Cookie와 Session은 HTTP 프로토콜 단점을 극복하기 위한 기술
학습목표
Cookie를 이용한 클라이언트 상태 정보 저장 방법에 대해 설명할 수 있다.
Session을 이용한 클라이언트 상태 정보 저장 방법에 대해 설명할 수 있다.
상태 유지
클라이언트가 서버와 상태정보를 지속적으로 유지하기 위한 기술
HTTP 프로토콜은 한 번의 요청과 응답으로 연결이 끊기므로, 상태 정보를 유지할 수 없음 (단점)
--> 프로토콜 자체적으로 상태 정보를 유지할 수 없다 보니, 개발자가 데이터적으로 이전 상태를 유지시켜줘야 함
상태 유지가 필요한 경우
- 로그인 상태 유지
- 쇼핑몰 장바구니 상태 유지
상태 유지 기술(둘 다 쓰거나, 하나만 쓰거나)
- Cookie
- Session
Cookie
Client-Side(브라우저)에 상태정보를 저장하는 기술
- 하나의 Cookie는 최대 4KB까지 사용할 수 있음
- Cookie는 상태정보를 클라이언트 측에 저장하기 때문에 보안 취약성을 가지고 있음
- 브라우저에서 Cookie를 차단하면 사용 불가능
Cookie 데이터 구성
웹 서버가 브라우저에 전송하는 Cookie에 다양한 값을 설정할 수 있음
Set-Cookie : name=value ; expires=data ; path=path ; domain=domain ; secure
- name=value : Cookie 이름과 cookie 값
- expires=data : Cookie의 유효 기간을 기술하며 Expires 생략 시 브라우저가 살아있는 동안만 Cookie가 유효함
- domain=domain : Cookie가 전송될 도메인 지정
- path=path : Cookie가 유효한 URL path를 기술함
Cookie 저장하기
상태 정보를 Cookie에 담아 Response하면 브라우저에 의해 Client Side에 자동 저장됨
Servlet Container
CookieSet class
Cookie 생성(Cookie Class 이용)
Cookie 저장(response.addCookie())
Cookie 객체를 만들고 response에 addCookie() 함수로 포함시켜서 Client response의 Header 값에 우리가 설정한 쿠키 정보 값이 넘어간다.
따라서 우리가 할 일은
Cookie 객체 생성, 정보 저장, 정보가 저장된 객체를 Response에 포함시키면 된다.
Cookie cookie = new Cookie(name, value);
cookie.setMaxAge(60*60);
resp.addCookie(cookie);
Cookie 추출
클라이언트에 저장된 Cookie는 브라우저가 Cookie를 설정한 도메인에 Request하는 순간 자동으로 HTTP 헤더에 포함시켜 서버에 전송됨
- CookieGet + Cookie
- Cookie 추출(getCookies())
- Cookie 이용(getName(), getValue())
- 응답 결과 생성
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for(Cookie cookie : cookies) {
out.println("cookie : " + cookie.getName() + "-" + cookie.getValue() +
"<br/>");
}
}
Session
서버 사이드에 상태정보를 유지하기 위한 방법으로 내부적으로 Cookie를 이용하는 기술
웹 서버는 사용자의 상태를 서버 컴퓨터의 메모리에 Session 객체로 저장함
SessionID 값을 Cookie를 통해서 브라우저에 전달함
SessionID : Session 객체가 만들어지자마자 유일성이 확보된 자동의 식별자 값을 만들어 구분함
★ 실제 유지되어야 하는 상태 데이터는 서버사이드에 전달
Session을 식별하기 위한 식별자 같은 Cookie를 이용해 브라우저가 가지고 들어오게 처리
Session 상태 정보 저장
- Servlet에서 Session은 HttpSession으로 구현됨
- HttpSession : HttpServletRequest 객체의 getSession() 메서드를 통해서 얻을 수 있음
- Session 객체는 다른 Session 객체와 구별되는 유일한 SessionID를 갖게 됨
- Session에 상태정보를 저장하기 위해 setAttribute() 메서드 사용
클라이언트에게 넘기는건 Session을 식별하는 식별자 값
HttpSession session = request.getSession();
session.setAttribute(name, new String(value));
Session 상태 정보 획득
서버 메모리에 저장된 정보는 고유한 SessionID를 통해서 접근할 수 있음
getAtribute() 메서드로 상태 정보 획득
Session의 주요 메서드
- Object getAttribute(String name) : 주어진 이름에 해당하는 객체를 Session으로부터 리턴
- void setAttribute(String name, Object value) : 주어진 이름에 해당하는 객체를 Session에 저장
- Enumeration getAttributeNames() : Session에 저장된 모든 객체들의 이름을 리턴
- String getID() : Session 리턴
- void invaildate() : Session 종료
- boolean isNew() : Session 객체가 처음 만들어진 것이면 true를 리턴
- void removeAttribute(String name) : 주어진 이름에 해당하는 객체를 Session에서 삭제
- void setMaxlnactivelnterval(int interval) : 클라이언트의 요청 없이 Session을 유지할 수 있는 최대 시간 설정
HttpSession session = request.getSession(true);
Enumeration<String> names = session.getAttributeNames();
while(names.hasMoreElements()) {
String name = names.nextElement();
String value = (String)session.getAttribute(name);
}
실습
CookieTestServlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("euc-kr");
response.setContentType("text/html;charset=EUC-KR");
PrintWriter out = response.getWriter();
// 클라이언트 요청 데이터에서 Cookie를 얻어옴
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for(Cookie cookie : cookies) {
out.println("cookie:"+cookie.getName()+":"+cookie.getValue()+"<br/>");
}
}
// 클라이언트 입력을 받기 위한 form tag 획득
// post 방식으로 요청이 되면 submit 버튼을 눌렀을 때 doPost 함수 실행
out.println("<form method='post' action='CookieTestServlet'>");
// name과 value 입력 -> submit -> Servlet 실행
out.println("name<input type='text' name='name'/>");
out.println("value<input type='text' name='value'/>");
out.println("<input type='submit'/>");
out.println("</form>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 클라이언트가 입력한 데이터 입력
String name = request.getParameter("name");
String value = request.getParameter("value");
// 클라이언트 입력 데이터를 Cookie로 지정
Cookie cookie = new Cookie(name, value);
response.addCookie(cookie);
// doGet이 실행되도록 sendRedirect 시킴
response.sendRedirect("CookieTestServlet");
}
name과 value를 적고 제출을 눌렀을 때
doPost 실행 -> Cookie 설정 -> sendRedirect에서 doGet 실행 -> Cookie 값 확인 가능
SessionTestServlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("euc-kr");
response.setContentType("text/html;charset=EUC-KR");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession(true);
Enumeration<String> names = session.getAttributeNames();
while(names.hasMoreElements()) {
// name 값으로 value 값 얻음 -> 화면 출력
String name = names.nextElement();
String value = (String)session.getAttribute(name);
out.println("session: "+name+":"+value+"<br/>");
}
out.println("<form method='post' action='SessionTestServlet'>");
out.println("name<input type='text' name='name'/>");
out.println("value<input type='text' name='value'/>");
out.println("<input type='submit'/>");
out.println("</form>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 유저 입력 데이터 추출 후 Session으로 저장함
String name = request.getParameter("name");
String value = request.getParameter("value");
// Session 설정 -> Redirect -> doGet 실행 -> 설정된 Session 데이터 출력
HttpSession session = request.getSession();
session.setAttribute(name, value);
response.sendRedirect("SessionTestServlet");
}
Session 설정 -> Redirect -> doGet 실행 -> 설정된 Session 데이터 출력
'온라인 강좌 > JSP & Servlet 활용' 카테고리의 다른 글
9차시 JSP 프로그래밍 (0) | 2023.06.30 |
---|---|
8차시 Servlet Filter와 Listener (0) | 2023.06.30 |
6차시 Servlet 설정 (0) | 2023.06.29 |
5차시 웹 Query 문자열 (0) | 2023.06.29 |
4차시 Response 분석 (0) | 2023.06.29 |