Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[로그인] 로그인 처리 - Servlet HTTP 세션 본문

인프런/[인프런] 스프링 MVC 2

[로그인] 로그인 처리 - Servlet HTTP 세션

Seung__ 2021. 9. 26. 13:30

Servlet은 HTTP Session기능 제공.

 

1. HttpSession


  • 서블릿이 제공하는 HttpSession 도 앞서 만든 SessionManager 와 같은 방식으로 동작
  • 서블릿을 통해 HttpSession 을 생성하면 다음과 같은 쿠키를 생성 
  • 쿠키 이름이 JSESSIONID 이고, 값은 추정 불가능한 랜덤 값이다.
    • Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05
  • HttpSession은 attribute(member정보), 쿠키 이름, 기타 정보(생성 시각, 마지막 요청 시각 등) 를 포함하는 객체. 
  • HttpServletRequest에서 httpRequest.getSession()을 통해 받을 수 있음.

 

 

 

2. HttpSession 사용

2.1 SessionConst


  • HttpSession 에 데이터를 보관하고 조회할 때, 같은 이름이 중복 되어 사용할 상수 정의
  • cookie이름으로 사용됨.
public interface  SessionConst {

    String LOGIN_MEMBER = "loginMember";
}

 

 

 

2.2 LoginController - loginV3()


  • sessiong을 가져오기 위해 request.getSession()
  • 세션을 조회했을 때 이미 있으면 기존 세션을 반환하고, 없으면 신규 세션 생성 후 반환.
  • session.setAttribute(cookieName, 회원정보)
    • setAttribute로 cookie이름으로 사용한 String과 세션에 넣을 정보를 넘겨주면.
    • sessionId를 생성하여 회원 정보와 sessionId를 함께 저장.
    • 쿠키에 sessionId를 담아서 client에 보냄.
    @PostMapping("/login")
    public String loginV3(@Validated @ModelAttribute("loginForm") LoginForm form,
                          BindingResult bindingResult, HttpServletRequest request){
        if(bindingResult.hasErrors()){
            return "login/loginForm";
        }

        Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
        if(loginMember == null){
            bindingResult.reject("loginFail", "id 또는 pw가 맞지 않습니다.");
            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)
        • 세션이 있으면 기존 세션을 반환한다.
        • 세션이 없으면 새로운 세션을 생성해서 반환한다.
        • default가 true 
      • request.getSession(false)
        • 세션이 있으면 기존 세션을 반환한다.
        • 세션이 없으면 새로운 세션을 생성하지 않는다. null 을 반환한다.
      • request.getSession() : 신규 세션을 생성하는 request.getSession(true) 와 동일
  • 세션에 로그인 회원 정보 보관
    • session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
    • 하나의 세션에 여러 값을  저장할 수 있다.

 

 

 

2.3 LoginController - logoutV3()


  • 세션을 가져올 때 create 옵션을 false로 지정한다.
  • 세션이 있으면 해당 세션을 가져오지만, 세션이 없으면 새로 만들지 않고 null 반환.
  • session.invalidate() : 세션을 종료
    @PostMapping("/logout")
    public String logoutV3(HttpServletRequest request){
        //세션 없으면 null 반환.
        HttpSession session = request.getSession(false);

        if(session != null){
            session.invalidate();
        }
        
        return "redirect:/";
    }

 

 

 

2.4 HomeController - homeLoginV3()


  • request.getSession(false) : true로 설정하면 로그인 하지 않았는데도 session이 생성된다. 
  • 불필요한 session 생성을 방지하기 위해 create : false로 지정한다.
  • session.getAttribute(SessionConst.LOGIN_MEMBER) : 로그인 시점에 세션에 보관된 회원 정보를 찾는다.
    • LOGIN_MEMBER 의 이름으로 생성된 cookie에서 sessionId를 가져옴. 
    • 해당 sessionId로 세션에 저장된 회원 정보 반환.
    @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);


        //세션에회원 정보가 없는 경우. -> 일반 home
        if(loginMember == null){
            return "home";
        }

        //세션에 회원 정보가 있는 경우.-> login home
        model.addAttribute("member", loginMember);
        return "loginHome";

    }

 

 

 

3. 사용


  • 로그인을 하면 Response Headers cookie가 생성되었다.
  • JSESSIONID = ~~~~~~ 

  • JSESSIONID를 임의로 조작하고 접속하면??

  • 로그인 하지 않은 상태로 간주, 일반 홈화면 보여줌.

 

 

4. GitHub : 210926 HttpSession


 

GitHub - bsh6463/login

Contribute to bsh6463/login development by creating an account on GitHub.

github.com

 

Comments