다잘하고싶어

[Spring] 로그인구현6_서블릿HTTP 세션, 스프링이 제공하는 SessionAttribute 본문

이론학습/SRPING

[Spring] 로그인구현6_서블릿HTTP 세션, 스프링이 제공하는 SessionAttribute

챙영잉 2022. 10. 8. 01:14

이전에 직접 만든 세션에서는 적용하지 않았던 기능 -> 특정 시간 사용하지 않으면 세션만료

HTTP세션에서는 위의 기능을 자동으로 지원한다.

 

기본개념

서블릿이 기본적으로 제공하는 쿠키는

쿠키 이름이 JSESSIONID 이고, 값은 추정 불가능한 랜덤 값이다.
Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05

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

세션의 create 옵션 

default -->  request.getSession(true)

1. request.getSession(true) 일 경우

  • 세션이 있으면 기존 세션을 반환한다.
  • 세션이 없으면 새로운 세션을 생성해서 반환한다. request.getSession(false)

2. request.getSession(false) 일 경우

  • 세션이 있으면 기존 세션을 반환한다.
  • 세션이 없으면 새로운 세션을 생성하지 않는다. null 을 반환한다.

LoginController 

@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());
    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:/";
}

HomeController

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

    //항상 세션이 만들어진다. 처음 들어온 사용자도 세션이 만들어짐. 따라서 false 로 해야함
    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";  
}

 

 

스프링이 제공하는 @SessionAttribute

-> 이 기능은 세션을 생성하지는 않으므로, 세션을 찾아올때만 사용한다.

번거로운 과정을 스프링이 한번에 편리하게 처리해준다.

@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";
}

(+) 참고

제일 처음 로그인을 시도하면 아래와 같은 값이 url에 붙어서 출력된다.

이는 웹 브라우저가 쿠키를 지원하지 않을 때 쿠키 대신 URL을 통해서 세션을 유지하는 방법.

이 방법을 사용하려면 URL에 이 값을 계속 포함해서 전달해야 한다.(굉장히 어려움)

서버 입장에서 웹 브라우저가 쿠키를 지원하는지 하지 않는지 최초에는 판단하지 못하므로, 쿠키 값도 전달하고, URLjsessionid 도 함께 전달한다.

 

없애려면 application.properties 에 아래 코드를 넣어준다

server.servlet.session.tracking-modes=cookie
 
 

Reference : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com

강의 듣고 내용 정리중