์ฟ ํ‚ค(Cookie) ๐Ÿช

goยท2024๋…„ 7์›” 18์ผ

๐Ÿ’ก ์ฟ ํ‚ค์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ด…์‹œ๋‹ค !

๐ŸฆŠ ์ฟ ํ‚ค๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

์ฟ ํ‚ค(Cookie)๋Š” ์›น ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ(์ฃผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €) ๊ฐ„์— ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•œ ์ƒํƒœ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์ „์†กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค. ์ฟ ํ‚ค๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์ถ”์ ํ•˜๋Š”๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.


์ฟ ํ‚ค์˜ ๊ตฌ์กฐ (์˜ˆ์‹œ)

Set-Cookie : name=value; Expries=Wed, 21 Oct 2021 07:28:00 GMT; Path=/; Domain=example.com
  • name=value : ์ฟ ํ‚ค์˜ ์ด๋ฆ„๊ณผ ๊ฐ’
  • Expires : ์ฟ ํ‚ค์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์ง€์ •. ์ด ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ฟ ํ‚ค๋Š” ์‚ญ์ œ
  • Path : ์ฟ ํ‚ค๊ฐ€ ์œ ํšจํ•œ URL ๊ฒฝ๋กœ
  • Domain : ์ฟ ํ‚ค๊ฐ€ ์œ ํšจํ•œ ๋„๋ฉ”์ธ
  • Secure : ์ฟ ํ‚ค๊ฐ€ HTTPS ์—ฐ๊ฒฐ์—์„œ๋งŒ ์ „์†ก๋จ
  • HttpOnly : ํด๋ผ์ด์–ธํŠธ ์ธก ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ์„ค์ •

์ฟ ํ‚ค์˜ ์šฉ๋„

1. ์„ธ์„ ๊ด€๋ฆฌ : ๋กœ๊ทธ์ธ ์ •๋ณด, ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‚ด์šฉ ๋“ฑ ์‚ฌ์šฉ์ž ์„ธ์…˜์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
2. ์‚ฌ์šฉ์ž ๋งž์ถค ์„ค์ • : ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ ์›น ์‚ฌ์ดํŠธ์˜ ํ™˜๊ฒฝ ์„ค์ •(์˜ˆ:์–ธ์–ด,ํ…Œ๋งˆ ๋“ฑ)์„ ์ €์žฅ
3. ํŠธ๋ž˜ํ‚น ๋ฐ ๋ถ„์„ : ์‚ฌ์šฉ์ž์˜ ์›น ์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ ํŒจํ„ด์„ ์ถ”์ ํ•˜์—ฌ ๋ถ„์„ํ•˜๊ณ  ๊ด‘๊ณ  ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ

์ฟ ํ‚ค ์ €์žฅํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๊ธฐ

  • ์ฟ ํ‚ค ์ €์žฅํ•˜๋Š” 3๊ฐ€์ง€ ์Šคํƒญ
  1. ์ฟ ํ‚ค์˜ ๊ฐ์ฒด์ƒ์„ฑ(์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ‚คยท๋ฒจ๋ฅ˜๊ฐ’์„ ํ•œ ์Œ์œผ๋กœ ๋ฌถ๋Š”๋‹ค)
  2. ์ฟ ํ‚ค์˜ ๋‚˜์ด ์ง€์ •
  3. ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ฌ๊ธฐ
  • ์ฟ ํ‚ค๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” 3๊ฐ€์ง€ ์Šคํƒญ
  1. ์‚ฌ์šฉ์ž์—๊ฒŒ ์ €์žฅ๋œ ์ฟ ํ‚ค'๋“ค'์„ ๊ฐ€์ ธ์˜ค๊ธฐ
  2. ๋‚ด๊ฐ€ ๊ฐ€์ ธ์˜จ ์ฟ ํ‚ค ๋ฐฐ์—ด๋กœ๋ถ€ํ„ฐ ์›ํ•˜๋Š” ํ‚ค ๊ฐ’ ์ฐพ์Œ
  3. ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๋ฒจ๋ฅ˜๋ฅผ ์ทจ๋“

๐Ÿ–ฅ๏ธ ์ฟ ํ‚ค ํ…Œ์ŠคํŠธ(์˜ˆ์ œ ์‹ค์Šต)

์ „์ฒด์ฝ”๋“œ

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>cookieTest.jsp</h1>
<%
//1. ์ฟ ํ‚ค๋“ค ๊ฐ€์ ธ์˜ค๊ธฐ
Cookie cks[]=request.getCookies();
//2. ์›ํ•˜๋Š” ํ‚ค๊ฐ’ ์ฐพ๊ธฐ
if(cks!=null){
   for(int i=0;i<cks.length;i++){
      String key=cks[i].getName();   //์ฟ ํ‚ค์˜ ํ‚ค๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
      String value=URLDecoder.decode(cks[i].getValue()); //์ฟ ํ‚ค์˜ value๊ฐ’ ๊ฐ€์ ธ์™€์„œ ๋””์ฝ”๋”ฉ
      //String value=cks[i].getValue();   //์ฟ ํ‚ค์˜ ๋ฐธ๋ฅ˜๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ
      out.println("<h2>Key: "+key+" Value: "+value+"</h2>");
   }
}
//1. ์ฟ ํ‚ค๊ฐ์ฒด ์ƒ์„ฑ
String name="ํ™ ๊ธธ๋™";
name=URLEncoder.encode(name);
Cookie ck=new Cookie("cname", "honggildong");

//2. ๋‚˜์ด์ง€์ •
ck.setMaxAge(60*3);

//3. ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ฌ๊ธฐ
response.addCookie(ck);

Cookie ck2=new Cookie("cage", "20");
ck2.setMaxAge(60*3);
response.addCookie(ck2);
%>
</body>
</html>

์ถœ๋ ฅํ™”๋ฉด

์ฒซ ์ ‘์† ์‹œ์—๋Š” ํด๋ผ์ด์–ธํŠธ์— JSESSIONID ์ฟ ํ‚ค๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ฟ ํ‚ค๋งŒ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
์ดํ›„ ์ƒˆ๋กœ์šด ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•˜๋ฉด, ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ํด๋ผ์ด์–ธํŠธ๋Š” ์ƒ์„ฑ๋œ ๋ชจ๋“  ์ฟ ํ‚ค๋ฅผ ๋‹ค์‹œ ์„œ๋ฒ„์— ์ „์†กํ•˜๋ฏ€๋กœ ๋ชจ๋“  ์ฟ ํ‚ค๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ์„ค๋ช… 01

<%
// 1. ํด๋ผ์ด์–ธํŠธ์— ์ „์†ก๋œ ์ฟ ํ‚ค๋“ค์„ ๊ฐ€์ ธ์˜ค๊ธฐ
Cookie cks[] = request.getCookies(); // request ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์ฟ ํ‚ค๋ฅผ ๋ฐฐ์—ดํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์˜ด

// 2. ํŠน์ • ์ฟ ํ‚ค๋ฅผ ์ฐพ๊ณ  ๊ทธ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ธฐ
if(cks!=null){ // ์ฟ ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
	for(int i=0;i<cks.length;i++) { // ๋ชจ๋“  ์ฟ ํ‚ค๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ
    	String key = cks[i].getName(); // ํ˜„์žฌ ์ฟ ํ‚ค์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ด
        String value = URLDecoder.decode(cks[i].getValue();) // ํ˜„์žฌ ์ฟ ํ‚ค์˜ ๊ฐ’์„  URL ๋””์ฝ”๋”ฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ด
        out.println("<h2>Key:"+key+"/Value:"+value+"</h2>"); // ์ฟ ํ‚ค์˜ ์ด๋ฆ„๊ณผ ๊ฐ’์„ ์ถœ๋ ฅ
    }
}
%>
  • ์ฟ ํ‚ค ๊ฐ€์ ธ์˜ค๊ธฐ : 'request.getCookies()'๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์ „์†ก๋œ ๋ชจ๋“  ์ฟ ํ‚ค๋ฅผ ๋ฐฐ์—ด๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ์ฟ ํ‚ค ์กด์žฌํ™•์ธ : ๊ฐ€์ ธ์˜จ ์ฟ ํ‚ค ๋ฐฐ์—ด์ด null์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฟ ํ‚ค ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ : ๊ฐ ์ฟ ํ‚ค์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ด๋ฆ„(getName())๊ณผ ๊ฐ’(getValue())์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๋•Œ, ๊ฐ’์€ URL ์ธ์ฝ”๋”ฉ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ URLDecoder.decode() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋””์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

[์ถœ๋ ฅํ™”๋ฉด๐Ÿ”ฝ]

์ฟ ํ‚ค๋Š” ์ด๋ฆ„๊ณผ ๊ฐ’ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ์‹œ ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ฟ ํ‚ค ์ด๋ฆ„(Name) : 'JSESSIONID'
  • ์ฟ ํ‚ค ๊ฐ’(Value) : '1002BD6197D52BE13E714C567D2DF02F'

์ฝ”๋“œ์„ค๋ช… 02

// 1. ์ƒˆ๋กœ์šด ์ฟ ํ‚ค๊ฐ์ฒด ์ƒ์„ฑ
String name = "ํ™๊ธธ๋™";
name = URLEncoder.encode(name, "UTF-8"); // ๊ฐ’์„ URL ์ธ์ฝ”๋”ฉ (๊ณต๋ฐฑ ๋ฐ ํŠน์ˆ˜๋ฌธ์ž ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ธ์ฝ”๋”ฉ), ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์€ UTF=8
Check ck = new Cookie("cname",name); // "cname" ์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ฟ ํ‚ค ๊ฐ์ฒด ์ƒ์„ฑ, ๊ฐ’์€ ์ธ์ฝ”๋”ฉ๋œ "ํ™๊ธธ๋™"

// 2. ์ฟ ํ‚ค์˜ ์œ ํšจ ๊ธฐ๊ฐ„ ์„ค์ •
ck.setMaxAge(60*3); // ์ฟ ํ‚ค์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ 3๋ถ„(180์ดˆ)๋กœ ์„ค์ •

// 3. ์ƒ์„ฑํ•œ ์ฟ ํ‚ค๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ถ”๊ฐ€
response.addCookie(ck) // response ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์— ์ฟ ํ‚ค ์ „์†ก

// ๋‘ ๋ฒˆ์งธ ์ฟ ํ‚ค๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์„ค์ •
Cookie ck2 = new Cookie("cage","20"); // cage๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ฟ ํ‚ค ๊ฐ์ฒด ์ƒ์„ฑ, ๊ฐ’์€ "20"
ck2.setMaxAge(60*3); // ์œ ํšจ ๊ธฐ๊ฐ„์„ 3๋ถ„์œผ๋กœ ์„ค์ •
response.addCookie(ck2); // ํด๋ผ์ด์–ธํŠธ์— ์ฟ ํ‚ค ์ „์†ก
  • ์ฟ ํ‚ค ์ƒ์„ฑ : 'Cookie' ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ฟ ํ‚ค๋Š” "cname" ์ด๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์‹ถ์€ "ํ™๊ธธ๋™" ์ž…๋‹ˆ๋‹ค. ๊ฐ’์€ URL ์ธ์ฝ”๋”ฉ('URLEncoder.encode()')์„ ์‚ฌ์šฉํ•ด ์ธ์ฝ”๋”ฉ ํ•ฉ๋‹ˆ๋‹ค.

๐ŸฆŠ URLEncoder.encode()์€ ๋ฌด์—‡์ธ๊ฐ€์š” ?

๋ฌธ์ž์—ด์„ application/x-www-form-urlencoded MIME ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ์„ ํ•˜์—ฌ์„œ,
URL์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ํŠน์ˆ˜ ๋ฌธ์ž์™€ ๊ณต๋ฐฑ์„ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ์œ ํšจ ๊ธฐ๊ฐ„ ์„ค์ • : 'setMaxAge()'๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟ ํ‚ค์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 3๋ถ„(60์ดˆ * 3)์œผ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ฟ ํ‚ค ์ถ”๊ฐ€ : 'response.addCookie()' ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ ์ฟ ํ‚ค๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ฟ ํ‚ค๋Š” "cage" ๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ๊ฐ’์€ "20" ์ด๋ฉฐ, ์—ญ์‹œ 3๋ถ„ ๋™์•ˆ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

[์ถœ๋ ฅํ™”๋ฉด๐Ÿ”ฝ]

  1. ์ฒซ๋ฒˆ์งธ ์ƒ์„ฑํ•œ ์ฟ ํ‚ค๊ฐ์ฒด
  • ์ด๋ฆ„ (Key): 'cname'
  • ๊ฐ’ (Value): 'honggildong'
  1. ๋‘๋ฒˆ์งธ ์ƒ์„ฑํ•œ ์ฟ ํ‚ค๊ฐ์ฒด
  • ์ด๋ฆ„ (Key): cage
  • ๊ฐ’ (Value): 20
profile
์•ˆ๋…•ํ•˜์„ธ์š”!

0๊ฐœ์˜ ๋Œ“๊ธ€