오봉이와 함께하는 개발 블로그

스프링 MVC 2 - 로그인 처리 서블릿 HTTP 세션 1 본문

BE/Spring

스프링 MVC 2 - 로그인 처리 서블릿 HTTP 세션 1

오봉봉이 2022. 8. 29. 01:43
728x90

로그인 처리 - 서블릿 HTTP 세션 1

세션이라는 개념은 대부분의 웹 애플리케이션에서 필요하다.
서블릿은 세션을 위해 HttpSession이라는 기능을 제공하는데, 지금까지 나왔던 문제들을 해결해준다.
직접 구현한 세션의 개념이 이미 구현되어 있고, 잘 구현되어 있다.

HttpSession

서블릿이 제공하는 HttpSession도 직접 만든 SessionManager와 같은 방식으로 동작한다.
서블릿을 통해 HttpSession을 새성하면 다음과 같은 쿠키를 생성한다.

  • 쿠키 이름 : JSESSIONID
  • 값 : 추정 불가능한 랜덤 값
    • JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05

HttpSession 사용

서블릿이 제공하는 HttpSession을 사용하도록 개발해보자.

SessionConst

package hello.login.web;

public class SessionConst {
    private static final String LOGIN_MEMBER = "loginMember";
}

new XXX()를 통해서 생성할 것이 아니기 때문에 추상 클래스(abstract)나 인터페이스(interface)로 사용하는 것이 더 좋다.

LoginController - loginV3()

    @PostMapping("/login")
    public String loginV3(@Valid @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:/";
    }

세션 생성과 조회

세션을 생성하려면 request.getSession(true)를 사용하면 된다.(default = true)
public HttpSession getSession(boolean create);
request.getSession() : 신규 세션을 생성하는 request.getSession(true)와 동일하다.

  • 세션의 create 옵션
    • request.getSession(true)
      • 세션이 있으면 기존 세션을 반환한다.
      • 세션이 없으면 새로운 세션을 생성해서 반환한다.
    • request.getSession(false)
      • 세션이 있으면 기존 세션을 반환한다.
      • 세션이 없으면 새로운 세션을 생성하지 않고, null을 반환한다.

세션에 로그인 회원 정보 보관

session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
세션에 데이터를 보관하는 방법은 request.setAttribute(..)와 비슷하다.
하나의 세션에 여러 값을 저장할 수 있다.

LoginController - logoutV3()

    @PostMapping("/logout")
    public String logoutV3(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
        return "redirect:/";
    }
  • session.invalidate() : 세션을 제거한다.

HomeController - homeLoginV3()

    @GetMapping("/")
    public String homeLoginV3(HttpServletRequest request, Model model) {

        // 세션이 없으면 home
        HttpSession session = request.getSession(false);
        if (session == null) {
            return "home";
        }

        Member loginMember = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);
        // 세션에 데이터가 없으면 home
        if (loginMember == null) {
            return "home";
        }

        // 세션이 유지되면 로그인으로 이동
        model.addAttribute("member", loginMember);
        return "loginHome";
    }

request.getSession(false) : request.getSession()를 사용하면 기본 값이 create : true 이므로, 로그인 하지 않을 사용자도 의미없는 세션이 만들어진다.
따라서 세션을 찾아서 사용하는 시점에는 create: false옵션을 사용해서 세션을 생성하지 않아야 한다.

session.getAttribute(SessionConst.LOGIN_MEMBER) : 로그인 시점에 세션에 보관한 회원 객체를 찾는다.

출처 : 인프런 김영한 지식공유자님 강의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
728x90
Comments