2023.07.07 TIL

2023. 7. 7. 21:14TIL(Today I Learned)

[1] Cookie

- 클라이언트 측에 저장한다.

- key, value 형태로 저장된다.

- 서버가 쿠키를 만들어서 클라이언트 측에 전달한다.

- member/login 을 하면 요청받은 서버가 Cookie를 하나 만들어서 그 쿠키를 기억해서 클라이언트에 전달함.

- 광고를 볼 때, 체크박스 체크하면 24시간 동안 광고 안보이기나 아이디 저장을 누르면 항상 기억되게 만든다거나 할 때, 쿠키가 사용된다.

- 저장된 쿠키는 요청을 보낼 때마다, 포함되어서 보내진다.

 

(1) 서버에서 쿠키를 구워서 클라이언트한테 주는 방법

1. 쿠키 생성

path : 현재경로 기준으로 쿠키가 만들어짐

기본적으로는 path가 현재경로 기준이 됨

- 하지만, path를 설정할 수 있음

- 만료시간을 설정할 수 있음

2. resp에 담기

 

package com.kh.app.member.controller;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.kh.app.member.service.MemberService;
import com.kh.app.member.vo.MemberVo;

import lombok.RequiredArgsConstructor;

@Controller
@RequestMapping("member")
@RequiredArgsConstructor
public class MemberController {
	private final MemberService ms;
	
	//로그인(화면)
	@GetMapping("login")
	public String login() {
		return "member/login";
	}
	
	
	//로그인
	@PostMapping("login")
	public String login(MemberVo vo, HttpServletResponse resp) {
		System.out.println("유저가 입력한 데이터 : "+vo);
		
		//로그인 성공시, 쿠키를 추가
		Cookie c = new Cookie("remeberId", vo.getId());
		c.setPath("/app");
		resp.addCookie(c);
		
		
		return "redirect:/home";
	}
}

 

3. 쿠키 삭제

- 쿠키 삭제는 불가능하다. 

- 편법을 활용해서 쿠키를 삭제할 수는 있다.

- 쿠키는 name이 같으면 덮어씌울 수 있다.

- name을 똑같이 만들고, 만료시간을 0초로 설정하면 된다.

 

 

4. JSESSIONID는 무엇인가?

- 서버측의 session이라는 저장소에 클라이언트 한명, 한명 구분해서 동작한다.(홍길동의 전용 세션, 김철수의 전용 세션)

- 서버는 어떻게 클라이언트 한명한명을 구분할까?

-> 쿠키를 가지고 구분을 한다. 서버에 요청보낼 일이 생기면 AN123ASDASD123 이런 숫자를 보내준다. 이게 바로 쿠킨데, 그 쿠키에 따라 구분을 할 수 있다. 서버측에서는 그걸 기억하고 있다가 그 값을 기억해서 그에 맞는 데이터를 보여줄 수 있다. 

 

5. 쿠키의 보안성

- 해커가 탈취해서 쿠키의 정보를 갖고와도, 그 정보를 다른 곳에서 로그인 할경우 서버 측에서 그 쿠키를 만료시켜버린다.

- 원래 사용자가 로그인을 하면 새로운 쿠키를 전달해주면 된다.

 

 

6. jsp에서 쿠키를 사용하는 법

${cookie}

- 여러 개의 쿠키들을 얻어온 것과 마찬가지다.

- 그중에서도 키값이 rememberId인 것을 가져온 것이니까  ${cookie.rememberId} 이렇게 쓰면 이에 해당 하는 키값을 가져올 수 있게 된다.

- ${cookie.rememberId.value} 이렇게 쓰면 특정 키값에 해당하는 밸류 값을 가져올 수 있다.

- ${cookie.rememberId.name} -> 특정 쿠키객체의 name

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
	<h1>로그인</h1>
	

	
	<form action="/app/member/login" method="post">
		<input type="text" name="id" value="${cookie.rememberId.value}">
		<br>
		<input type="password" name="pwd">
		<br>
		<input type="submit" value="로그인">
	</form>
</body>
</html>

 

7. 서버 측에서 cookie를 가져오는 법

- req.getCookies는 view 쪽의 ${cookie}와 같은 말이다.

- 하지만 스프링에서는 @CookiesValue를 통해 쉽게 얻어올 수 있다.

 

package com.kh.app.home.controller;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("home")
public class HomeController {
	@RequestMapping
	public String home(@CookieValue Cookie rememberId) {
		System.out.println(rememberId.getName()+" / "+rememberId.getValue());

		
		
		return "home";
	}
	
	
}

- 데이터 검증은 반드시 서버 측에서 진행해야 한다.

 

 

'TIL(Today I Learned)' 카테고리의 다른 글

2023.07.13 TIL  (0) 2023.07.13
2023.07.12 TIL  (0) 2023.07.12
2023.07.03 TIL  (0) 2023.07.03
2023.06.23 TIL  (0) 2023.06.23
2023.06.22 TIL  (0) 2023.06.22