제육's 휘발성 코딩
반응형

Cookie & Session

http protocol 특징

  • Http (Hyper Text Transfer Protocol) : 인터넷에서 데이터를 주고 받는 스펙
  1. client가 서버에 요청
  2. 서버는 요청에 대한 처리를 한 후 클라이언트에 응답
  3. 응답 후 연결을 해제 (stateless)
    • 지속적인 연결로 인한 자원낭비를 줄이기 위해 연결을 해제
    • 클라이언트와 서버 간 연결 상태를 유지해야하는 경우 즉, 클라이언트 단위로 상태를 유지해야 하는 경우 세션과 쿠키가 사용된다. (stateless 약점을 보완)

쿠키

  • 클라이언트의 텍스트로 저장되어 문자열만 저장된다.
  • 서버에서 사용자의 컴퓨터에 저장하는 정보 파일
  • request 시 Request Header에 넣어 자동으로 서버에 전송
  • key 와 value로 구성되고 String 형태로 이루어져 있다.
  • 브라우저마다 저장되는 쿠키는 다르다. (서버는 브라우저가 다르면 다른 사용자로 인식)

사용 예

  • ID 저장, 일주일간 다시 보지 않기, 장바구니 기능 등

구성요소

  • 이름 : 여러 개의 쿠키가 client의 컴퓨터에 저장되므로 각 쿠키를 구별하는 데 사용되는 이름
  • 값 : 쿠키의 이름과 매핑되는 값
  • 유효기간 : 쿠키의 유효기간
  • 도메인 : 쿠키를 전송할 도메인
  • 경로 : 쿠키를 전송할 경로

동작 과정

image

  1. 클라이어트가 페이지를 요청
  2. WAS(서블릿 등)는 쿠키를 생성
  3. HTTP Header에 쿠키를 넣어 응답
  4. 브라우저는 쿠키를 PC에 저장하고, 다시 WAS에게 요청할 때 쿠키를 전송
  5. 브라우저가 종료되어도 쿠키의 만료 기간이 남아 있다면 클라이언트는 계속 보관
  6. 동일 사이트 재방문 시 클라이언트의 PC에 해당 쿠키가 있는 경우, 요청 페이지와 함께 쿠키 전송

쿠키의 특징

  • 이름, 값, 만료일, 경로 정보로 구성되어 있다.
  • 클라이언트의 총 300개의 쿠키를 저장할 수 있다.
  • 하나의 도메인 당 20개의 쿠키를 가질 수 있다.
  • 하나의 쿠키는 4KB까지 저장 가능하다.

예제

image

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내에서 화면을 이동해도 로그인이 풀리지 않고 유지
  • 장바구니

동작 과정

image

 

 

image

  • 클라이언트가 페이지를 요청
  • 서버는 접근한 클라이언트의 Request-Header 필드인 Cookie를 확인하여, 클라이언트가 session-id를 보냈는지 확인
  • session-id가 존재하지않는다면, 서버는 session-id를 생성하여 클라이언트에 돌려준다.
  • 해당 쿠키를 이용해 서버에 저장, 쿠키 이름 : JSESSIONID
  • 클라이언트는 재접속 시, 이 쿠키를 이용하여 session-id 값을 서버에 전달

세션 특징

  • 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장
  • 브라우저를 닫거나, 서버에서 세션을 삭제 했을 때만 삭제가 되므로, 쿠키보다 비교적 보안이 좋다.
  • 저장 데이터에 제한이 없다.
  • 각 클라이언트 고유 Session ID를 부여한다.
  • Session ID로 클라이언트를 구분하여 각 클라이언트 요구에 맞는 서비스 제공

예제

image

private String loginOutMember(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
//        session.setAttribute("userInfo", null); // 좋지 않은 방법
//        session.removeAttribute("userInfo"); // 해당 값만 종료
        session.invalidate(); // 연결된 모든 세션 종료
        return "/index.jsp";
    }
  • 세션을 종료하는 방법은 3가지가 있다.

정리

image

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^