오봉이와 함께하는 개발 블로그
스프링 MVC 2 - 로그인 처리 서블릿 HTTP 세션 1 본문
로그인 처리 - 서블릿 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을 반환한다.
- request.getSession(true)
세션에 로그인 회원 정보 보관
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편 - 백엔드 웹 개발 활용 기술
'BE > Spring' 카테고리의 다른 글
스프링 MVC 2 - 세션 정보와 타임아웃 설정 (0) | 2022.08.29 |
---|---|
스프링 MVC 2 - 로그인 처리 서블릿 HTTP 세션 2 (0) | 2022.08.29 |
스프링 MVC 2 - 로그인 처리 직접 구현한 세션 적용 (0) | 2022.08.29 |
스프링 MVC 2 - 로그인 처리 세션 직접 구현 (0) | 2022.08.29 |
스프링 MVC 2 - 로그인 처리 세션 동작 방식 (0) | 2022.08.28 |