본문 바로가기
기초

쿠키, 세션 로그인

by danny-j 2022. 11. 30.

IndexController

@SneakyThrows
    @GetMapping("/")
    public String main(InternCookie cookie, Model model, @PageableDefault(size = 4) Pageable pageable, HttpSession ses, HttpServletRequest request) {
        log.error("homeController");

        // 쿠키 만료시 Cookie 값이 null이 된다. (유효 시간 동안은 개발자 모드 진입 후(F12) 쿠키 보면 AUTH 라는 이름으로 세션 ID가 들어가 있음)
         Cookie danny = WebUtils.getCookie(request, "Danny");

        if (!ObjectUtils.isEmpty(danny)) {
            if (StringUtils.equalsIgnoreCase(danny.getValue(), request.getSession().getId())) {
                String email = (String) request.getSession().getAttribute("email");
                if (StringUtils.isNotEmpty(email)) {

                    model.addAttribute("email", email);
                    List<Dol_review> reviewList = reviewService.reviewList(pageable);
                    List<Nurse_info> nurse = nurseService.nurseList();

                    for (Nurse_info ni : nurse) {
                        String temp = "profile/s/" + ni.getNurse_photo();

                        ni.setNurse_photo(aes256.encrypt(temp));
                    }
                    model.addAttribute("review", reviewList);
                    model.addAttribute("nurse", nurse);

                    HttpSession session = request.getSession(false);
                    log.error("sessionId==============>{}", session.getId());
                    log.error("getMaxInactiveInterval=>{}", session.getMaxInactiveInterval());
                    log.error("creationTime===========>{}", new Date(session.getCreationTime()));
                    log.error("lastAccessedTime=======>{}", new Date(session.getLastAccessedTime()));
                    log.error("isNew==================>{}", session.isNew());

                    return "home";
                }
            }
        }
        // 로그인 만료 or 비 로그인자 일시
        log.error("로그인 만료 or 쿠키 없음");

        return "join/loginForm";
    }

 

loginController

@SneakyThrows
    @PostMapping("/loginBtn")
    public int login(@RequestBody Map<String, Object> param, HttpServletResponse res, HttpServletRequest req) {

        int result = 0;

        String email = String.valueOf(param.get("email"));
        String pw = String.valueOf(param.get("pw"));
        user.setEmail(email);
        user.setPw(pw);
        log.error("emailCheckAct===>{}", user.getEmail());
        log.error("pwCheckAct===>{}", user.getPw());
        User idName = login.sql_login(email, pw);

        if(idName!=null){
            result = 1;
            // 세션 저장 (세션 ID, 사용자 정보)
            // 세션은 브라우저 당 1개 생성(시크릿 모드도 동일, 같은 브라우저에서 새탭 or 새창 띄워도 로그인 유지) / 쿠키는 시크릿 모드시 없어짐
            req.getSession().setAttribute("email", user.getEmail());
            req.getSession().setAttribute("id", idName);

            // 쿠키 전달 (세션 ID)
            res.addCookie(new Cookie("DolBom", req.getSession().getId()){{
                setMaxAge(1800); // 자동 로그인 10 초 유지
                setPath("/");
            }});

            StudyCookieService.createCookie(res, "EMAIL", email);
            StudyCookieService.createCookie(res, "NAME", URLEncoder.encode(idName.getName(), "EUC-KR"));
            StudyCookieService.createCookie(res, "ID", URLEncoder.encode("id="+idName.getId(), "UTF-8"));

        }
        log.error("idName===>{}", idName);
        return result;
    }

 

핵심

  • 쿠키와 세션은 비슷한 역할을 하며, 동작 원리도 비슷함
  • 가장 큰 차이는 정보가 저장되는 위치
  • 쿠키는 클라이언트의 로컬 브라우저에 저장, 세션은 서버에 저장
  • 세션은 보안적인 면에서는 쿠키보다 우수하지만 서버 메모리를 사용하기 때문에 저장되는 값이 많아질 수록 느려짐
  • 쿠키는 클라이언트의 로컬 브라우저에 저장되기때문에 서버 메모리의 부담을 덜어줌
  • 하지만 클라이언트가 가지고 있기 때문에 변질되거나 request에서 스니핑을 당할 우려가 있음
  • 때문에 중요한 정보는 세션에 저장하고 세션 id나 캐시(css, js)등을 쿠키에 저장하고 서버 메모리의 부담도 덜어주어 서버 과부하, 성능 저하를 개선할 수 있음

댓글