Connectionless (비연결성)
클라이언트가 서버에 요청(Request) 하고 그 요청에 맞는 응답(Response)을 받으면 연결을 끊는 처리방식이다.이를 통해 서버의 자원을 효율적으로 관리하고, 수 많은 클라이언트의 요청에도 대응할 수 있게 한다.
- 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 를 확인할 수 있다. 해당 쿠키는 즉시 종료된다.
@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)
session.setAttribute(String name, Object value)
: 세션 추가
removeValue(String name)
: 특정 세션 제거
session.invalidate()
: 모든 세션 제거
@SessionAttribute
스프링은 세션을 더 편리하게 사용할 수 있도록
@SessionAttribute 을 지원한다.
이미 로그인 된 사용자를 찾을 때는 다음과 같이 사용하면 된다. 참고로 이 기능은 세션을 생성하지 않는다.
@SessionAttribute(name = "loginMember", required = false) Member loginMember