반응형
Cookie & Session
http protocol 특징
- Http (Hyper Text Transfer Protocol) : 인터넷에서 데이터를 주고 받는 스펙
- client가 서버에 요청
- 서버는 요청에 대한 처리를 한 후 클라이언트에 응답
- 응답 후 연결을 해제 (stateless)
- 지속적인 연결로 인한 자원낭비를 줄이기 위해 연결을 해제
- 클라이언트와 서버 간 연결 상태를 유지해야하는 경우 즉, 클라이언트 단위로 상태를 유지해야 하는 경우 세션과 쿠키가 사용된다. (stateless 약점을 보완)
쿠키
- 클라이언트의 텍스트로 저장되어 문자열만 저장된다.
- 서버에서 사용자의 컴퓨터에 저장하는 정보 파일
- request 시 Request Header에 넣어 자동으로 서버에 전송
- key 와 value로 구성되고 String 형태로 이루어져 있다.
- 브라우저마다 저장되는 쿠키는 다르다. (서버는 브라우저가 다르면 다른 사용자로 인식)
사용 예
- ID 저장, 일주일간 다시 보지 않기, 장바구니 기능 등
구성요소
- 이름 : 여러 개의 쿠키가 client의 컴퓨터에 저장되므로 각 쿠키를 구별하는 데 사용되는 이름
- 값 : 쿠키의 이름과 매핑되는 값
- 유효기간 : 쿠키의 유효기간
- 도메인 : 쿠키를 전송할 도메인
- 경로 : 쿠키를 전송할 경로
동작 과정
- 클라이어트가 페이지를 요청
- WAS(서블릿 등)는 쿠키를 생성
- HTTP Header에 쿠키를 넣어 응답
- 브라우저는 쿠키를 PC에 저장하고, 다시 WAS에게 요청할 때 쿠키를 전송
- 브라우저가 종료되어도 쿠키의 만료 기간이 남아 있다면 클라이언트는 계속 보관
- 동일 사이트 재방문 시 클라이언트의 PC에 해당 쿠키가 있는 경우, 요청 페이지와 함께 쿠키 전송
쿠키의 특징
- 이름, 값, 만료일, 경로 정보로 구성되어 있다.
- 클라이언트의 총 300개의 쿠키를 저장할 수 있다.
- 하나의 도메인 당 20개의 쿠키를 가질 수 있다.
- 하나의 쿠키는 4KB까지 저장 가능하다.
예제
private String loginMember(HttpServletRequest request, HttpServletResponse response) {
MemberDto memberDto = null;
String id = request.getParameter("userid");
String pass = request.getParameter("userpwd");
try {
memberDto = memberService.login(id, pass);
if(memberDto != null) { // 로그인 성공
HttpSession session = request.getSession();
session.setAttribute("userInfo", memberDto);
String idsv = request.getParameter("idsave");
if("saveok".equals(idsv)) { // id 저장 체크
Cookie cookie = new Cookie("loginid", id);
cookie.setMaxAge(60*60*24*365*20);
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
} else { // 아이디 저장 체크를 X
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for (int i=0; i<cookies.length; i++) {
if(cookies[i].getName().equals("loginid")) {
cookies[i].setMaxAge(0); // 만료 기간을 0 으로
response.addCookie(cookies[i]);
break;
}
}
}
}
return "/index.jsp";
} else { // 로그인 실패
request.setAttribute("msg", "아이디 또는 비밀번호 확인 후 다시 로그인하세요.");
return "/user/login.jsp";
}
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("msg", "로그인 처리중 문제 발생!!");
return "/error/error.jsp";
}
}
- 쿠키를 생성할 때 키, 값으로 만들고 유효기간, 경로를 추가하여 응답(response)에 같이 보낸다.
- 아이디 저장을 하지 않았을 경우 setMaxAge(0)으로 쿠키를 만료 시킨 후 응답에 보낸다.
세션
- 방문자가 웹 서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 세션이라고 한다.
- 서버 즉, WAS의 메모리에 객체(Object)로 저장된다.
- 쿠키와 달리 메모리가 허용하는 용량까지 저장 가능
사용 예
- Site내에서 화면을 이동해도 로그인이 풀리지 않고 유지
- 장바구니
동작 과정
- 클라이언트가 페이지를 요청
- 서버는 접근한 클라이언트의 Request-Header 필드인 Cookie를 확인하여, 클라이언트가 session-id를 보냈는지 확인
- session-id가 존재하지않는다면, 서버는 session-id를 생성하여 클라이언트에 돌려준다.
- 해당 쿠키를 이용해 서버에 저장, 쿠키 이름 : JSESSIONID
- 클라이언트는 재접속 시, 이 쿠키를 이용하여 session-id 값을 서버에 전달
세션 특징
- 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장
- 브라우저를 닫거나, 서버에서 세션을 삭제 했을 때만 삭제가 되므로, 쿠키보다 비교적 보안이 좋다.
- 저장 데이터에 제한이 없다.
- 각 클라이언트 고유 Session ID를 부여한다.
- Session ID로 클라이언트를 구분하여 각 클라이언트 요구에 맞는 서비스 제공
예제
private String loginOutMember(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
// session.setAttribute("userInfo", null); // 좋지 않은 방법
// session.removeAttribute("userInfo"); // 해당 값만 종료
session.invalidate(); // 연결된 모든 세션 종료
return "/index.jsp";
}
- 세션을 종료하는 방법은 3가지가 있다.
정리
반응형