본문 바로가기

스터디/코딩

[ 자율 스터디 ] 쿠키와 세션

쿠키란?

- 사용자가 웹 페이지에 접속할 때 웹 서버가 사용자의 컴퓨터에 저장하는 작은 양의 데이터

- 클라이언트는 최대 300개의 쿠키를 가질 수 있으며, 하나의 도메인 당 최대 20개, 하나의 쿠키 당 최대 4KB까지 저장할 수 있다.

- 웹 서버는 쿠키를 사용자의 컴퓨터에 저장한 뒤 쿠키가 필요할 때 사용자의 컴퓨터에 요청하고 사용자의 컴퓨터는 저장된 쿠키를 웹 서버에 전송한다.

- 쿠키를 사용하면 사용자의 정보를 기억하기에 특정 웹 사이트를 재방문하거나 웹 사이트 내의 다른 페이지로 이동할 때 다시 로그인 할 필요가 없으며 사용자의 웹 페이지 이용 패턴을 분석한다.

- 브라우저마다( 크롬, 익스플로러, 사파리, 파이어폭스 등등 ) 저장되는 쿠키는 다르다. 

- 쿠키를 사용함으로서 HTTP의 특징 중 Connectionless와 Stateless의 단점을 보완하게된다.

  ( Connectionless : 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어버리는 특징, HTTP는 먼저 클라이언트가

    요청을 서버에 보내면, 서버는 클라이언트에게 요청에 맞는 응답을 보내고 접속을 끊게된다.)

  ( Stateless : 통신이 끝나면 상태를 유지하는 특징, 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는

    유지되지 않게된다. )

- 쿠키는 소프트웨어가 아니기에 컴퓨터내에서 프로그램처럼 실행될 수 없으며 바이러스를 옮길 수도, 악성코드를 설치할    수 도 없다.

 

쿠키를 발급받고 사용하는 과정

 

웹해킹 실습을 할 때 쿠키를 사용할 때 EditThisCookie를 사용했었다.

 

[ 쿠키와 데이터의 위치 ]

 

구분 웹 서버 사용자의 컴퓨터
데이터 위치   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