์จ๋ผ์ธ ๊ฐ์
>PHP - ์ค๊ธ
๐ PHP ์ค๊ธ - 2์ฃผ์ฐจ: ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ ์์คํ  ๊ตฌํ - 04 ๋ก๊ทธ์์ ๋ฐ ์ธ์  ๊ด๋ฆฌ
				์ฃผ์ ํ๋ก๊ทธ๋จ ์คํ
- ํ์ : 10.0
 - ๋ผ์ด์ ์ค: free
 - ์ด์์ฒด์ :
 - ํ์ผ ํฌ๊ธฐ: 0
 
ํผ๋๋ฐฑ ๋ฐ ๋ค์ด๋ก๋
- ์ฌ์ฉ์ ํ์ : 10.0
 - ๋ค์ด๋ก๋ ์: 1
 - ์กฐํ์: 52
 
์ ์กฐ์ฌ ๋ฐ ๋ฑ๋ก ์ ๋ณด
- ์ ์์ฌ: LUZENSOFT
 - ๋ฑ๋ก์ผ: 2025-07-19 13:13:37
 
- ์ค๋ช
๐ 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 #ํ์๊ฐ์ ๋ฐ #๋ก๊ทธ์ธ ์์คํ ์ #์ฌ์ฉ์ #์ธ์ฆ๊ณผ #์ธ์  #๊ด๋ฆฌ์ ์์ด ๋์ฑ #๊ฒฌ๊ณ ํ๊ณ #์์ ํ ๊ธฐ๋ฐ์ ๊ฐ์ถ๊ฒ ๋์์ต๋๋ค.