DEVLOG

세션, 쿠키 본문

Spring

세션, 쿠키

BINTHEWORLD 2022. 6. 13. 16:44

Connection Protocol 

서버의 부하를 줄일 수 있는 장점은 있나, 클라이언트의 요청 시마다 서버와 매번 새로운 연결이 생성되므로 일반적인 로그인 상태 유지, 장바구니 등의 기능을 구현하기 어렵다.

 

이러한 Connection Protocol의 불편함을 해결하기 위해 세션과 쿠키를 이용한다. 한 번 요청하고 한 번 응답 후 연결이 끊기더라도 연결되었던 정보로 연결 유지가 가능하다.

세션서버에서 연결 정보를 관리하는 반면 쿠키클라이언트에서 연결 정보를 관리하는 데 차이가 있다.


세션(Session)

아래 두 방법은 세션 사용 방법이다.

차이점은 거의 없고, 세션 객체를 얻는 방법에 차이가 있을 뿐이다.

[세션 사용]

1. HttpServletRequest를 이용한 세션 사용

스프링 MVC에서 HttpServletRequest를 이용해서 세션을 이용하려면 컨트롤러의 메소드에서 파라미터로 HttpServletRequest를 받으면 된다.

즉, 파라미터로 HttpServletRequest을 받아 세션을 사용한다.

MemberController.java

	@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을 받아 세션을 사용한다.

그러므로 getSession() 메소드는 필요 없다.

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

[세션 삭제]

로그아웃, 회원탈퇴 등 세션에 저장된 속성이 더 이상 필요없을 때 사용된다.

session.invalidate(); 메소드를 활용한다.

1. HttpServletRequest를 이용한 세션 삭제

	@RequestMapping("/logout")
	public String memLogout(Member member, HttpServletRequest request) {
		
		HttpSession session = request.getSession();
		session.invalidate();
		
		return "/member/logoutOk";
	}

2. HttpSession를 이용한 세션 삭제

매개변수로 HttpSession을 받으므로 getSession() 메소드는 필요없다.

	@RequestMapping("/logout")
	public String memLogout(Member member, HttpSession session) {
		
		session.invalidate();
		
		return "/member/logoutOk";
	}

쿠키(Cookie)

HttpServletResponse를 파라미터로 받아 사용한다.

쿠키를 생성할 때는 생성자에 두 개의 파라미터를 넣어주는데, 첫 번째는 쿠키 이름을 넣어주고 두 번째는 쿠키 값을 넣어준다.

	@RequestMapping("/main")
	public String mallMain(Mall mall, HttpServletResponse response){ // 파라미터
		
		Cookie genderCookie = new Cookie("gender", mall.getGender()); // 쿠키생성
		
		if(mall.isCookieDel()) {
			genderCookie.setMaxAge(0); // 유효시간 0 설정 -> 사용 불가능
			mall.setGender(null);
		} else {
			genderCookie.setMaxAge(60*60*24*30); // 60초 * 60분 * 24시간 * 30일 = 한 달 동안 쿠키 유지하라
		}
		response.addCookie(genderCookie); // 받아온 response에 쿠키 넣어줌 
		
		return "/mall/main";
	}

@CookieValue 어노테이션

@CookieValue 어노테이션을 이용하면 쿠키 값을 파라미터로 전달받을 수 있다.

 

@CookieValue 어노테이션은 해당 쿠키가 존재하지 않으면 기본적으로 500 에러를 발생시킨다. 따라서, 쿠키가 필수가 아닌 경우에는 required 속성의 값을 false로 지정해 주어야 한다. required 속성의 기본 값은 true이다.

required 속성의 값을 false로 지정할 경우, 해당 쿠키가 존재하지 않으면 null을 값으로 전달받게 된다.

MallController.java

	@RequestMapping("/index")
	public String mallIndex(Mall mall, 
    		// value="쿠키이름", required=false(해당 쿠키가 없더라도 exception 발생하지 않도록 설정(디폴트 true))
			@CookieValue(value="gender", required=false) Cookie genderCookie, 
			HttpServletRequest request) {
		
		if(genderCookie != null) 
			mall.setGender(genderCookie.getValue()); // mall.getGender()
		
		return "/mall/index";
	}

 

🙆‍♂️출처🙇‍♂️

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC_renew

 

자바 스프링 프레임워크(renew ver.) - 신입 프로그래머를 위한 강좌 - 인프런 | 강의

스프링 프레임워크 기본부터 실전 사용법까지! 충실하고 폭넓은 설명과 예제를 통해 현장에 바로 투입되어 활약하는 개발자로 거듭나세요., - 강의 소개 | 인프런...

www.inflearn.com

https://writingdeveloper.blog/163

 

[Spring] 01-9. CookieValue Annotation을 이용한 쿠키 Mapping, 파라미터 타입 정리

@CookieValue Annotation을 이용하면 쿠키 값을 파라미터로 전달받을 수 있다. @CookieValue Annotation은 해당 쿠키가 존재하지 않으면 기본적으로 500 에러를 발생시킨다. 따라서, 쿠키가 필수가 아닌 경우에

writingdeveloper.blog

Comments