Spring 쿠키, 세션

Jae-Baek Song·2023년 4월 26일
0

스프링

목록 보기
7/10

쿠키와 세션을 사용하는 이유

  1. Connectionless (비연결성)
    클라이언트가 서버에 요청(Request) 하고 그 요청에 맞는 응답(Response)을 받으면 연결을 끊는 처리방식이다.

    이를 통해 서버의 자원을 효율적으로 관리하고, 수 많은 클라이언트의 요청에도 대응할 수 있게 한다.

  1. Stateless (무상태성)
    클라이언트의 상태 정보를 가지지 않는 서버 처리 방식이다.
    클라이언트와 첫번째 통신에서 데이터를 주고 받았다 해도,
    두번째 통신에서 이전 데이터를 유지하지 않는다.

쿠키 : 사용자의 정보를 클라이언트에 .txt로 저장
세션 : 사용자의 정보를 서버에 객체로 저장


쿠키에는 영속 쿠키와 세션 쿠키가 있다.

  • 영속 쿠키:
    만료 날짜를 입력하면 해당 날짜까지 유지
  • 세션 쿠키:
    만료 날짜를 생략하면 브라우저 종료시 까지만 유지
@PostMapping("/login")
public String login(@Valid @ModelAttribute LoginForm form, BindingResult
bindingResult, HttpServletResponse response) {
	...
	Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
	response.addCookie(idCookie);
}

쿠키에 시간 정보를 주지 않으면 세션 쿠키

@GetMapping("/")
public String homeLogin(@CookieValue(name = "memberId", required = false) Long memberId, Model model) {
	...
 }

@CookieValue 를 사용하면 편리하게 쿠키를 조회할 수 있다.

로그인 하지 않은 사용자도 홈에 접근할 수 있기 때문에 required = false 를 사용한다.

@PostMapping("/logout")
public String logout(HttpServletResponse response, String cookieName) {
 Cookie cookie = new Cookie(cookieName, null);
 cookie.setMaxAge(0);
 response.addCookie(cookie);
}

로그아웃도 응답 쿠키를 생성하는데 Max-Age=0 를 확인할 수 있다. 해당 쿠키는 즉시 종료된다.


HttpSession 사용

@PostMapping("/login")
public String loginV4(... HttpServletRequest request) {
	//세션이 있으면 있는 세션 반환, 없으면 신규 세션 생성
 	HttpSession session = request.getSession();
 	//세션에 로그인 회원 정보 보관
 	session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
}

세션 생성과 조회
세션을 생성하려면 request.getSession(true) 를 사용하면 된다.

public HttpSession getSession(boolean create);

request.getSession(true)

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

request.getSession(false)

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

session.setAttribute(String name, Object value) : 세션 추가

removeValue(String name) : 특정 세션 제거

session.invalidate() : 모든 세션 제거


@SessionAttribute
스프링은 세션을 더 편리하게 사용할 수 있도록

@SessionAttribute 을 지원한다.
이미 로그인 된 사용자를 찾을 때는 다음과 같이 사용하면 된다. 참고로 이 기능은 세션을 생성하지 않는다.

@SessionAttribute(name = "loginMember", required = false) Member loginMember

0개의 댓글