쿠키란?
- 사용자가 웹 페이지에 접속할 때 웹 서버가 사용자의 컴퓨터에 저장하는 작은 양의 데이터
- 클라이언트는 최대 300개의 쿠키를 가질 수 있으며, 하나의 도메인 당 최대 20개, 하나의 쿠키 당 최대 4KB까지 저장할 수 있다.
- 웹 서버는 쿠키를 사용자의 컴퓨터에 저장한 뒤 쿠키가 필요할 때 사용자의 컴퓨터에 요청하고 사용자의 컴퓨터는 저장된 쿠키를 웹 서버에 전송한다.
- 쿠키를 사용하면 사용자의 정보를 기억하기에 특정 웹 사이트를 재방문하거나 웹 사이트 내의 다른 페이지로 이동할 때 다시 로그인 할 필요가 없으며 사용자의 웹 페이지 이용 패턴을 분석한다.
- 브라우저마다( 크롬, 익스플로러, 사파리, 파이어폭스 등등 ) 저장되는 쿠키는 다르다.
- 쿠키를 사용함으로서 HTTP의 특징 중 Connectionless와 Stateless의 단점을 보완하게된다.
( Connectionless : 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어버리는 특징, HTTP는 먼저 클라이언트가
요청을 서버에 보내면, 서버는 클라이언트에게 요청에 맞는 응답을 보내고 접속을 끊게된다.)
( Stateless : 통신이 끝나면 상태를 유지하는 특징, 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는
유지되지 않게된다. )
- 쿠키는 소프트웨어가 아니기에 컴퓨터내에서 프로그램처럼 실행될 수 없으며 바이러스를 옮길 수도, 악성코드를 설치할 수 도 없다.


[ 쿠키와 데이터의 위치 ]
| 구분 | 웹 서버 | 사용자의 컴퓨터 |
| 데이터 위치 | O | |
| 쿠키의 위치 | O | |
| 데이터 가공 | O |
→ 쉽게 생각해서 쿠키는 웹 서버에서의 나의 발자취라고 생각하면 좋을 것 같다.
쿠키의 종류
① Session Cookie : 세션 동안만 저장되고 사라지는 쿠키
② Persistent Cookie : 하드 디스크에 저장되는 쿠키이며 웹 페이지에 접속할 때마다 서버에 전송되는 쿠키
③ Secure Cookie : 암호화된 쿠키
④ Third - Party Cookie : 접속한 사이트 도메인에서 발행되지 않은 쿠키 ( EX. 광고 )
⑤ HTTP Only Cookie : 자바스크립트와 같은 비 HTTP API의 접근을 제한하는 쿠키
쿠키의 목적
- 세션 관리 ( Session Management )
서버에 저장해야 할 정보 관리
- 개인화 ( Personalization )
사용자 선호, 테마 등의 세팅
- 트릭캥 (Tracking)
사용자 행동을 기록하고 분석하는 용도
쿠키의 구성 요소
① Name : 쿠키의 이름
( 소문자, 대문자 구분 )
② Value : 쿠키의 저장된 값
③ Expires : 쿠키의 유효기간 설정
( 초 단위로 표시 )
④ Domain : 쿠키가 사용되는 도메인 지정
⑤ Path : 쿠키를 반환할 경로
- 기본 값 : 현재 디렉토리
- / : 전체 도메인에서 쿠키 사용 가능
- /home/ : [home] 디렉토리와 하위 디렉토리에서 쿠키 사용 가능
⑥ Secure : 보안 연결 설정
⑦ Http Only : HTTP 외에 다른 통신 사용 가능 설정
( HTTP 요청이 있을 경우에만 전송 )
쿠키의 동작 방식
① 클라이언트가 어떠한 정보를 요청
② 서버는 쿠키를 생성
③ 생성한 쿠키를 요청한 정보인 HTTP 헤더와 함께 돌려보냄
④ 클라이언트는 로컬에 쿠키를 저장
⑤ 같은 요청 시 이미 쿠키가 있는 경우 HTTP 헤더에 쿠키를 함께 서버에 보냄
⑥ 업데이트할 정보가 있다면 쿠키를 업데이트하여 변경된 쿠키를 HTTP 헤더에 포함시켜 보냄
쿠키의 생성
<?php
$a = setcookie("userid", "rubato");
$b = setcookie("username", "이지수", time()+60);
if ($a and $b)
{
echo "쿠키 'userid'와 'username' 생성완료!! <br>";
echo "쿠키 'username'은 60초(1분)간 지속됨!";
}
?>

① setcookie() 함수를 이용하여 userid라는 쿠키에 문자열 rubato를 저장
( setcookie() 함수의 실행이 성공하면 ture 반환, 실해패하면 false 반환, $a를 확인함으로써 쿠키가 제대로 생성됨을
볼 수 있다. )
② username이라는 쿠키에 '이지수'를 저장한다. 이 쿠키를 60초간 유효하며 쿠키가 제대로 생성되면 $b는 ture값을
가진다.
③ if문의 조건식을 사용해 $a and $b가 참이면 echo문이 실행된다.
쿠키의 사용
<?php
if (isset($_COOKIE["userid"]) && isset($_COOKIE["username"]))
{
$userid = $_COOKIE["userid"];
$username = $_COOKIE["username"];
echo "userid 쿠키 : " . $userid."<br>";
echo "username 쿠키 : " . $username."<br>";
}
else
{
echo "쿠키가 생성되지 않았다!";
}
?>

<?php
$a = setcookie("userid", "rubato");
$b = setcookie("username", "이지수", time()+60);
if (isset($_COOKIE["userid"]) && isset($_COOKIE["username"]))
{
$userid = $_COOKIE["userid"];
$username = $_COOKIE["username"];
echo "userid 쿠키 : " . $userid."<br>";
echo "username 쿠키 : " . $username."<br>";
}
else
{
echo "쿠키가 생성되지 않았다!";
}
?>

쿠키의 삭제
- setcookie() 함수를 이용하여 userid 쿠키에 null값인 " "를 설정하면 userid 쿠키를 삭제할 수 있다.
- 쿠키의 유효 시간을 현재 시간보다 1시간 짧게 설정함으로써 쿠키 유효 시간을 과거 시간으로 설정한다.
<?php
setcookie("userid", "", time() - 3600);
setcookie("username", "", time() - 3600);
?>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php
echo "userid와 username 쿠키가 삭제되었다!";
?>
</body>
</html>

쿠키의 한계
- 개인 정보를 저장하는 것이기에 사용자의 개인 정보를 침해당할 수 있다.
- 사용자 로컬에 저장되기에 쉽게 조작되거나 가로챌 수 있다.
( XSS 공격, 스니핑 공격 등등 )
- 쿠키에 대한 정보를 매번 헤더에 추가하여 보내기에 상당한 트래픽이 발생된다.
세션이란?
- 사용자의 컴퓨터에 정보가 저장되는 쿠키와 달리 세션은 보안을 이유로 사용자의 컴퓨터와 웹 서버에 모두 정보를 저장한다.
- 웹 사이트를 방문하는 사용자의 컴퓨터에는 세션 ID 정보를 저장하고, 웹 서버에는 사용자의 컴퓨터 세션 ID에 대응되는 세션 정보를 저장한다.
- 사용자의 컴퓨터 세션 ID가 유출되더라도 별다른 정보가 없고 주요 정보가 웹 서버에 저장되어있기에 쿠키보다 보안성이 강하다.
→ 쉽게 생각해서 클라이언트와 서버간의 연결 상태를 의미하는 것이라고 생각하면 좋다.
[ 세션과 데이터의 위치 ]
| 구분 | 웹 서버 | 사용자의 컴퓨터 | 비고 |
| 데이터의 위치 | O | ||
| 세션 정보의 위치 | O | O | 서로 대응되는 정보가 다름 |
| 데이터 가공 | O |
세션의 동작 방식
① 클라이언트가 웹 사이트에 접속해 서버에 요청
② 서버는 접속한 클라이언트에게 세션 ID를 부여해서 응답
③ 클라이언트는 해당 세션 ID를 헤더 쿠키에 넣어 데이터 요청
④ 서버는 세션 ID를 통해 클라이언트를 구별한 뒤 알맞게 응답
⑤ 클라이언트가 접속을 종료
⑥ 서버는 세션 ID를 제거
세션 시작과 등록
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php
session_start();
echo "세션 시작!!!<br>";
$_SESSION['userid'] = "ocella";
$_SESSION['username'] = "이지수";
echo '세션 등록 완료!!!<br>';
echo $_SESSION['userid']."<br>";
echo $_SESSION['username']."<br>";
?>
</body>
</html>

① 세션 초기화
- 세션을 사용하려면 반드시 session_start()로 초기화해야 한다.
(session_start() 함수는 세션을 생성하고 현재의 세션 ID를 활성화하는 역할을 한다.)
| session_start() 함수 | |
| 형식 | bool session_start() |
| 반환 값 | 항상 true |
② 세션 등록
- 세션 변수 userid와 username을 등록하는데, 이때 배열 형태의 전역 변수인 $_SESSION[]의 인덱스에 세션 변수의
이름을 넣어 등록한다.
( EX. $_SESSION['세션 변수명'] )
③ 세션 변수 출력
- 등록한 2개의 세션 변수를 출력한다.
세션 사용
<?php
session_start();
$userid = $_SESSION["userid"];
$username = $_SESSION["username"];
?>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h3>등록된 세션의 사용</h3>
<ul>
<li>등록된 세션(userid) : <?= $userid?></li>
<li>등록된 세션(username) : <?= $username?></li>
</ul>
</table>
</body>
</html>

세션 삭제
- unset() 함수를 사용하여 세션을 삭제한다.
( EX. unset($_SESSION['세션 변수명']) )
- unset() 함수는 입력 값으로 주어지는 세션 변수나 변수의 존재를 파괴할 때 사용되는데 mixed는 다양한 변수형이 사용될 수 있다는 것을 의미한다.
( unset(mixed $var, ...) )
- 세션 변수를 한꺼번에 삭제할 때는 session_unset()을 사용한다.
<?php
session_start();
unset($_SESSION["username"]);
?>
<html>
<head>
<meta charset="utf-8">
<link href="../css/style.css" rel="stylesheet">
</head>
<body>
<ul>
<li><?= "userid 세션 : ".$_SESSION["userid"]."<br>" ?></li>
<li><?= "username 세션 : ".$_SESSION["username"]."<br>" ?></li>
<li><?= "username 세션이 삭제되었습니다!" ?></li>
</ul>
</body>
</html>

쿠키와 세션의 차이
- 세션도 결국 쿠키를 사용하기에 쿠키와 세션은 비슷한 역할을 하며 동작원리도 비슷하다.
- 쿠키는 서버의 자원을 전혀 사용하지 않으며 세션은 서버의 자원을 사용하기에 사용자의 정보가 저장되는 위치가 다르다.
- 세션은 서버의 처리가 필요하기에 보안면에서는 더 우수하다.
( 쿠키는 클라이언트 로컬에 저장되기에 변질되거나 요청에서 스니핑 당할 우려가 있기에 보안에 취약하지만 세션은
쿠키를 이용해 세션 ID만 저장하고 그것으로 구분해서 서버에서 처리하기에 보안성이 좋은 것 )
- 쿠키는 요청시 속도가 빠르다.
( 쿠키게 정보가 있기에 서버에 요청 시 속도가 빠르고 세션은 정보가 서버에 있기에 처리가 요구되어 느리다. )
- 쿠키는 만료시간이 있지만 파일로 저장되기에 브라우저를 종료해도 계속해서 정보가 남아있지만 세션은 만료시간을 정할 수 있어도 브라우저가 종료되면 만료 시간에 상관없이 삭제된다.
→ 세션은 서버의 자원을 사용하기에 무분별하게 만들다보면 서버의 메모리가 감당할 수 없어지고 속도가 느려지기에
쿠키가 좋을 때도 있다.
[ 연습 문제 ]
- 실습 문제가 연습 문제로 동일하게 나와 따로 실행한 사진은 캡쳐하지 않았다.
- 5번
<?php
if(isset($_COOKIE["userid"]) && isset($_COOKIE["username"]))
{
$userid = $_COOKIE["userid"];
$username = $_COOKIE["username"];
echo "userid 쿠키 : " . $userid."<br>";
echo "username 쿠키 : " . $username."<br>";
}
else
{
echo "쿠키가 생성되지 않았다!";
}
?>
- 6번
<?php
session_start();
echo "세션 시작!!!<br>";
$_SESSION['userid'] = "ocella";
$_SESSION['username'] = "박영준";
echo '세션 등록 완료!!!<br>';
echo $_SESSION['userid']."<br>";
echo $_SESSION['username']."<br>";
?>
- 7번
<?php
session_start();
$userid = $_SESSION["userid"];
$username = $_SESSION["username"];
?>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h3>등록된 세션의 사용</h3>
<ul>
<li>등록된 세션(userid) : <?= $userid?></li>
<li>등록된 세션(username) : <?= $username?></li>
</ul>
</table>
</body>
</html>'스터디 > 코딩' 카테고리의 다른 글
| [ 자율 스터디 ] MySQL 조작 (0) | 2023.01.10 |
|---|---|
| [ 자율 스터디 ] MySQL 데이터베이스 (0) | 2023.01.09 |
| [ 자율 스터디 ] 폼과 PHP (0) | 2023.01.05 |
| [ 자율 스터디 ] PHP 함수 (0) | 2023.01.04 |
| [ 자율 스터디 ] PHP 배열 (0) | 2023.01.04 |