쿠키 & 세션
웹 서비스는 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";
}
'Web[웹] > Spring Framework' 카테고리의 다른 글
[Spring] JDBC 와 JdbcTemplate 그리고 커넥션 풀 (0) | 2019.12.05 |
---|---|
[Spring] 컨트롤러에서 뷰를 분기하는 리다이렉트 & 인터셉트 (0) | 2019.12.05 |
[Spring] Controller 객체 구현 : MVC 프로젝트 (2) (0) | 2019.12.03 |
[Spring] Service & Dao 객체 구현 : MVC 프로젝트 (1) (0) | 2019.11.28 |
[Spring] MVC 웹 프로그래밍 설계 모델 (With. STS) (0) | 2019.11.22 |