Everything has an expiration date
[inflearn] 20240114 [스프링-프레임워크] - 20강 필기 본문
[inflearn] 20240114 [스프링-프레임워크] - 20강 필기
Jelly-fish 2024. 1. 14. 22:5720강 - 세션, 쿠키
클라이언트와 서버의 연결을 유지하는 방법을 학습한다.
20-1 세션(Session) 과 쿠키(Cookie)
20-2 HttpServletRequest 를 이용한 세션 사용
20-3 HttpSession 을 이용한 세션 사용
20-4 세션 삭제
20-5 세션 주요 메소드 및 플로어
20-6 쿠키 (Cookie)
20-1 세션(Session) 과 쿠키(Cookie)
Ⅰ. `Connectionless Protocol` 특징
웹 서비스는 HTTP 프로토콜을 기반으로 하는데,
HTTP 프로토콜은 클라이언트와 서버의 관계를 유지하지 않는 특징이 있다.
① 클라이언트 → 서버
요청(`Request`) : 서버 연결
② 서버 → 클라이언트
응답(`Response`) : 서버 연결 해제
example : 『Http Protocol - 날씨 검색』
① 클라이언트 : 오늘의 날씨를 검색
==[서버 연결]==
② 서버 : 날씨에 대한 키워드 요청 (request)을 전달받음
③ 서버 : 각종 DB, 외부 플러그인에서 처리
④ 서버 : 클라이언트에게 날씨 정보 전달 응답 (response)
==[서버 연결 해제]==
Ⅱ. `Connectionless Protocol` - 단점, 세션과 쿠키를 이용하는 이유.
서버의 부하를 줄일 수 있는 장점은 있으나, 클라이언트의 요청 시마다 서버와 매번 새로운 연결이 생성되기 때문에
일반적인 로그인 상태 유지, 장바구니 등의 기능을 구현하기 어렵다.
이러한 `Connectionless Protocol`의 불편함을 해결하기 위해서 세션과 쿠키를 이용한다.
세션(Session)과 쿠키(Cookie)는 클라이언트와 서버의 연결 상태를 유지해주는 방법으로
세션(Session)은 서버에서 연결 정보를 관리하는 반면, 쿠키(Cookie)는 클라이언트에서 연결 정보를 관리하는데 차이가 있다.
[★ 중요! ]
▶ 세션(Session) : 서버에서 연결 정보를 관리
▶ 쿠키(Cookie) : 클라이언트에서 연결 정보를 관리
20-2 HttpServletRequest 를 이용한 세션 사용
Session 을 사용할 때는, `HttpServletRequest` 객체 혹은 `HttpSession` 객체를 사용할 수 있다.
【회원가입, 로그인, 회원정보 수정, 회원정보 삭제에서의 세션(Session)】
①-1. `클라이언트` : 회원가입 요청
①-2. `서버` : 회원가입 응답
②-1. `클라이언트` : 로그인 요청
②-2. `서버` : 로그인 응답 - 세션(`Session`) 생성
( * 로그아웃을 할 경우, 서버에 생성되어 있는 세션을 삭제해 버리면 된다.)
③-1. `클라이언트` : 회원 정보 수정 요청
③-2. `서버` : 회원 정보 수정 응답 - 세션(`Session`) 이용
( * 현재 로그인한 회원 정보 → Session 안에 담겨 있음)
④-1. `클라이언트` : 회원 정보 삭제 요청
④-2. `서버` : 회원 정보 삭제 응답 - 세션(`Session`) 이용
( * 현재 로그인한 회원 정보 → Session 안에 담겨 있음)
【세션(Session)에 회원 정보(Member)가 담겨있는지 없는지에 따른 로그인 분기】
① 클라이언트 : 회원정보 수정 또는 삭제 요청
② 세션(Session) 에 member 속성이 존재하는가?
ⓐ▶ 『YES』 : 회원정보 수정 또는 삭제 응답
ⓑ▶ 『NO』 : 예외(Exception) 발생 (또는, 로그인 페이지로 클라이언트 이동시키기.)
→ 스프링 MVC 에서 `HttpServletRequest`를 이용해서 세션(Session)을 이용하려면
컨트롤러의 메소드에서 파라미터로 `HttpServletRequest` 를 받으면 된다.
[MemberController.java]
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String memLogin(Member member, HttpServletRequest request)
{
// 사용자가 입력한 ID, PW에 맞는 정보가 데이터베이스에 있는지 확인하고
// 그 회원 정보에 맞는 Member 객체를 변수 mem 에 저장한다.
Member mem = service.memberSearch(member);
// 매개변수로 받은 『HttpServletRequest』로부터
// HttpSession 을 얻어낸다.
HttpSession session = request.getSession();
// session 에 로그인이 완료된 회원의 객체를 저장한다.
session.setAttribute("member", mem);
// 뷰(View) 페이지 명을 반환한다.
return "/member/loginOk";
}
20-3 HttpSession 을 이용한 세션 사용
`HttpServletRequest` 와 `HttpSession` 의 차이점은 거의 없으며, 단지 세션 객체를 얻는 방법에 차이가 있을 뿐이다.
HttpServletRequest
public String memLogin(Member member, HttpServletRequest request) { ... }
→ 파라미터로 `HttpServletRequest` 를 받은 후, `getSession()` 으로 세션을 얻는다.
HttpSession
public String memLogin(Member member, HttpSession session) { ... }
→ 파라미터로 `HttpSession` 을 받아 세션을 사용한다.
20-4 세션 삭제
`session.invalidate()`
세션을 삭제하는 방법은 세션에 저장된 속성이 더 이상 필요 없을 때 이루어지는 과정으로 주로 로그아웃 또는 회원 탈퇴 등에 사용된다.
MemberController.java - 로그아웃
@RequestMapping("/logout")
public String memLogout(Member member, HttpSession session)
{
// 세션 삭제
session.invalidate();
return "/member/logoutOk";
}
MemberController.java - 회원 탈퇴
@RequestMapping(value = "/remove", method = RequestMethod.POST)
public String memRemove(Member member, HttpServletRequest request)
{
// 회원 정보 삭제
service.memberRemove(member);
// 세션에 저장되어 있던 Member 객체 삭제
HttpSession session = request.getSession();
session.invalidate();
return "/member/removeOk";
}
20-5 세션 주요 메소드 및 플로어
세션 메소드 | 기능 |
getId() | 세션 ID를 반환한다. |
setAttribute("객체명", 객체) | 세션 객체에 속성을 저장한다. |
getAttribute("객체명") | 세션 객체에 저장된 속성을 반환한다. |
removeAttribute("객체명") | 세션 객체에 저장된 속성을 제거한다. |
setMaxInactiveInterval() | 세션 객체의 유지시간을 설정한다. |
getMaxInactiveInterval() | 세션 객체의 유지시간을 반환한다. |
invalidate() | 세션 객체의 모든 정보를 삭제한다. |
20-6 쿠키 (Cookie)
@RequestMapping("/main")
public String mallMain(Mall mall, HttpServletResponse response)
{
Cookie genderCookie = new Cookie("gender", mall.getGender());
// mall.isCookieDel() : 『true』→ 쿠키 삭제
// mall.isCookieDel() : 『false』→ 세션에 쿠키 저장.
if (mall.isCookieDel())
{
genderCookie.setMaxAge(0); //-- 쿠키 생성과 동시에 삭제.
mall.setGender(null); //-- gender 속성값 null 로 설정.
}
else
{
genderCookie.setMaxAge(60*60*24*30);
// 60초 * 60 → 1분 * 60 → 1시간
// 1시간(60*60) * 24 = 1일
// 1일(60*60*24) * 30 = 30일
//--> [쿠키의 유효기간 : 30일]
}
// Cookie 객체 등록
response.addCookie(genderCookie);
return "/mall/main";
}
`mallMain()` 에서 쿠키를 생성하고, 파라미터로 받은 `HttpServletResponse`에 쿠키를 담고 있다.
쿠키를 생성할 때는 생성자에 두 개의 파라미터를 넣어준다.
Cookie genderCookie = new Cookie("쿠키명", 쿠키 값);
`new Cookie( ① , ② );`
→① 첫 번째 파라미터 : 쿠키 이름
→② 두 번째 파라미터 : 쿠키 값
쿠키의 유효기간 설정
`setMaxAge(int expiry)` 메소드를 통해 쿠키의 유효시간을 설정한다.
Cookie c = new Cookie("Cookie", "testCookie");
c.setMaxAge(쿠키유효시간 초 단위 설정);
① 『expiry』가 『음수』일 때
브라우저가 종료되면 쿠키가 제거된다.
② 『expiry』가 『0』일 때
생성과 동시에 쿠키가 제거된다.
( * 쿠키를 통해 생성한 값이 필요가 없을 때 바로 제거. → 종이컵. 사용만 하고 바로 버리는...)
③ 『expiry』가 『양수』일 때
초 단위로 해당 시간만큼 쿠키가 유지된다.
![]() |
![]() |
( * 출처 : inflearn - 스프링-프레임워크 (renew) - 20강)
성별이 남성일 경우, 남성과 관련한 상품들을 보여주고
성별이 여성일 경우, 여성과 관련된 상품들을 보여주는 웹 사이트 예제 페이지
쿠키가 존재하지 않을 경우(`null`)에는 남성, 여성 상품이 함께 노출된다.
구분 `checkbox` 를 통해 성별을 쿠키에 저장, 쿠키 삭제 가능
index.jsp
<c:choose>
<c:when test="${gender == 'M'}">
남성 상품 노출
</c:when>
<c:when test="${gender == 'W'}">
여성 상품 노출
</c:when>
<c:otherwise>
남성, 여성 상품 노출
</c:otherwise>
</c:choose>
@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";
}
`mallMain()` 에서 생성된 쿠키를 `mallIndex()` 에서 사용한다.
쿠키를 사용할 때는 `@CookieValue` 를 사용한다.
@CookieValue(value="gender", required=false)Cookie genderCookie
`@CookieValue` 어노테이션의 `value` 속성은 쿠키 이름을 나타내는데,
만약 ※ value 에 명시한 쿠키가 없을 경우 Exception이 발생한다.
[18 강 참조]
『 필수적으로 넘어와야 하는 값임을 명시하는 속성 : `required` 』
→ `required=true` : 입력 값이 넘어오지 않았을 경우 Exception
→ `required=false` : 입력 값이 넘어오지 않아도 예외 발생시키지 않음. (묵인)
Exception 을 방지하는 방법은, `required` 속성이다. `required` 속성의 기본 값은 true 이며,
`required=true` 일 경우 value 값에 해당하는 쿠키가 없으면 Exception이 발생한다.
따라서...
★`required=false` 로 설정하여
value 값에 해당하는 쿠키가 존재하지 않더라도 Exception이 발생하지 않도록 처리해야 한다.
'[Inflearn] > 자바 스프링 프레임워크(renew ver.)' 카테고리의 다른 글
[inflearn] 20240120 [스프링-프레임워크] - 23강 필기 (0) | 2024.01.21 |
---|---|
[inflearn] 20240120 [스프링-프레임워크] - 21강 필기 (1) | 2024.01.20 |
[inflearn] 20240114 [스프링-프레임워크] - 19강 필기 (1) | 2024.01.14 |
[inflearn] 20240113 [스프링-프레임워크] - 18강 필기 (2) | 2024.01.14 |
[inflearn] 20240113 [스프링-프레임워크] - 17강 필기 (2) | 2024.01.13 |