본문 바로가기

Web[웹]/Spring Framework

[Spring] 클라이언트와 서버간 연결을 유지하는 세션 & 쿠키

 

쿠키 & 세션

 

웹 서비스는 HTTP 프로토콜을 기반으로 하는데, 이 프로토콜은 클라이언트와 서버의 관계를 유지하지 않는 특성이 있다. 이를 'Connectionless Protocol' 이라고 부르는데, 서버의 부하를 줄일 수 있는 장점이 있으나, 클라이언트의 요청 시마다 서버와 매번 새로운 연결이 생성되기 때문에 일반적인 로그인 상태 유지, 장바구니 등의 기능은 구현하기 어렵다.

 

이러한 'Connectionless Protocol' 의 불편함을 해결하기 위해 세션과 쿠키를 이용한다.

 

 

세션

 

1. HttpServletRequest를 이용한 세션 사용

파라미터로 HttpServletRequest를 받은 후, getSession()으로 세션을 얻는다. 

 

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String memLogin(Member member, HttpServletRequest request) {
		
    Member mem = service.memberSearch(member);
	
    /* 세션 생성 */
    HttpSession session = request.getSession();
    session.setAttribute("member", mem);
		
    return "/member/loginOk";
}

 

 

2. HttpSession을 이용한 세션 사용

파라미터로 HttpSession을 받아 세션을 사용한다.

 

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String memLogin(Member member, HttpSession session) {
		
    Member mem = service.memberSearch(member);
		
    session.setAttribute("member", mem);
		
    return "/member/loginOk";
}

 

3. 세션 삭제

세션을 삭제하는 방법은 세션에 저장된 속성이 더이상 필요 없을 때 이루어지는 과정으로 주로 로그아웃 또는 회원탈퇴 등에 사용된다.

 

/* HttpServletRequest */
@RequestMapping("/logout")
public String memLogout(Member member, HttpServletRequest request) {
		
    HttpSession session = request.getSession();
    session.invalidate(); // 세션 삭제
    
    return "/member/logoutOk";
}
/* HttpSession */
@RequestMapping("/logout")
public String memLogout(Member member, HttpSession session) {

    session.invalidate(); // 세션 삭제
    
    return "/member/logoutOk";
}

 

 

4. 세션 주요 메서드

 

세션 메소드 기능
getId() 세션 ID를 반환
setAttribute() 세션 객체에 속성 저장
getAttribute() 세션 객체에 저장된 속성 반환
removeAttribute() 세션 객체에 저장된 속성을 제거
setMaxInactiveInterval() 세션 객체의 유지시간을 설정
getMaxInactiveInterval() 세션 객체의 유지시간을 반환
invalidate() 세션 객체의 모든 정보를 삭제

 


 

쿠키

 

 

1. 쿠키 생성 시엔, 쿠키를 담고 있는 HttpServletResponse를 파라미터로 사용한다.

public String mallMain(Mall mall, HttpServletResponse response){ 
...
}

 

2. 쿠키를 생성할 때에는 생성자에 두 개의 파라미터를 넣어주는데, 첫 번째는 쿠키이름을 넣어 주고 두 번째는  쿠키값을 넣어준다.

Cookie genderCookie = new Cookie("gender", mall.getGender());

 

3. 쿠키의 유효기간을 setMaxAge()를 통해 설정한다.

if(mall.isCookieDel()) {
    genderCookie.setMaxAge(0);
    mall.setGender(null);
} else {
    genderCookie.setMaxAge(60*60*24*30);
}
response.addCookie(genderCookie);

 

4. 쿠키를 사용할 때에는 @CookieValue 를 사용한다.

@CookieValue 어노테이션의 value 속성은 쿠키 이름을 나타내는데, 만약 value에 명시한 쿠키가 없을 경우 익셉션이 발생한다. 그래서 이 익셉션을 막기 위해 required 속성을 사용한다. required 속성의 기본값은 true로, 이 값을 false로 설정해서 value값에 해당하는 쿠키가 없어도 익셉션이 발생하지 않도록 해준다.

 

@RequestMapping("/index")
public String mallIndex(Mall mall, 
    @CookieValue(value="gender", required=false) Cookie genderCookie, 
    HttpServletRequest request) {
		
    if(genderCookie != null) 
        mall.setGender(genderCookie.getValue());
		
    return "/mall/index";
}