2023. 7. 7. 21:14ㆍTIL(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 |