세션과 쿠키


웹 서비스를 가능하게 해주는 HTTP프로토콜은 클라이언트와 서버의 관계를 유지하지 않는 특징이 있다.(Connectionless Protocol)

 1. [요청] 클라이언트       >       요청(request) : 서버연결        >      서버
 2. [응답] 클라이언트      < 응답(response) : 응답 후 연결 해제 <       서버 

서버가 응답 후 연결을 끊는 이유는 서버의 자원을 관리하기 위함. 

클라이언트의 요청시마다 서버와 매번 새로운 연결을 생성해야 되서 
일반적인 로그인 상태 유지나 장바구니 등의 기능 구현이 어려움. 

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

세션과 쿠키는 클라이언트와 서버의 연결 상태를 유지해주는 방법으로
둘다 사용자의 데이터를 저장한다는 공통점이 있지만,
쿠키는 클라이언트 쪽에서 연결 정보를 관리 
세션은 서버쪽에서 연결 정보를 관리한다는 차이가 있다. 

 

세션


HttpServletRequest 혹은 HttpSession으로 사용가능. 
로그인시 세션에 로그인정보를 생성한다. 
서버에 생성해 놓은 세션을 이용해 회원정보 수정이나 삭제 가능. 

로그아웃시에도 서버에있는 세션에서 로그인 정보를 지움. 

/* HttpServletRequest를 이용한 방법 */
@RequestMapping(value= "/login", method=RequestMethod.POST) 
public String login(Member member, HttpServletRequest request){ 
Member mem = service.memberSearch(member); 

HttpSession session = request.getSession(); 
session.setAttribute("member", mem); // 세션 생성.  

return "/member/loginOk"; 
} 

/* HttpSession을 이용한 방법 */
@RequestMapping(value= "/login", method=RequestMethod.POST) 
public String login(Member member, HttpSession session){ 
Member mem = service.memberSearch(member); 

session.setAttribute("member", mem); // 세션 생성.  

return "/member/loginOk"; 
} 


HttpServletRequest , HttpSession 둘의 차이점은 거의 없으며, 단지 세션객체를 얻는 방법에 차이가 있을 뿐. 

HttpServletRequest 는 파라미터로 HttpServletRequest을 받은 후 getSession()으로 세션을 얻음. 
HttpSession은 파라미터로 HttpSession을 받아 그대로 사용.

 

세션 삭제방법


로그아웃 또는 회원 탈퇴 시 사용.
session.invalidate();



세션 메소드

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


쿠키 

HttpServletResponse에 쿠키를 담고 있다. 

- 쿠키 생성 및 설정 방법

@RequestMapping("/main") 
public String mallMain(Mall mall, HttpServletResponse response) { 
Cookie genderCookie = new Cookie("gender", mall.getGender()); 

if(mall.isCookieDel()){ 
genderCookie.setMaxAge(0); 
mall.setGender(null); 
}else{ 
genderCookie.setMaxAge(60*60*24*30); //한달동안 쿠키 유지 
} 
response.addCookie(genderCookie); 

return "/mall/main"; 
} 



- 쿠키를 받아서 사용하는 방법

@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"; 
} 


@CookieValue 어노테이션의 value속성은 쿠키의 이름을 나타내는데, value에 명시한 쿠키가 없을 경우 익셉션이 발생한다.
익셉션을 막는 방법이 바로 rquired 속성. 기본값이 true인데 true인 경우 value에 해당하는 값이 없으면 익셉션 발생.
따라서 required 속성을 false로 해서 쿠키값이 없어도 익셉션이 발생하지 않도록 한다. 

실무에선 세션이 보안이 강해서 좀 더 많이 쓰이지만, 보안이 중요한 데이터가 아닌경우 쿠키 이용. 

 

 

출처 : 인프런 스프링 프레임웤 강좌

'Web개발' 카테고리의 다른 글

리다이렉트(redirect)와 인터셉트(intercept)  (0) 2020.04.15
TypeScript 란 ?  (0) 2020.02.01
시맨틱 마크업  (0) 2020.01.28
servlet 버전 별 web.xml 스키마 예제  (0) 2020.01.19
robots.txt 파일  (0) 2020.01.19

+ Recent posts