
PHP ์จ๋ผ์ธ ๊ฐ์
>PHP - ์ค๊ธ
๐ PHP ์ค๊ธ - 2์ฃผ์ฐจ: ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ ์์คํ ๊ตฌํ - 04 ๋ก๊ทธ์์ ๋ฐ ์ธ์ ๊ด๋ฆฌ
![]() |
ํ์ | 10.0 | ๋ผ์ด์ผ์ค | free |
---|---|---|---|---|
์ฌ์ฉ์ํ์ | 10.0 | ์ด์์ฒด์ | ||
๋ค์ด๋ก๋ | 1 | ํ์ผํฌ๊ธฐ | 0 | |
์ ์์ฌ | LUZENSOFT | ๋ฑ๋ก์ผ | 2025-07-19 13:13:37 | |
์กฐํ์ | 24 |
๐ PHP ์ค๊ธ - 2์ฃผ์ฐจ: ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ ์์คํ ๊ตฌํ - 04 ๋ก๊ทธ์์ ๋ฐ ์ธ์ ๊ด๋ฆฌ
์๋ ํ์ธ์! #PHP ์ค๊ธ ๊ณผ์ 2์ฃผ์ฐจ, #ํ์๊ฐ์ ๋ฐ #๋ก๊ทธ์ธ ์์คํ ๊ตฌํ์ ๋ค ๋ฒ์งธ ์๊ฐ์ ๋๋ค. ์ง๋ ์๊ฐ์๋ #์ธ์ ๊ธฐ๋ฐ์ #๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ์๋ฒฝํ๊ฒ ๊ตฌํํ์ฌ #์ฌ์ฉ์ ์ธ์ฆ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์์ต๋๋ค. ์ด์ ์ฌ์ฉ์๊ฐ #๋ก๊ทธ์ธ ์ํ๋ฅผ ์์ ํ๊ฒ ์ข ๋ฃํ๊ณ , #์ธ์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ์ฐจ๋ก์ ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ #๋ก๊ทธ์์ ๊ธฐ๋ฅ ๊ตฌํ์ ์ค์ฌ์ผ๋ก #์ธ์ #๊ด๋ฆฌ์ ์ค์์ฑ์ ์์ธํ ๋ค๋ฃฐ ๊ฒ์ ๋๋ค. ๋จ์ํ #์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ๋์ด, #๋ณด์์ ๊ฐํํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๋ #๋ก๊ทธ์์ #๋ก์ง๋ถํฐ, #์ธ์ ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ดํดํ๊ณ ์ ์ ํ #๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ๊น์ง, ๋จ๊ณ๋ณ๋ก ์์ธํ ์ค๋ช ํด ๋๋ฆด๊ฒ์.
1. ์ธ์ ์ ์ดํด์ ์ค์์ฑ
#์ธ์ (Session)์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ #์ฌ์ฉ์์ #์ํ ์ ๋ณด๋ฅผ #์๋ฒ์ ์ ์งํ๊ธฐ ์ํ ์ค์ํ ๊ธฐ์ ์ ๋๋ค. #HTTP๋ ๊ธฐ๋ณธ์ ์ผ๋ก #๋ฌด์ํ(stateless) ํ๋กํ ์ฝ์ด๊ธฐ ๋๋ฌธ์, ์์ฒญ๊ณผ ์๋ต์ด ๋๋๋ฉด #์ฌ์ฉ์์ ๋ํ ์ด๋ค ์ ๋ณด๋ ๊ธฐ์ตํ์ง ๋ชปํด์. ์ด๋ฌํ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ #๋ก๊ทธ์ธ ์ํ ์ ์ง, ์ฅ๋ฐ๊ตฌ๋ ์ ๋ณด, ์ฌ์ฉ์ ์ค์ ๋ฑ ํน์ #์ฌ์ฉ์์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ #์๋ฒ์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ฐ๋ก #์ธ์ ์ ๋๋ค.
์ธ์ ์ด ์ค์ํ ์ด์
#์ฌ์ฉ์ #์ธ์ฆ ์ ์ง: #๋ก๊ทธ์ธ ์ฑ๊ณต ํ #์ฌ์ฉ์์ #์ธ์ฆ ์ ๋ณด๋ฅผ #์ธ์ ์ ์ ์ฅํ์ฌ, ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์ด๋ํด๋ #๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์งํ ์ ์๊ฒ ํฉ๋๋ค.
#๊ฐ์ธํ๋ #์๋น์ค ์ ๊ณต: #์ธ์ ์ ์ ์ฅ๋ #์ฌ์ฉ์ #ID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ธํ๋ ์ฝํ ์ธ ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์์ด์.
#๋ณด์: #์ฟ ํค์ ๋ฌ๋ฆฌ #์ธ์ ๋ฐ์ดํฐ๋ #์๋ฒ์ ์ ์ฅ๋๋ฏ๋ก, ํด๋ผ์ด์ธํธ ์ธก์์ ์์๋ก ์กฐ์ํ๊ธฐ ์ด๋ ต์ต๋๋ค. #์ธ์ #ID๋ง ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๊ณ , ์ค์ ๋ฏผ๊ฐํ ์ ๋ณด๋ #์๋ฒ์์ ์์ ํ๊ฒ ๊ด๋ฆฌํฉ๋๋ค.
2. ๋ก๊ทธ์์ ์ฒ๋ฆฌ ๋ก์ง (logout.php) ๊ตฌํ
#๋ก๊ทธ์์ ๊ธฐ๋ฅ์ ํ์ฌ #์ฌ์ฉ์์ #์ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ํ๊ดดํ์ฌ #๋ก๊ทธ์ธ ์ํ๋ฅผ ํด์ ํ๋ ์ญํ ์ ํฉ๋๋ค. ์ด๋ #๋ณด์์ ๋งค์ฐ ์ค์ํ๋ฉฐ, ์ฌ์ฉ์์ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ์ ์ง๊ฒฐ๋ฉ๋๋ค.
logout.php
PHP
<?php
// ์ธ์
์์ (์ธ์
๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ํด ํ์)
session_start();
// ๋ชจ๋ ์ธ์
๋ณ์ ์ ๊ฑฐ
$_SESSION = array();
// ์ธ์
์ฟ ํค ์ญ์ (์ธ์
ID๋ฅผ ์ ์ฅํ๋ ์ฟ ํค)
// ini_get("session.use_cookies") : php.ini ์ค์ ์์ ์ธ์
์ด ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋์ง ํ์ธ
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();
// ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ
header("Location: login.php");
exit();
?>
์ฝ๋ ํด์ค
session_start();
: #์ธ์ #๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ํด ๋ชจ๋ #PHP ์ฝ๋์ ๊ฐ์ฅ ์ฒซ ์ค์ ๋ฐ๋์ ํธ์ถํด์ผ ํฉ๋๋ค.$_SESSION = array();
: ํ์ฌ #์ธ์ ์ ์ ์ฅ๋ ๋ชจ๋ #์ธ์ #๋ณ์๋ฅผ ์ด๊ธฐํ(์ญ์ )ํฉ๋๋ค. ์ด๋ก์จ #์ฌ์ฉ์ #ID๋ #์ด๋ฆ ๊ฐ์ ์ ๋ณด๊ฐ #์ธ์ ์์ ์ ๊ฑฐ๋ฉ๋๋ค.#์ธ์ #์ฟ ํค #์ญ์ :
ini_get("session.use_cookies")
: #PHP ์ค์ ์์ #์ธ์ ๊ด๋ฆฌ์ #์ฟ ํค๋ฅผ ์ฌ์ฉํ๋์ง ํ์ธํฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ #์ฟ ํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.session_get_cookie_params()
: ํ์ฌ #์ธ์ #์ฟ ํค์ ์ค์ (๊ฒฝ๋ก, ๋๋ฉ์ธ, ๋ณด์ ์ฌ๋ถ ๋ฑ)์ ๊ฐ์ ธ์ต๋๋ค.setcookie()
ํจ์์ ํจ๊ป ์ฌ์ฉํ์ฌ #์ธ์ #์ฟ ํค๋ฅผ ์ ํํ ์ญ์ ํ๊ธฐ ์ํจ์ ๋๋ค.setcookie(session_name(), '', time() - 42000, ...)
:session_name()
์ ํ์ฌ #์ธ์ ์ ์ด๋ฆ์ ๋ฐํํฉ๋๋ค (๊ธฐ๋ณธ๊ฐ: PHPSESSID). ์ด ํจ์๋ฅผ ์ฌ์ฉํ์ฌ #์ธ์ #์ฟ ํค์ ๊ฐ์ ๋น์ฐ๊ณ , ๋ง๋ฃ ์๊ฐ์ ๊ณผ๊ฑฐ(ํ์ฌ ์๊ฐ - 42000์ด)๋ก ์ค์ ํ์ฌ #๋ธ๋ผ์ฐ์ ์์ ํด๋น #์ธ์ #์ฟ ํค๋ฅผ ์ฆ์ ์ญ์ ํ๋๋ก ํฉ๋๋ค.secure
์httponly
๋ #์ฟ ํค์ #๋ณด์ ์์ฑ์ ๊ทธ๋๋ก ์ ์งํ๊ธฐ ์ํด ํ์ํฉ๋๋ค.
session_destroy();
: #์๋ฒ์ ์ ์ฅ๋ #์ธ์ #๋ฐ์ดํฐ ํ์ผ์ ์์ ํ ์ญ์ ํฉ๋๋ค. ์ด ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์$_SESSION = array();
๋ก #์ธ์ #๋ณ์๋ฅผ ๋น์์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.header("Location: login.php"); exit();
: ๋ชจ๋ #๋ก๊ทธ์์ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด #์ฌ์ฉ์๋ฅผ #๋ก๊ทธ์ธ ํ์ด์ง๋ก #๋ฆฌ๋ค์ด๋ ํธํฉ๋๋ค.exit();
๋ #๋ฆฌ๋ค์ด๋ ํธ ํ ์คํฌ๋ฆฝํธ ์คํ์ ์ฆ์ ์ข ๋ฃํ์ฌ ๋ถํ์ํ ์ฝ๋ ์คํ์ด๋ ์ ์ฌ์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
3. ์ธ์ ๋ณด์ ๋ฐ ๊ด๋ฆฌ ํ
#์ธ์ ์ #์ฌ์ฉ์ ์ธ์ฆ์ ํต์ฌ์ด๋ฏ๋ก, #๋ณด์์ ๊ฐ๋ณํ ์ ๊ฒฝ ์จ์ผ ํฉ๋๋ค.
3.1 ์ธ์ ํ์ด์ฌํน ๋ฐฉ์ง
#์ธ์ #ํ์ด์ฌํน(Session Hijacking)์ ๊ณต๊ฒฉ์๊ฐ #์ฌ์ฉ์์ #์ธ์ #ID๋ฅผ ๊ฐ๋ก์ฑ์ด #์ฌ์ฉ์์ธ ์ฒ ๊ฐ์ฅํ๋ ๊ณต๊ฒฉ์ ๋๋ค.
HTTPS ์ฌ์ฉ: ๋ชจ๋ ์น ํ์ด์ง์์ #HTTPS(SSL/TLS)๋ฅผ ์ฌ์ฉํ์ฌ #ํต์ ์ #์ํธํํด์ผ ํฉ๋๋ค. ์ด๋ #์ธ์ #ID๊ฐ ๋คํธ์ํฌ์์์ ๊ฐ๋ก์ฑ์ง๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
session.cookie_httponly
์ค์ :php.ini
๋๋session_set_cookie_params()
ํจ์๋ฅผ ํตํดhttponly
์์ฑ์true
๋ก ์ค์ ํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด #JavaScript๋ก #์ธ์ #์ฟ ํค์ ์ ๊ทผํ๋ ๊ฒ์ ๋ง์ #XSS(Cross-Site Scripting) ๊ณต๊ฒฉ์ ํตํ #์ธ์ #ํ์ทจ๋ฅผ ์ด๋ ต๊ฒ ํฉ๋๋ค.PHP
// ์ฝ๋ ์์ ๋ถ๋ถ์ ์ถ๊ฐ (session_start() ์ ์) ini_set('session.cookie_httponly', 1); session_start();
session.cookie_secure
์ค์ : #HTTPS ํ๊ฒฝ์์๋ง #์ธ์ #์ฟ ํค๋ฅผ ์ ์กํ๋๋กsecure
์์ฑ์true
๋ก ์ค์ ํ์ธ์.PHP
// ์ฝ๋ ์์ ๋ถ๋ถ์ ์ถ๊ฐ (session_start() ์ ์) ini_set('session.cookie_secure', 1); session_start();
IP ์ฃผ์ ๊ฒ์ฌ (์ ํ ์ฌํญ): #์ธ์ #ID์ ํจ๊ป #์ฌ์ฉ์์ #IP ์ฃผ์๋ฅผ #์ธ์ ์ ์ ์ฅํ๊ณ , ๊ฐ ์์ฒญ๋ง๋ค #IP ์ฃผ์๊ฐ ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค. ํ์ง๋ง ์ด๋ #๋ชจ๋ฐ์ผ ํ๊ฒฝ(LTE/5G)์ฒ๋ผ #IP๊ฐ ์์ฃผ ๋ฐ๋๋ ํ๊ฒฝ์์๋ #์ฌ์ฉ์ ๊ฒฝํ์ ์ ํดํ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ ์ ์ฉํด์ผ ํฉ๋๋ค.
์ธ์ ID ์ฌ๋ฐ๊ธ (Session Regeneration): #๋ก๊ทธ์ธ ์ฑ๊ณต ์ ๋๋ ์ค์ํ ์์ (๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ๋ฑ) ํ #์ธ์ #ID๋ฅผ ์๋ก ๋ฐ๊ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
PHP
session_regenerate_id(true); // ์๋ก์ด ์ธ์ ID ์์ฑ ๋ฐ ์ด์ ์ธ์ ํ๊ดด
3.2 ์ธ์ ํ์์์ ์ค์
#์ธ์ ์ด ๋๋ฌด ์ค๋ซ๋์ ์ ์ง๋๋ฉด #๋ณด์์ ์ทจ์ฝํด์ง ์ ์์ต๋๋ค.
session.gc_maxlifetime
์ค์ :php.ini
์์ #์ธ์ ์ ์ต๋ ์ ์ง ์๊ฐ์ ์ค์ ํฉ๋๋ค. (๊ธฐ๋ณธ๊ฐ: 1440์ด = 24๋ถ)Ini, TOML
; php.ini ํ์ผ ๋ด์์ session.gc_maxlifetime = 1800 ; 30๋ถ (์ด ๋จ์)
session.cookie_lifetime
์ค์ : #์ธ์ #์ฟ ํค์ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํฉ๋๋ค. 0์ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ์ผ๋ฉด ๋ง๋ฃ๋จ์ ์๋ฏธํฉ๋๋ค.Ini, TOML
; php.ini ํ์ผ ๋ด์์ session.cookie_lifetime = 0 ; ๋ธ๋ผ์ฐ์ ์ข ๋ฃ ์ ๋ง๋ฃ
๊ฒฐ๋ก
์ด๋ฒ ํฌ์คํ ์์๋ #์ธ์ ๊ธฐ๋ฐ #์ธ์ฆ ์์คํ ์์ #๋ก๊ทธ์์ ๊ธฐ๋ฅ๊ณผ #์ธ์ #๊ด๋ฆฌ์ ์ค์์ฑ, ๊ทธ๋ฆฌ๊ณ #๋ณด์์ ๊ฐํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์์ต๋๋ค. #๋ก๊ทธ์์์ ๋จ์ํ #์ฌ์ฉ์๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒ์ด ์๋๋ผ, #์ธ์ #๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ๋ฆฌํ๊ณ #๋ณด์ ์ํ์ผ๋ก๋ถํฐ #์ฌ์ฉ์์ #์์คํ ์ ๋ณดํธํ๋ ํ์์ ์ธ ๊ณผ์ ์ ๋๋ค.
์ด์ ์ฌ๋ฌ๋ถ์ #PHP #ํ์๊ฐ์ ๋ฐ #๋ก๊ทธ์ธ ์์คํ ์ #์ฌ์ฉ์ #์ธ์ฆ๊ณผ #์ธ์ #๊ด๋ฆฌ์ ์์ด ๋์ฑ #๊ฒฌ๊ณ ํ๊ณ #์์ ํ ๊ธฐ๋ฐ์ ๊ฐ์ถ๊ฒ ๋์์ต๋๋ค.