ํด๋น ๋ด์ฉ์ ์นด์นด์ค ํ ํฌ ์บ ํผ์ค์ 1๋จ๊ณ 1์ฃผ์ฐจ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉฐ ์์ฑํ ๋ด์ฉ์ ๋๋ค.
์ฟ ํค๋?
์ด๋ฆ๊ณผ ๊ฐ์ ์์ผ๋ก ๊ตฌ์ฑ๋ ์์ ์ ๋ณด (์์คํค ๋ฌธ์๋ง ๊ฐ๋ฅ)
์๋ฒ์์ ์์ฑ ํ ์ ์ก, ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ. ์ ํจ๊ธฐ๊ฐ ์ดํ ์๋ ์ญ์
์๋ฒ์์ ์์ฒญ์ domain, path๊ฐ ์ผ์นํ๋ ๊ฒฝ์ฐ์๋ง ์๋ ์ ์ก
๋์๋ฐฉ์
- ํด๋ผ์ด์ธํธ โ ์๋ฒ : ๋ก๊ทธ์ธ ์์ฒญ
- ์๋ฒ: ํด๋ผ์ด์ธํธ์ ๋ก๊ทธ์ธ ์์ฒญ ์ ํจ์ฑ ํ์ธ, ์๋ต header์
set-cookieL user=chrisjune
์ถ๊ฐํ์ฌ ์๋ต - ํด๋ผ์ด์ธํธ: ์ดํ ์๋ฒ์ ์์ฒญํ ๋ ์ฟ ํค๋ฅผ ์๋์ผ๋ก ์์ฒญํค๋์ ์ถ๊ฐํ์ฌ ์์ฒญ
์ฟ ํค, ์ธ์ , JWT(ํ ํฐ) ์ฐจ์ด์
์ฟ ํค
์๋ฒ๊ฐ ์ฐ๋ฆฌ์ ๊ดํ ๊ฒ์ ๊ธฐ์ตํ๊ธฐ ์ํด ์ฐ๋ฆฌ์ ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ์ ์๋ ์์คํ ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์ ๋งค๊ฐ์ฒด
โ ๋ก์ปฌ์ ์ ์ฅ, ํ์ทจ์ ๋ณ์กฐ๊ฐ ๊ฐ๋ฅ, ๋ธ๋ผ์ฐ์ ๋ฅผ ์ข ๋ฃํด๋ ํ์ผ๋ก ๋จ์์์, ์๋์ ์ผ๋ก ๋น
์ธ์
ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ์ฐ๊ฒฐ์ด ํ์ฑํ๋ ์ํ๋ก,
์ฟ ํค์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ก๊ทธ์ธ๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ธ์ฆ์ ํ ๋ ์ฃผ๋ก ์ฌ์ฉ
โ ๋ก์ปฌ๊ณผ ์๋ฒ์ ์ ์ฅ, ๋ธ๋ผ์ฐ์ ย ์ข ๋ฃ์ย ์ธ์ ์ ์ญ์ , ์๋์ ์ผ๋ก ์์
JWT
์ฟ ํค&์ธ์ ๋ฐฉ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ฒ๋ก๋ถํฐ ๋ฐ์์ ์์ฒญํ ๋๋ง๋ค ๊ฐ์ด ๋ณด๋ด์ค์ผํจ ์๋ฒ์๊ฒ ๋ณด์ฌ์ค์ผ ํ๋ ์ ๋ถ์ฆ ๊ฐ์ ๊ฑฐ
๐ ์ฉ์ด ์ ๋ฆฌ
- ์ฟ ํคย = ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ ๋งค๊ฐ์ฒด
- ์ธ์ ย = ์ฟ ํค๋ ๋น์ท. ๋์ ์๋ฒ ์ชฝ์ ์ ๋ณด๋ฅผ ์ ์ฅ
- ํ ํฐย = ์๋ฒ์๊ฒ ๋ณด์ฌ์ค์ผํ๋ฉฐ, ์๋ฒ๊ฐ ๊ธฐ์ตํ๋ ์ด์ํ๊ณ ๋ฌด์ง ๊ธด string ~ like ์ ๋ถ์ฆ
- JWTย = ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ ํ ํฐ. DB ์์ด ๊ฒ์ฆ ๊ฐ๋ฅ
์ฟ ํค ์์ฑ
Cookie cookie = new Cookie("id", "asdf"); // ์ฟ ํค ์์ฑ
cookie.setMaxAge(60*60*24); // ์ ํจ๊ธฐ๊ฐ ์ค์ (์ด)
response.addCookie(cookie); // ์๋ต์ ์ฟ ํค ์ถ๊ฐ
์๋ต ํค๋
์ฟ ํค์ ์ญ์ ๋ณ๊ฒฝ
Cookie cookie = new Cookie("id", "");
cookie.setMaxAge(0); // ์ ํจ๊ธฐ๊ฐ 0์ผ๋ก
response.addCookie(cookie); // ์๋ต์ ์ฟ ํค ์ถ๊ฐ
Cookie cookie = new Cookie("id", "");
cookie.setValud(URLEncoder.encode("๋จ๊ถ์ฑ));
cookie.setDomain("www.fastcampus.co.kr");
cookie.setPath("/ch2");
cookie.setMaxAge(60*60*24*7);
response.addCookie(cookie); // ์๋ต์ ์ฟ ํค ์ถ๊ฐ
์ฟ ํค ์ฝ์ด์ค๊ธฐ
Cookie[] cookies = request.getCookies();
for (Cookie cookie: cookies) {
String name = cookie.getname();
String value = cookie.getValue();
System.out.printf("[Cookie] name = %s, value=%s\n", name, value);
}
์ฟ ํค ์ค์ต
๋ก๊ทธ์ธ ์ ๋ณด ์ ์ฅํ๊ธฐ (์์ด๋๊ธฐ์ต)
package com.fastcampus.ch2;
import java.net.URLEncoder;
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;
@Controller
@RequestMapping("/login")
public class LoginController {
@GetMapping("/login")
public String loginForm() {
return "loginForm";
}
@PostMapping("/login")
public String login(String id, String pwd, boolean rememberId, HttpServletResponse response) throws Exception {
System.out.println("id="+id);
System.out.println("pwd="+pwd);
System.out.println("rememberId="+rememberId);
// 1. id์ pwd์ ํ์ธ
if (!loginCheck(id, pwd)) {
// 2-1. ์ผ์นํ์ง ์์ผ๋ฉด loginForm์ผ๋ก ์ด๋
String msg = URLEncoder.encode("id ๋๋ pwd๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.", "utf-8");
return "redirect:/login/login?msg=" + msg;
}
// 2-2. id์ pwd ์ผ์นํ๋ฉด
if (rememberId) {
// 1. ์ฟ ํค ์์ฑ
Cookie cookie = new Cookie("id", id);
// 2. ์๋ต์ ์ ์ฅ
response.addCookie(cookie);
} else {
Cookie cookie = new Cookie("id", id);
cookie.setMaxAge(0);
response.addCookie(cookie);
}
// 3. ํ์ผ๋ก ์ด๋
return "redirect:/";
}
private boolean loginCheck(String id, String pwd) {
// TODO Auto-generated method stub
return "asdf".equals(id) && "1234".equals(pwd);
}
}
<input type="text" name="id" value = ${cookie.id.value}" placeholder="์ด๋ฉ์ผ ์
๋ ฅ" autofocus>
<input type="password" name="pwd" placeholder="๋น๋ฐ๋ฒํธ">
<button>๋ก๊ทธ์ธ</button>
<div>
<label><input type="checkbox" name="rememberId" ${empty cookie.id.value ? "": "checked"}> ์์ด๋ ๊ธฐ์ต</label> |
<a href="">๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ</a> |
<a href="">ํ์๊ฐ์
</a>
</div>
์์ด๋๊ธฐ์ต ์ฒดํฌ X - ์ฟ ํค ์ญ์
์์ด๋ ๊ธฐ์ต ์ฒดํฌ โ ์ฟ ํค ์์ฑ (id = asdf)