로그인 처리방식 -세션 v2

11727 단어 httpTILTIL

지난 포스팅에 이어 이번에는 서블릿에서 제공하는 세션을 이용해 로그인을 구현해
보도록 하자

서블릿은 세션을 위해 HttpSession이라는 기능을 제공한다. 이는 직접 구현한 세션이 이미 구현이 되어 있고 훨씬 더 잘 구현이 되어 있다.

HttpSession...

서블릿이 제공하는 HttpSession도 결국 직접 만든 SessionManager와 같은 방식으로 동작한다. 서블릿을 통해 HttpSession을 생성하면 다음과 같은 쿠키를 생성한다. 쿠키 이름이 JSESSIONID 이고, 값은 추정 불가능한 랜덤 값이다.
Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05

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

SessionConst

  • HttpSession에 데이터를 보관하고 조회할 때, 같은 이름이 중복 되어 사용되므로, 상수를 정의했다.
public abstract class SessionConst {
    public static final String LOGIN_MEMBER = "loginMember";

}

LoginController - login()

@PostMapping("/login")
    public String login(@Validated @ModelAttribute LoginForm loginForm,
                          BindingResult bindingResult,
                          HttpServletRequest request){
        if(bindingResult.hasErrors()){
            return "login/loginForm";
        }
        Member loginMember = loginService.login(loginForm.getLoginId(), loginForm.getPassword());

        if(loginMember == null){
            bindingResult.reject("loginFail","아이디 또는 패스워드가 일치하지 않습니다");
            return "/login/loginForm";
        }

        //로그인 성공 처리
        //세션이 있으면 있는 세션반환 , 없으면 신규 세션을 생성
        HttpSession session = request.getSession();
        //세션에 로그인 회원 정보 보관
        session.setAttribute(SessionConst.LOGIN_MEMBER,loginMember);
        return "redirect:/";
    }

세션 생성과 조회

세션을 생성하려면 request.getSession(true) 를 사용하면 된다.
public HttpSession getSession(boolean create);
세션의 create 옵션에 대해 알아보자.
request.getSession(true)
세션이 있으면 기존 세션을 반환한다.
세션이 없으면 새로운 세션을 생성해서 반환한다.
request.getSession(false)
세션이 있으면 기존 세션을 반환한다.
세션이 없으면 새로운 세션을 생성하지 않는다. null 을 반환한다.
request.getSession() : 신규 세션을 생성하는 request.getSession(true) 와 동일하다

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

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

LoginController - logout()

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

HomeController - homeLogin()

@GetMapping("/")
    public String homeLogin(HttpServletRequest request, Model model) {
        
        // request.getSession(false): request.getSession()를 사용하면
        // 기본값이 create : true 이므로, 로그인 하지 않을 사용자도 의미없는 세션이
        //만들어진다. 따라서 세션을 찾아서 사용하는 시점에는 create:false옵션을 사용해
        // 세션을 생성하지 않아야 한다.
        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";
    }

로그인 결과


JSESSIONID 쿠키가 적절하게 생성되는 것을 확인 가능

정리

지난 포스팅에서 세션을 직접 만들어 보고 이번 포스팅에서는 서블릿에서 제공하는 HttpSession을 이용해 로그인을 구현해 보았다.
개발자가 직접 세션을 구현하지 않아도 서블릿이 제공해주는 기능을 사용하면 구현을 편리하게 할 수 있어 좋은것 같다.
이처럼 서블릿에서 제공하는 기능도 있는데, 스프링에서도 세션을 만드는 기능을 제공하고 있다.
다음 포스팅에서는 스프링에 제공하는 기능으로 로그인을 구현해보도록 하자.

좋은 웹페이지 즐겨찾기