개발(~국비)/Spring

6.로그인세션

까만밀가루 2022. 11. 29. 09:01

로그인 처리하기 - 쿠키 사용

쿠키

  • 영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지
  • 세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료시까지만 유지

 

LoginController

//    @PostMapping("/login")
    public String login(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletResponse response) {
        if (bindingResult.hasErrors()) {
            return "login/loginForm";
        }
        Member loginMember = loginService.login(form.getLoginId(),
                form.getPassword());
        log.info("login? {}", loginMember);
        if (loginMember == null) {
            bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.");
            return "login/loginForm";
        }
        //로그인 성공 처리 TODO

        //쿠키에 시간 정보를 주지 않으면 세션 쿠키(브라우저 종료시 모두 종료)
        Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
        response.addCookie(idCookie);

        return "redirect:/";
    }

 

//    @GetMapping("/")
    public String homeLogin(@CookieValue(name = "memberId", required = false) Long memberId, Model model){
        if(memberId == null){
            return "home";
        }

        //쿠키 있는 성공한 회원
        Member loginMember = memberRepository.findById(memberId);
        if(loginMember == null){
            return "home";
        }
        model.addAttribute("member",loginMember);
        return "loginhome";
    }

 

쿠키를 생성하여 @Cookievalue를 이용하여 쿠키 조회

로그아웃시엔 세션 쿠키이므로 웹 브라우저 종료시 종료, 서버에서 해당 쿠키의 종료 날짜를 0으로 지정

 

이러한 쿠키는 임의로 변경할 수 있으며, 보관된 정보를 훔쳐갈 수 있고 한번 훔쳐가면 평생 사용할 수 있는 보안 문제를 가지고 있다. 

 

 

로그인 처리하기 - 세션 동작 방식

클라이언트와 서버는 쿠키로 연결되어야 하며 세션 ID만 쿠키게 담아서 전달한다.

이때 회원과 관련된 정보는 전혀 클라이언트에 전달하지 않으며 세션 ID만 쿠키를 통해 클라이언트에 전달

 

 

세션 직접 만들기

세션 생성

  • sessionId 생성(임의의 추정 불가능한 랜덤 값)
  • 세션 저장소에 sessionId와 보관할 값 저장
  • sessionId로 응답 쿠키를 생성해서 클라이언트에 저장

세션 조회

  • 클라이언트가 요청한 sessionId 쿠키의 값으로 세션 저장소에 보관한 값 조회

세션 만료

  • 클라이언트가 요청한 sessionId 쿠키의 값으로 세션 저장소에 보관한 sessionId와 값 제거