#세션과 쿠키
웹 서비스는 HTTP프로토콜을 기반으로 사용자와 통신한다. HTTP프로토콜은 클라이언트와 서버와의 관계를 유지하지 않는 특징인 Stateless 기반인 프로토콜이다.
따라서 만약 쇼핑몰 같은 웹서비스를 이용할 때 만약 HTTP 프로토콜만으로 통신한다면 페이지를 이동할 때마다 계속해서 서버와 연결해야 하는 불편함이 생긴다. 또한 사용자의 요청마다 서버와 매번 새로운 연결이 생기기 때문에 로그인 상태 유지, 장바구니의 기능을 구현하는 것이 매우 까다로워진다.
이런 Stateless상태를 해결하는 두 가지 방식이 세션(Session)과 쿠키(Cookie)다. 두 방식 모두 사용자와 서버의 연결 상태를 유지해주는 방법으로, 세션은 서버에서 연결 정보를 관리하는 반면 쿠키는 사용자 측에서 연결 정보를 관리하는 차이가 있다.
#세션이란?
클라이언트 별로 서버에 저장되는 정보. 상호간 네트워크 통신이 이루어질 때 클라이언트가 누구인지 식별할 때 사용한다.
ex)'A'라는 사용자가 로그인을 하면 서버에서 세션(session)을 생성하고 'A'라는 사용자에게 세션아이디를 전달한다. 'A'라는 사용자의 브라우저 메모리에 저장이 되며 추 후 서버로 요청할 경우 브라우저에 저장된 세션 아이디를 가지고 내가 'A'라는 것을 증명한다.
스프링 세션은 사용자의 세션정보를 관리하기 위해 API와 구현체들을 제공하지만 다음의 투명한 통합을 제공한다
#세션 이용방법
-웹 클라이언트가 서버측에 요청을 보내게 되면 서버는 클라이언트를 식별하는 session id를 생성
-서버는 session id를 이용해서 key와 value를 이용한 저장소인 HttpSession을 생성한다.
-서버는 sesion id를 저장하고 있는 쿠키를 생성하여 클라이언트에 전송한다.
-클라이언트는 서버측에 요청얼 보낼 때 session id를 가지고 있는 쿠키를 전송한다.
-서버는 쿠키에 있는 session id를 이용해서 그 전 요청에서 생성한 HttpSession을 찾고 이용한다.
※HttpServletRequest를 이용한 세션 사용
파라미터로 HttpServletRequest를 받은 후, getSession()으로 세션을 얻고, setAttribute("저장하고자 하는 변수명", 저장변수값)로 사용한다.
@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";
}
※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";
}
#세션 삭제
세션을 삭제하는 방법은 세션에 저장된 속성이 더이상 필요 없을 때 이루어지는 과정으로 주로 로그아웃 또는 회원탈퇴 등에 사용한다.
/*HttpServletRequest*/
@RequestMapping("/logout")
public String memLogout(Member member, HttpServletRequest request){
HttpSession session = request.getSession();
session.invalidate(); //세션삭제
return "/member/logoutOk";
}
/*HttpSession*/
@RequestMapping("/logout")
public String memLogin(Member member, HttpSession session){
Member mem = service.memberSearch(member);
session.setAttribute("member", mem);
return "/member/loginOk";
}
#쿠키란?
-클라이언트 단에 저장되는 작은 정보의 단위
-웹사이트 접속 시 접속자의 개인장치에 다운로드 되고 브라우저에 저장되는 작은 텍스트 파일이다.
-웹사이트는 쿠키를 통해 접속자의 장치를 인식하고, 접속자의 설정과 과거 이용내역에 대한 일부를 저장한다.
-유저들의 효율적이고 안전한 웹 사용을 보장하기 위하여 웹사이트에 널리 사용되고 있다.
-클라이언트에서 생성하고 저장될 수 있고, 서버 단에서 전송한 쿠키가 클라이언트에 저장될 수 있다.
#쿠키 이용방법
-클라이언트가 페이지를 요청하면 웹서버에서 쿠키 생성
-서버에서생성한 쿠키에 필요 정보를 담아 클라이언트의 브라우저로 전송되어 사용자의 컴퓨터에 저장한다.
-저장된 쿠키는 다시 해당하는 웹 페이지에 접속할 때 브라우저에서 서버로 쿠키를 전송한다.
-쿠키는 이름(name)과 값(value) 쌍으로 정보를 저장한다.
-이름-값 쌍외에도 도메인(Domain), 경로(Path), 유효기간(Max-Age, Expires), 보안(Secure), HttpOnly속성을 저장할 수 있다.
#세션과 쿠키의 차이점
| 세션(Session) | 쿠키(Cookie) | |
| 저장위치 | 웹 서버 | 클라이언트(=접속자 PC) |
| 저장형식 | Object | text (key-value) |
| 만료 시점 | 브라우저 종료시 삭제(기간 지정 가능) | 쿠키 저장시 설정(만료 시간 기준) |
| 사용하는 자원(리소스) | 웹 서버 리소스 | 클라이언트 리소스 |
| 용량제한 | 서버가 혀용하는 한 제한 없음 | 총 300개 하나의 도메인당 20개 하나의 쿠키당 4KB(=4096byte) |
| 속도 | 쿠키보다 느림 | 세션보다 빠름 |
| 보안 | 쿠키보다 좋음 | 세션보다 안 좋음 |
#javax.servlet.http.Cookie
※서버에서 쿠키 생성, Response의 addCookie메소드를 이용해 클라이언트에게 전송
Cookie cookie = new Cookie(이름, 값);
response.addCookie(cookie);
-쿠키의 이름은 일반적으로 알파벳과 숫자, 언더바로 구성한다.
※클라이언트가 보낸 쿠키 정보 읽기
Cookie[] cookies = request.getCookies();
-getCookies()을 호출했을 때, 쿠키의 배열이 return 되는 것을 볼 수 있다.
-하나의 서버가 쿠키를 여러개 보낼 수 있기 때문에, 클라이언트는 이 서버가 보낸 쿠키를 몽땅 같이 보낸다.
-쿠키 값이 없으면 null을 반환한다. 코드 짤 때 null값을 생각 안하면 Exception이 발생할 수 있다.
※클라이언트에게 쿠키 삭제 요청
-쿠키를 삭제하는 명령은 없고 maxAge가 0인 같은 이름의 쿠키를 전송해서 덮어쓰고 쿠키의 유지시간이 0이되서 해당 쿠키는 바로 없어진다.
Cookie cookie = new Cookie("이름", null);
cookie.setMaxAge(0);
※쿠키의 유효기간 설정
setMaxAge()메소드를 사용해서 초 단위의 정수형으로 설정한다. 0이면 쿠키의 삭제
-영속쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지
-세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료시 까지만 유지
#Spring MVC에서의 Cookie사용
※ @CookieValue 애너테이션 사용
-컨트롤러 메소드의 파라미터에서 CookieValue애너테이션을 사용함으로써 원하는 쿠키정보를 파라미터 변수에 담아 사용할 수 있다.
컨트롤러메소드(@CookieValue(value="쿠키이름", requred=false, defaultValue="기본값") String 변수명)
'Back-end > Spring' 카테고리의 다른 글
| [Spring] 컨트롤러(Controller)작성하기 (0) | 2022.03.20 |
|---|---|
| [Spring] 쿠키(Cookie)란? (0) | 2022.03.19 |
| [Spring] @Controller와 @ResponseBody (0) | 2022.03.19 |
| [Spring] 스프링의 구조(MVC) (0) | 2022.03.19 |
| [Spring] sts3 초기 설정 (0) | 2022.03.07 |
댓글