๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Network

์ฟ ํ‚ค ์„ธ์…˜ ํ† ํฐ์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ , ์ฟ ํ‚ค ์‚ฌ์šฉ ์‹œ์˜ XSS CSRF ์˜ˆ๋ฐฉ ์•Œ์•„๋ณด๊ธฐ

์ฟ ํ‚ค

์ฟ ํ‚ค๋Š” stateless ๋ฐฉ์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

โ–ถ ํŠน์ง•

- ์ฟ ํ‚ค๋Š” ๋ณด์•ˆ์ด ์ทจ์•ฝํ•˜๋‹ค

์ฟ ํ‚ค๋Š” F12 ์˜ Network ํƒญ์œผ๋กœ๋„ ์‰ฝ๊ฒŒ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•˜๊ณ , ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋งŒํผ ๋ณด์•ˆ์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ์ฟ ํ‚ค ๋‹จ๋…์œผ๋กœ ์“ฐ์ง€ ์•Š๊ณ  ์ฟ ํ‚ค์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์œ„ํ•ด ์„ธ์…˜/JWT์™€ ํ•จ๊ป˜ ์“ฐ์ž…๋‹ˆ๋‹ค.

 

- ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ด๋ฅผ stateless ๋ฐฉ์‹์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.

 

-๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋œ ์ฟ ํ‚ค๋Š” ๋ชจ๋“  ์š”์ฒญ์— ํฌํ•จ๋˜์–ด ์„œ๋ฒ„์— ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” ์ฟ ํ‚ค๊ฐ€ ํ•„์š”์—†๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋„ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ถ”๊ฐ€๋กœ ์œ ๋ฐœํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋งŒ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํŠน์ง•์„ ์•…์šฉํ•œ CSRF ๊ณต๊ฒฉ์— ๋…ธ์ถœ๋˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์„ธ์…˜

์„ธ์…˜์€ stateful ๋ฐฉ์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

โ–ถ ํŠน์ง•

์„œ๋ฒ„์ธก์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ด๋ฅผ stateful ๋ฐฉ์‹์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.

์žฅ์ ์œผ๋กœ๋Š” ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ์„œ๋ฒ„๊ฐ€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ๋‹จ์ ์œผ๋กœ๋Š” ์„ธ์…˜์ด ๋งŽ์•„์งˆ ๊ฒฝ์šฐ, ์„œ๋ฒ„ ๋ถ€ํ•˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋˜, ์„œ๋ฒ„๊ฐ€ ํ™•์žฅ๋  ๊ฒฝ์šฐ ๊ฐ ์„œ๋ฒ„์— ์„ธ์…˜ ์ •๋ณด๋ฅผ ๋™๊ธฐํ™” ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

ํ† ํฐ

ํ† ํฐ์€ stateless ๋ฐฉ์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

โ–ถ ํŠน์ง•

- ํ† ํฐ์—๋Š” ์„œ๋ฒ„๊ฐ€ ๊ฐœ์ธํ‚ค๋กœ ๋งŒ๋“  ์„œ๋ช…์ด ๋‹ด๊ฒจ ์žˆ์œผ๋ฉฐ, ์„œ๋ฒ„๋Š” ํ† ํฐ์˜ ์„œ๋ช…์„ ๊ณต๊ฐœํ‚ค๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- ํ† ํฐ์€ stateless ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์„œ๋ฒ„๊ฐ€ ํ† ํฐ์„ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ๋ถ€ํ•˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ณ , ์„œ๋ฒ„ ํ™•์žฅ ์‹œ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ์ œ์–ดํ•  ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํ† ํฐ์ด ํƒˆ์ทจ๋˜์–ด ๋น„์ •์ƒ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋”๋ผ๋„ ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ ์‹œํ‚ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹จ 1๊ฐœ์˜ ๊ธฐ๊ธฐ์—์„œ๋งŒ ๋กœ๊ทธ์ธ์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์€ ์„œ๋น„์Šค์ผ ๊ฒฝ์šฐ, ํ† ํฐ์ด ์•„๋‹Œ ์„ธ์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

JWT

JWT ๋Š” ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„, ์„œ๋น„์Šค-์„œ๋น„์Šค ๊ฐ„ ์ธ๊ฐ€๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ† ํฐ์ž…๋‹ˆ๋‹ค.

 

โ–ถ ๊ตฌ์กฐ

- ๋ฌธ์ž์—ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— URL, HTTP ํ—ค๋” ๋“ฑ ์–ด๋””์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- JWT๋Š” Header.Payload.Signature(ํ—ค๋”.ํŽ˜์ด๋กœ๋“œ.์„œ๋ช… ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ์ (.)์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค)).

 

1. Header(ํ—ค๋”)

ํ—ค๋”๋Š” JWT๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

{
    "alg": "ES256",
    "kid": "Key ID"
}

alg ๋Š” ์„œ๋ช… ์‹œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜, kid ๋Š” ์„œ๋ช…์ด ์‚ฌ์šฉํ•˜๋Š” ํ‚ค(Public/Private Key) ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค.

 

ํ•ด๋‹น JSON ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค๊ณ  UTF-8 ๊ณผ Base64 URL-Safe ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ—ค๋”๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฝ”๋”ฉ ๊ณผ์ • -> Base64URLSafe(UTF-8('{"alg": "ES256","kid": "Key ID"}')) 
๊ฒฐ๊ณผ -> eyJhbGciOiJFUzI1NiIsImtpZCI6IktleSBJRCJ9

 

* Base64 URL-Safe : ์ธ์ฝ”๋”ฉ ๊ฒฐ๊ณผ๋ฅผ URL๊ณผ ํŒŒ์ผ ๊ฒฝ๋กœ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋์Šต๋‹ˆ๋‹ค.

+ ๊ธฐํ˜ธ๋ฅผ -(ํ•˜์ดํ”ˆ)์œผ๋กœ ๋Œ€์ฒด

/ ๊ธฐํ˜ธ๋ฅผ _(์–ธ๋”์Šค์ฝ”์–ด)๋กœ ๋Œ€์ฒด

= ๊ธฐํ˜ธ๋Š” ํ•„์š”์— ๋”ฐ๋ผ ์ œ๊ฑฐ

 

2. Payload(ํŽ˜์ด๋กœ๋“œ)

ํŽ˜์ด๋กœ๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ์ฃผ๊ณ  ๋ฐ›๊ธฐ๋กœ ํ•œ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

{
    "iss": "jinho.shin",
    "iat": "1586364327"
}
์ธ์ฝ”๋”ฉ ๊ณผ์ • -> Base64URLSafe('{"iss": "jinho.shin","iat": "1586364327"}') 
๊ฒฐ๊ณผ -> eyJpYXQiOjE1ODYzNjQzMjcsImlzcyI6ImppbmhvLnNoaW4ifQ

 

3. Signature(์„œ๋ช…)

์ (.)์„ ๊ตฌ๋ถ„์ž๋กœํ•ด์„œ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ํ•ฉ์นœ ๋ฌธ์ž์—ด์„ ์„œ๋ช…ํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.

์„œ๋ช…์€ ํ—ค๋”์˜ alg ์— ์ •์˜๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„๋ฐ€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ์„ฑํ•˜๊ณ  ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฝ”๋”ฉ ๊ณผ์ • -> Base64URLSafe(Sign('ES256', '${PRIVATE_KEY}',
'eyJhbGciOiJFUzI1NiIsImtpZCI6IktleSBJRCJ9.eyJpYXQiOjE1ODYzNjQzMjcsImlzcyI6ImppbmhvLnNoaW4ifQ')))

๊ฒฐ๊ณผ -> MEQCIBSOVBBsCeZ_8vHulOvspJVFU3GADhyCHyzMiBFVyS3qAiB7Tm_MEXi2kLusOBpanIrcs2NVq24uuVDgH71M_fIQGg

 

* ์„œ๋ช… vs ์•”ํ˜ธํ™”

์„œ๋ช…์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์ธํ•˜๋Š” ๋ฌด๊ฒฐ์„ฑ์„ ์ฆ๋ช…ํ•˜์ง€๋งŒ ์•”ํ˜ธํ™”๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜์—ฌ ํ—ˆ๊ฐ€๋œ ์‚ฌ๋žŒ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ํ† ํฐ์€ ํƒˆ์ทจ ๋‹นํ•ด์„œ ํ† ํฐ์˜ ๊ฐ’์„ ๋ˆ„๊ตฌ๋‚˜ ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•”ํ˜ธํ™”๋ผ๊ณ  ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ๋ถ€์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

 

XSS ์™€ CSRF

ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ฟ ํ‚ค/์„ธ์…˜/ํ† ํฐ์˜ ๋ณด์•ˆ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๋ณด์•ˆํ•  ์ง€๋ฅผ ์•Œ๋ ค๋ฉด XSS์™€ CSRF ์— ๋Œ€ํ•ด ๋จผ์ € ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

โ–ถ XSS ( Cross-Site Scripting )

XSS๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž(์ผ๋ฐ˜ ๊ณ ๊ฐ)์˜ ๋ธŒ๋ผ์šฐ์ €์— ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์„ธ์…˜์„ ๊ฐ€๋กœ์ฑ„๊ฑฐ๋‚˜, ์›น์‚ฌ์ดํŠธ ๋ณ€์กฐ, ์•…์˜์  ์ฝ˜ํ…์ธ  ์‚ฝ์ž…, ํ”ผ์‹ฑ ๊ณต๊ฒฉ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

 

์ถ”๊ฐ€๋กœ, XSS ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” <, >, ', " ์™€ ๊ฐ™์€ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ &lt; , &gt; ๋“ฑ์˜ HTML entity ๋กœ ์น˜ํ™˜ํ•˜์—ฌ ์ž…๋ ฅํ•˜๋„๋ก ํ•˜๊ณ , HTMLํƒœ๊ทธ ์‚ฌ์šฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์‚ฌ์šฉ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜์—ฌ ํ•ด๋‹น ํƒœ๊ทธ๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โ–ถ CSRF ( Cross-Site Request Forgery )

CSRF( cross site request forgery attack ) ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆํ•œ ์„ธ์…˜์—์„œ ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ ์ธ ์š”์ฒญ๊ณผ ๋น„์ •์ƒ์ ์ธ ์š”์ฒญ์„ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์ ์„ ์•…์šฉํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์š”์ฒญ์ด ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์ „์†กํ•œ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 

 

์ฆ‰, XSS ๋Š” ์‚ฌ์šฉ์ž PC์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•˜์ง€๋งŒ, CSRF๋Š” ์š”์ฒญ์„ ์œ„์กฐํ•จ์œผ๋กœ์จ ์‚ฌ์šฉ์ž ๋ชฐ๋ž˜ ์†ก๊ธˆ๊ณผ ์ œํ’ˆ ๊ตฌ์ž…๋“ฑ ํŠน์ • ํ–‰์œ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

์ฟ ํ‚ค ์‚ฌ์šฉ ์‹œ ๋ณด์•ˆ ๋ฐฉ๋ฒ•

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜๊ณผ ํ† ํฐ์ด ๋กœ์ปฌ/์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ์ด ๋  ๊ฒฝ์šฐ, XSS ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กœ์šธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋ธŒ๋ผ์šฐ์ €์—์„œ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ธํ•ด ํƒˆ์ทจ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ)

 

๊ทธ๋ž˜์„œ, ์ฟ ํ‚ค๋Š” ๋ณด์•ˆ๊ด€๋ จ ์†์„ฑ๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

- HttpOnly 

HttpOnly ์†์„ฑ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ฟ ํ‚ค์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

 

- Secure

์ฟ ํ‚ค๋Š” http, https ๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์ „์†ก๋˜๊ธฐ ๋•Œ๋ฌธ์— https ์ธ ๊ฒฝ์šฐ๋งŒ ์ „์†ก์ด ๋˜๊ฒŒ ํ•˜๋Š” Secure ์†์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

- SameSite=Strict

๋ชจ๋“  ์š”์ฒญ์— ์ฟ ํ‚ค๋ฅผ ๋„ฃ์–ด์„œ ๋ณด๋‚ด๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ํŠน์„ฑ์„ ์•…์šฉํ•œ CSRF ๋ฅผ ๋ง‰๊ธฐ์œ„ํ•ด ์ฟ ํ‚ค๋Š” SameSite=Strict ์†์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

SameSite=Strict ์†์„ฑ์€ ๋ธŒ๋ผ์šฐ์ €๋กœ ํ•˜์—ฌ๊ธˆ ์š”์ฒญ ๋„๋ฉ”์ธ๊ณผ ์ฟ ํ‚ค์— ์„ค์ •๋œ ๋„๋ฉ”์ธ์ด ๊ฐ™์€ ๊ฒฝ์šฐ์—๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ, ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์„ธ์…˜๊ณผ ํ† ํฐ์„ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ์„ ํ•˜๋ฉด CSRF ๋กœ ๋ถ€ํ„ฐ ์กฐ๊ธˆ์€ ์ž์œ ๋กœ์›Œ์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ XSS ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กญ์ง€ ๋ชปํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ, ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” HttpOnly + Secure + SameSite=Strict ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ XSS ์™€ CSRF ๊ณต๊ฒฉ์œผ๋กœ ๋ถ€ํ„ฐ ์˜ˆ๋ฐฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ์™„๋ฒฝํžˆ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

 

ํด๋ผ์ด์–ธํŠธ๋Š” XSS ๊ณต๊ฒฉ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์Šคํฌ๋ฆฝํŠธ์— ์‚ฌ์šฉ๋˜๋Š” <, >, ‘, “ ๋“ฑ์˜ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ &lt; , &gt; ๋“ฑ์˜ HTML entity๋กœ ์น˜ํ™˜ํ•˜์—ฌ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ HTML ํƒœ๊ทธ ์‚ฌ์šฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์‚ฌ์šฉํ•œ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜์—ฌ ํ•ด๋‹น ํƒœ๊ทธ๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์„œ๋ฒ„๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ CSRF Token, Synchroniza token pattern, double-submit cookie, client-side secure ๋“ฑ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋‚ด์šฉ๋“ค์€ Wikipedia ์˜ CSRF ์—์„œ ๊ฐ€์ ธ์™”์œผ๋ฉฐ, ๋ณด์•ˆ๋ณด๋‹ค๋Š” ๊ฐœ๋ฐœ์— ํฅ๋ฏธ๊ฐ€ ์žˆ๋Š” ์ €๋กœ์จ๋Š” ์—ฌ๊ธฐ์„œ ๊ธ€์„ ๋งˆ๋ฌด๋ฆฌ ํ• ๊นŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ธ€ ์ฝ์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

์ถœ์ฒ˜

- MDN

Using HTTP cookies

 

- StackOverflow

Does this JWT implementation prevent XSS and CSRF attacks while still giving me access to payloads?

 

- StackExchange: Security 

Do I need CSRF token if I'm using Bearer JWT?

Should I use CSRF protection on Rest API endpoints?

Securely using JWTs with CSRF protection and refresh tokens

 

- blog

Store JWT in cookie or localstorage ?

Do SameSite Cookies Solve CSRF?

 

- ๊น€์˜ํ•œ๋‹˜์˜ HTTP ๊ฐ•์˜

- JSCODE ์˜ JWT