Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[inflearn] 20240114 [스프링-프레임워크] - 20강 필기 본문

[Inflearn]/자바 스프링 프레임워크(renew ver.)

[inflearn] 20240114 [스프링-프레임워크] - 20강 필기

Jelly-fish 2024. 1. 14. 22:57

20강 - 세션, 쿠키

클라이언트와 서버의 연결을 유지하는 방법을 학습한다.

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` 객체를 사용할 수 있다.

출처 - Inflearn [스프링-프레임워크 (renew)] - 20강

 

【회원가입, 로그인, 회원정보 수정, 회원정보 삭제에서의 세션(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이 발생하지 않도록 처리
해야 한다.