로그인2 / 세션

강한친구·2022년 6월 20일
0

Spring

목록 보기
22/27

세션 직접 만들기

세션을 직접 만들어보고 사용하는것으로 세션을 이해할 수 있을것이다.

세션의 주요기능은 다음과 같다.

  • 세션 생성
    • sessionId 생성 (임의의 추정 불가능한 랜덤 값)세션 저장소에 sessionId와 보관할 값 저장
    • sessionId로 응답 쿠키를 생성해서 클라이언트에 전달
  • 세션 조회
    • 클라이언트가 요청한 sessionId 쿠키의 값으로, 세션 저장소에 보관한 값 조회
  • 세션 만료
    • 클라이언트가 요청한 sessionId 쿠키의 값으로, 세션 저장소에 보관한 sessionId와 값 제거

이렇게 직접 만든 sessionID를 사용하면

이런 결과물이 나온다.

HttpRequest Session

로그인 처리

	@PostMapping("/login")
    public String loginV3(@Validated @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletRequest request) {
        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";
        }

        HttpSession session = request.getSession();
        session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);

        return "redirect:/";
    }

기본으로 제공해주는 세션은 위와 같이 사용한다.
세션이 있다면 사용하고 없다면 하나 만드는 방식이다.
그 후, 세션에 세션이름과 내용을 집어넣어준다.

삭제 처리

@PostMapping("/logout")
    public String logoutV3(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
        return "redirect:/";
    }

session을 가지고 오고, null이 아닌 경우 invalidate한다.

여기서 주의할점은, getSession은 기본적으로 세션이 없으면 생성하도록 되어있다. 따라서 기본값을 false처리 해야한다.

로그인 페이지 처리

	@GetMapping("/")
    public String homeLoginV3(HttpServletRequest request, Model model) {
        HttpSession session = request.getSession(false);

        if (session == null) {
            return "home";
        }

        Member loginMember = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);

        if (loginMember == null) {
            return "home";
        }
        model.addAttribute("member", loginMember);
        return "loginHome";
    }

session에서 getAttribute를 통해 Member를 꺼내고, 그 값이 없다면 return, 있다면 model에 넣어서 처리한다.

@GetMapping("/")
    public String homeLoginV3Spring(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false)                    Member loginMember,            Model model) {
        if (loginMember == null) {
            return "home";
        }
        model.addAttribute("member", loginMember);
        return "loginHome";
    }

혹은 스프링 기능을 이용해서 더 간단하게 표현 할 수 있다.

타임아웃 설정

세션을 너무 장기간 보관하게 되면 탈취되었을 때 해킹의 위험이 존재하고, 또한 수십만개의 세션을 지속적으로 보관하기에는 세션메모리가 부족해진다.

따라서 세션 종료시간을 지정해야한다.

그래서 몇분에 종료를?

사용자가 가장 최근에 요청을 보낸 시간으로부터 30분씩 계속 연장을 시키는 방식을 사용하면 생명주기를 용이하게 관리할 수 있다.
혹은 브라우저 종료시 사라지거나 하는 방식 역시 고려해볼 수 있다.

타임아웃 설정

application.properties에서

session.setMaxInactiveInterval(1800);

를 설정한다.
1800은 30분이다.

글로벌 세션은 무조건 초단위로 설정한다.

0개의 댓글