๋ชจ์ ํดํน ์คํฐ๋ - 3์ฃผ์ฐจ ์ถ๊ฐ๊ณผ์ (3-1) JWT ๊ตฌํ์ ์ํ(์ฟ ํค / ์ธ์ )์ ๋ฆฌ
JWT๋ฅผ ๊ตฌํํ๊ธฐ์ ์์
์ฟ ํค(Cookie) ์ ์ธ์ (Session)์ ์ฌ์ฉ ๋ฐฉ์ ์ ๋ฆฌ
JWT๋ ๊ฒฐ๊ตญ ์ฟ ํค์ ๋ฃ์ด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ ๋ฆฌ
์ธ์ ์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฟ ํค๋ฅผ ์ด์ฉ
์ฟ ํค(Cookie)
1) ์ฟ ํค ์์ฑ, ์์
<?php
setcookie("์ฟ ํค์ด๋ฆ", ์ฟ ํค๊ฐ, ๋ง๋ฃ์๊ฐ, ๊ฒฝ๋ก);
// ex) setcookie("token",JWT, time() + 3600, "/");
?>
- setcookie() ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ฟ ํค๋ฅผ ์์ฑ, ์์ ๊ฐ๋ฅ
- ๋ง๋ฃ์๊ฐ์ ๊ฒฝ์ฐ ๋ฐ๋ฆฌ์ธ์ปจ(ms) ๋จ์๋ก ๊ธฐ์ฌ
2) ์ฟ ํค ๋ถ๋ฌ์ค๊ธฐ
<?php
echo $_COOKIE["์ฟ ํค์ด๋ฆ"];
?>
- $_COOKIE["์ฟ ํค์ด๋ฆ"] ์ผ๋ก ์ฟ ํค๊ฐ์ ๋ถ๋ฌ์ฌ ์ ์์
3) ์ฟ ํค ์ญ์
<?php
setcookie("์ฟ ํค์ด๋ฆ", ์ฟ ํค๊ฐ, ๋ง๋ฃ์๊ฐ - (์๊ฐ));
// ex) setcookie("token", JWT, time() - 3600, "/");
?>
- ์ฟ ํค๋ฅผ ์ญ์ ํ๋ ํจ์๋ ๋ฐ๋ก ์กด์ฌํ์ง ์์
- ๋ฐ๋ผ์ ์ฟ ํค๋ฅผ ์์ ํ๋ ๋ฐฉ์์ ์ด์ฉ
- ์๊ฐ๊ฐ์ 0์ด๋ ๋ง์ด๋์ค(-)๋ก ํ์ฌ ์ฟ ํค๋ฅผ ์ญ์
4) ๋ชจ๋ ์ฟ ํค ์ญ์
if(count($_COOKIE)){
foreach($_COOKIE as $key => $value){
setcookie($key, NULL, -3600, '/');
}
}
- ํน์ ์ฟ ํค๋ง ์ญ์ ํ๋ ๊ฒ์ด ์๋๊ณ ๋ชจ๋ ์ฟ ํค๋ฅผ ์ญ์ ํ๊ณ ์ถ์๋ ์ฌ์ฉ
์ธ์
1) ์ธ์ ์์
<?php
// ์ธ์
์์
session_start();
- php์์ ์ธ์
์ ์ฌ์ฉํ๊ธฐ ์ํด session_start()๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์
์ ์์
- ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์น ์๋ฒ์ ์์ ๊ฒฝ์ฐ์๋ ์๋ก์ด ์ธ์ ์ ์์
- ์ด๋ฏธ ์ธ์ ์ด ์์ฑ๋์ด ์๋ค๋ฉด ๊ธฐ์กด ์ธ์ ์ ์ฌ์ฉ
- php์์ ์ธ์ ์ ์์ฑํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์ ์ ์ด๋ฆ์ PHPSESSID๋ก ์ค์
- ์ผ์์ ๋ณ๊ฒฝ์ด ํ์ํ๋ค๋ฉด session_name('์ธ์
์ด๋ฆ') ์ ์ฌ์ฉ
- session_name()์ ์ฌ์ฉํ๋ ค๋ฉด session_start()๋ณด๋ค ์์ ์ ๋ ฅ
<?php
//๋ฐ๊ธ๋ ์ธ์
id๊ฐ ์๋ค๋ฉด ์ธ์
id๋ฅผ, ์๋ค๋ฉด false๋ฅผ ๋ฐํ
if(!session_id()){
// ์ธ์
id๊ฐ ์๋ค๋ฉด ์ธ์
์ ์์
session_start()
}
- session_start() ํจ์๋ฅผ ๊ฐ์ ํ์ผ์์ ๊ณ์ํด์ ์ฌ๋ฌ๋ฒ ์คํํ๋ ๊ฒฝ์ฐ
- ์ด๋ฏธ ์ธ์ ์ด ์์๋์๋ค๋ ์๋ฆผ์ ์ถ๋ ฅ
- session_id()๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฏธ ์์ฑ๋์ด ์๋ ์ธ์ ์ด ์๋์ง ํ์ธ ํ ์ธ์ ์ ์์ํ๋ ๊ฒ์ด ์ข์
2) ์ธ์ ๋ณ์
<?php
session_start();
// ์ธ์
๋ณ์ ๋ฑ๋ก
$_SESSION['userID'] = 'admin';
// ๋ฑ๋ก ๋ณ์ ์ฌ์ฉ
echo "userID : " . $_SESSION['userID'];
- ์ธ์ ๋ณ์ : $_SESSION['๋ณ์๋ช '] = Data
3) ์ธ์ ๋ณ์ ํด์
<?php
session_start();
// ๋ฑ๋ก๋ ์ธ์
๋ณ์ ํด์
unset($_SESSION['userID']);
- ์ธ์
ํด์ : unset($_SESSION['๋ณ์๋ช
']);.
- ํด๋น ๋ณ์๊ฐ ๋ฑ๋ก์ด ํด์ ๋์ด ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ๊ฒ ๋จ
<?php
session_start();
// ๋ชจ๋ ์ธ์
๋ณ์ ํด์
session_unset();
// ์ธ์
์์ ํ ์ข
๋ฃ
session_destroy();
- ๋ชจ๋ ์ธ์ ํด์ : session_unset()
- ์ธ์ ์์ ์ข ๋ฃ : session_destroy()
4) ์ธ์ ๋ณ์ ๋ฑ๋ก ์ฌ๋ถ ํ์ธ
<?php
session_start();
// ์ธ์
๋ณ์ ๋ฑ๋ก ์ฌ๋ถ ํ์ธ
if(!isset($_SESSION['userID'])){
// (๋ฑ๋ก ๋ณ์๊ฐ ์๋ค๋ฉด) ์๋ก์ด ๋ณ์ ์์ฑ
$_SESSION['userID'] = 'data';
}else{
// ๊ธฐ์กด ๋ณ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ
$_SESSION['userID'] = 'user'
}
- isset() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ, ํด๋น ๋ณ์๊ฐ ๋ฑ๋ก๋์ด์๋์ง ํ์ธ
- isset($_SESSION['๋ณ์๋ช
']) ํํ๋ก ์ฌ์ฉ
- ํด๋น ๋ณ์๊ฐ ๋ฑ๋ก๋์ด ์๋ค๋ฉด True
- ๋ฑ๋ก๋์ด์์ง ์๋ค๋ฉด False
- ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋์ ํ์ฌ ๋ณ๊ฒฝ ๊ฐ๋ฅ
5) ์ธ์ ID ๋ณ๊ฒฝ
<?php
session_start();
// ์ธ์
ID ์ ๊ท ๋ฐ๊ธ
session_regenerate_id();
- php์ ์ธ์ ์ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค์ ๋ฑ๋ก๋ ID ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์ ๊ทผ
- ๊ทธ๋ฌ๋ฏ๋ก ์ธ์ ID๋ฅผ ํ์ทจ ๋นํ๋ค๋ฉด ์ธ์ ์ ์ ์ฅ๋ ๋ฐ์ดํฐ ๋ํ ํ์ทจ ๋นํ ์ํ์ด ๋์
- ๊ทธ๋์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์์ ์ธ์ฆ์ ๋ณด ๋ณ๋(๋ก๊ทธ์ธ/๋ก๊ทธ์์), ์ค์ ๋ณ๊ฒฝ ๋ฑ์ ์ค์ํ ๋ณ๊ฒฝ์ฌํญ์ด ์์ ๋๋ง๋ค ์ธ์ ID๋ฅผ ๋ณ๊ฒฝํด ์ค
- php์์ ์๋ก์ด ์ธ์
ID๋ฅผ ๋ฐ๊ธ๋ฐ๊ธฐ ์ํด session_regenerate_id() ํจ์๋ฅผ ์ฌ์ฉ (์ฟ ํค๋ฅผ ์์ฑ)
- session_regenerate_id() ํจ์์ ๊ธฐ๋ณธ ์ค์ ์ ์ธ์ ID๋ฅผ ๋ณ๊ฒฝ ํ, ์ด์ ์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ์ง ์์
- ์ธ์ ID๋ง ์๋ก ๋ฐ๊ธํ์ฌ, ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๋ ๋ฐฉ์
- ์๋ฒ์์ ํ์ธ ํด๋ณด๋ฉด, ID๋ ๋ค๋ฅด์ง๋ง ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ์ธ์ ํ์ผ์ด ํ์ธ๋จ
- ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ๊ณ ์ถ๋ค๋ฉด, session_regenerate_id(true) ํ์์ผ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋๋ก ํจ (์๋ก์ด ID ๋ฐ๊ธ, ์ด์ ์ธ์ ์์ ํ ์ญ์ )
6) ์ธ์ ์ข ๋ฃ
<?hphp
// ์ธ์
๋ฐ์ดํฐ ์ ๊ทผ์ ์ํ ์ธ์
์์
if(!session_id()){
session_start();
}
// ์ธ์
๋ฐ์ดํฐ๋ฅผ ๋น ๋ฐฐ์ด๋ก ์ด๊ธฐํ or session_unset(); ์ฌ์ฉ
$_SESSION = array();
// ์ธ์
ID ๊ฐ์ด ์ ์ฅ๋ ์ฟ ํค ์ญ์
if(ini_get("session.use_cookies")){
$params = session_get_cookie_params();
setcookie(
session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// ์ธ์
ํ์ผ ์ญ์
session_destroy();
- session_destroy() ํจ์๋ ํ์ฌ ์ธ์
์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ๊ดดํ๋ ํจ์
- ์ธ์ ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์๋ ํ์ผ์ ์ญ์ ํ๋ ๊ฒ
- ๊ทธ๋ฌ๋ ๋จ์ง ์ธ์ ํ์ผ์ ์ญ์ ํ๋ ๊ฒ์ผ ๋ฟ
- ์ธ์ ID ๊ฐ์ด ์๋ ์ฟ ํค๋ ๊ทธ๋๋ก ์กด์ฌ
- ๊ทธ๋ฌ๋ฏ๋ก setcookie() ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ธ์ ID๊ฐ ์ ์ฅ๋ ์ฟ ํค๋ฅผ ๊ฐ์ ๋ก ๋ง๋ฃ์์ผ ์ญ์
- $_SESSION ๋ณ์์ ๋น ๋ฐฐ์ด์ ๋ฃ๋ ์ด์ ๋ ๋์ผ
- session_destroy() ํจ์๊ฐ $_SESSION ๋ณ์๊น์ง ํด์ ํ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์
- ๋น ๋ฐฐ์ด์ ๋ฃ์ด ์ด๊ธฐํ
- session_unset() ํจ์๋ฅผ ์ฌ์ฉํด๋ ๊ฐ์ ๋์์ ์คํ
7) ์ธ์ ์ ์ง์๊ฐ
- ๊ธฐ๋ณธ์ ์ผ๋ก php์ ์ธ์
๊ด๋ฆฌ๋ ํ๋ฅ ๋ก ์ด๋ฃจ์ด ์ง
- gc_probability / gc_divisor ์ ํ๋ฅ ๋ก gc_maxlifetime์์ ์ง์ ํ ์๊ฐ์ด ์ง๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์
- ์์์๋ gc_probability ๊ฐ 0์ผ๋ก ์ค์ ๋์ด ์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก๋ 1๋ก ์ค์
- (์ฆ, ์ธ์ ์ด ์์๋ ๋ 1/1000์ ํ๋ฅ ๋ก gc๊ฐ ์คํ๋๊ณ , ๋ชจ๋ ์ธ์ ์ ์กฐํ)
- ๋ง์ง๋ง ์์ฒญ์ผ๋ก๋ถํฐ gc_maxlifetime์ ์ค์ ๋ ์๊ฐ์ด ์ง๋ ์ธ์ ์ด ์๋ค๋ฉด ์ญ์
- ๊ธฐ๋ณธ๊ฐ์ 1440์ด (= 24๋ถ) : ์ด๋์ phpmyadmin์ด ๋ก๊ทธ์ธ ํ 1440์ด๊ฐ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ก๊ทธ์์ ๋๋ ๊ฒ
- session.gc์ ์คํ ๋ฐฉ์์ด ๋ชจ๋ ์ธ์
์ ์์ฑ์๊ฐ์ ์กฐํํ๋ค๋ณด๋, ์ธ์
์ด ๋ง์ด ์์ฑ๋์ด ์๋ ๊ฒฝ์ฐ, ์๋ฒ์ ๋ถ๋ด์ด ๋จ
- ๊ทธ๋์ gc_probability ์ ๊ฐ์ 0์ผ๋ก ์ค์ ํ์ฌ ์๋์ผ๋ก ์คํํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํจ
Reference - https://www.php.net/manual/en/function.session-gc.php
PHP: session_gc - Manual
www.php.net
8) ์ถ๊ฐ ๋ณด์ ์ค์
์ธ์ ์ ๋จ์ ์ฟ ํค๋ง ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋ค๋ ๋ฐ์ดํฐ ๋ณด์์ด ์ข์ ๋ฟ, ์ฟ ํค๋ฅผ ํจ๊ป ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ๋ณด์์ด ํ์
Reference - https://www.php.net/manual/en/session.security.ini.php
PHP: Securing Session INI Settings - Manual
Warning: Calling `ini_set('session.use_only_cookies', 1)` returns FALSE if `session_start()` has already been called.
www.php.net
JWT ๊ตฌํ
JWT๋ฅผ ์ด์ฉํ ๋ก๊ทธ์ธ ํ์ด์ง (๋ก๊ทธ์ธ ์ ์ง ๊ตฌํ)
๋ชจ์ ํดํน ์คํฐ๋ - 3์ฃผ์ฐจ ๊ณผ์ (3-2) JWT ๊ตฌํ(๋ก๊ทธ์ธ ์ ์ง)
ํ๊ธฐ
๊ธฐ์กด์ ์ธ์ (SESSION)์ ์ด์ฉํจ์ ์์ด, ์ ๋๋ก๋ ์ฌ์ฉ์ ํ์ง ๋ชปํ ์ ์ ๊นจ๋ฌ์
- ๊ณผ์ ๋ค์์ ์ฌ์ฉ์์ ์ธ์ ์ ์ญ์ ๊ฐ ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์์๋ ๋ฌธ์ ๋ค์ ํ์ธ
- ์ฟ ํค์ ์ธ์ ์ ๋ํ ์ดํด ๋ถ์กฑ ์ํ๋ก ์ฐ๊ณ ์์์์ ๊นจ๋ฌ์
- JWT ๊ตฌํ์ ์ํด ๋ฏธ๋ฆฌ ํ๋ฒ ์ ๋ฆฌํ๊ธธ ์ํ๋ค๋ ์๊ฐ์ด ๋ฌ
์ง๋ฌธ ํ์, ์์ ๋ฐ ๋ณด์์ ๋ํ ์ง์ ํ์