Session

JiMin LEE·2022년 11월 17일
0

로그인

목록 보기
4/7
post-thumbnail

[SpringBoot] 서블릿의 HttpSession을 사용해 세션 구현하기

1️⃣ 세션

: 서버가 데이터를 저장하는 수단

: 시간적 개념으로는 서버와 클라이언트의 연결이 활성화 된 상태를 의미한다.

  • 유일한 session id가 서버에 존재하는 상황
  • 쿠키처럼 사용자를 식별하고 정보를 저장하는데 사용하지만, 서버에 저장되므로 쿠키와 다르게 정보가 노출되지 않는다.

  • Session Id : 어떤 사용자의 session인지를 식별하는 고유 id 이다.
  1. client가 request를 보낸다.
  2. session id가 서버 저장소에 존재하지 않으면 session과 session id를 생성 및 저장하고
    setcookie() 함수를 이용해 쿠키에 session id를 담아 response로 돌려준다.
  3. 클라이언트가 request를 할 때 session id를 cookie에 담아서 보내고, 서버는 저장소에서 session id로 session을 찾아서 필요한 정보를 response에 담아 보낸다.

HttpSession 사용

  • 우선 세션의 키로 사용될 문자열을 정의한다.
public class SessionConst {
    public static final String LOGIN_MEMBER = "loginMember";
}
@PostMapping("/login")
public String login(@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("loginFali", "아이디 또는 비번이 맞지 않아~~");
            return "login/loginForm";
        }

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

  • request.getSession(true) == request.getSession()

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

    • 세션이 있으면 기존 세션 반환한다.
    • 세션이 없으면 null을 반환
  • @SessionAttributes

    • controller 클래스 선언구에 선언

    • 스프링이 관리하도록 세션에 데이터를 저장하여 관리할 때, 위 애노테이션으로 key 값 등록

    • 스프링 API로 관리하는 session

      @Controller
      @SessionAttributes({"key1", "key2", "key3", "key4"}) 
      public class SubController {
      ...
      }
      
      // 파라미터로 데이터 키 값 리스트 입력
      // 해당 리스트 안의 값을 키로 갖는 세션 데이터들을 spring API로 관리

세션 반환하기 == 로그아웃

방법 1

PostMapping("/logout")
public String logout(HttpServletRequest request){
        // 세션을 삭제한다.
        HttpSession session = request.getSession(false);
        if (session != null){
            session.invalidate(); // 현재 가지고 있는 세션을 제거할 수 있는 코드
        }
        return "redirect:/";
}
  • HttpSession 객체를 생성하여 세션에 저장한 데이터의 경우
    (== @SessionAttribute에 등록하지 않은 경우)
  • 세션 데이터 일괄 삭제

방법2

@RequestMapping("sessionDelete1")
public String sessionDelete1(HttpSession session) {
	session.removeAttribute("key1"); //key1을 키 값으로 갖는 데이터만 삭제
 
	return "redirect:/showsession.jsp";
}
  • HttpSession 객체를 생성하여 세션에 저장한 데이터의 경우
    (== @SessionAttribute에 등록하지 않은 경우)
  • 특정 키 값의 세션 데이터 삭제

방법3

@RequestMapping("sessionDelete2")
public String sessionDelete2(SessionStatus status) {
// SessionStatus 객체인 SessionStatus status 생성하여 파라미터로 넘기고
	status.setComplete(); //스프링 API 관리 세션 데이터 일괄 삭제

	return "redirect:/showsession.jsp";
}
  • @SessionAttribute에 데이터 키 값을 등록하여, 스프링 API가 관리하는 세션 데이터로 설정한 경우
  • 스프링 API 관리 세션 데이터 일괄 삭제

세션 값 바인딩

@RequestMapping("/sessionBinding")
public String sessionBind(@ModelAttribute("key1") String v1, @ModelAttribute("key2") int v2) {
	System.out.println("key1 키 값으로 저장된 세션 데이터 : " + v1);
	System.out.println("key2 키 값으로 저장된 세션 데이터 : " + v2);
		
	return "redirect:/step03Session.jsp";
}
  • @ModelAttribute(key) String value를 파라미터로 넘기면
    스프링이 관리하는 세션 @SessionAttribute에서 해당 키 값을 가진 세션 데이터가 있는지 찾아서 바인딩
  • 메소드 내부에서 value(변수명)으로 해당 세션 값 사용 가능
  • String value = (String)session.getAttribute(key) 와 유사

0개의 댓글