1๋
์ ์ ํ์ฐธ ์กธ์
ํ๋ก์ ํธ, ์ฐฝ์
๋์๋ฆฌ ํ๋์ ํ๋ฉด์ ์ธ์
๊ธฐ๋ฐ ๋ก๊ทธ์ธ, JWT ๊ธฐ๋ฐ ๋ก๊ทธ์ธ, Access Token๊ณผ Refresh Token์ ๊ฐ๋
์ ๊ณต๋ถํ์๋ค. ์ค๋ ์์จ ํ๋ก์ ํธ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๋งก์ ์ค๋๋ง์ ๋ค์ ์๊ฐ๋์ ์ ๋ฆฌํด๋ณธ๋คใ
ใ
์ฐ์ , ์น์ ๋ณธ์ง์ ์ผ๋ก ๋ฌด์ํ(stateless)๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ๋ก๊ทธ์ธ ๊ณผ์ ์ด ํ์ํ ๊ฒ์ด๋ค. HTTP ํ๋กํ ์ฝ ์์ฒด๊ฐ ๋ฌด์ํ(stateless)ํ๊ธฐ ๋๋ฌธ์ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ๊ฐ ์์ฒญ์ ๋
๋ฆฝ๋ ์์ฒญ์ผ๋ก ์ฒ๋ฆฌํ๋ค. ์ฆ, ์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ํ์ธํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ฉฐ ์ด๋ฌํ ๋ฐฉ๋ฒ๋ค์ด ์ธ์
๊ธฐ๋ฐ ๋ก๊ทธ์ธ, JWT ๊ธฐ๋ฐ ๋ก๊ทธ์ธ์ธ ๊ฒ์ด๋ค.
์ธ์
๊ธฐ๋ฐ ๋ก๊ทธ์ธ ๋ฐฉ์์ ํด๋ผ์ด์ธํธ์๋ ์ธ์
ID๋ง ์ ์ฅํ๊ณ ์๋ฒ์ ์ค์ํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. ์ธ์
ID ์์ฒด์๋ ์ค์ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ๋ณด์์ฑ์ ์ธก๋ฉด์์๋ ๋น๊ต์ ์์ ํ๋ค๊ณ ํ ์ ์๋ค. ํ์ง๋ง ์ฌ์ฉ์๊ฐ ๋ง์์ง์๋ก ์๋ฒ์ ์ ์ฅํ ๋ฐ์ดํฐ๊ฐ ์ปค์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
JWT ๊ธฐ๋ฐ ๋ก๊ทธ์ธ ๋ฐฉ์์ ํด๋ผ์ด์ธํธ ์ธก์์ Access Token๊ณผ Refresh Token์ ๋ค๊ณ ์๋๋ค. ์๋ฒ๋ Access Token์ ๊ฐ์ ์ ์ฅํ์ง ์์ผ๋ฉฐ ์๋ช
์ ๊ฒ์ฆํ์ฌ ์ ํจํ์ง ํ์ธํ๋ค. ๋ฐ๋ผ์ ์ค์ํ ๋ด์ฉ์ ํฌํจํ Access Token์ด ํ์ทจ๋๋ฉด ์ํ์ด ํฌ๋ฏ๋ก Access Token์ ์ ํจ ๊ธฐ๊ฐ์ ์งง๊ฒ ์ค์ ํ๊ณ ํ์ ์ Refresh Token์ ํตํด ์ฌ๋ฐ๊ธ ๋ฐ๋ ์ ๋ต์ ์ฌ์ฉํ๋ค. ํ์ง๋ง Refresh Token ๋ํ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅ๋๋ฏ๋ก ํ์ทจ๋ ์ํ์ด ์์ผ๋ฉฐ, Access Token๊ณผ Refresh Token ๋ชจ๋ ์ฌ์ฉ์์ ์ธ์ฆ ์ ๋ณด์ ๊ด๋ จ๋ ์ค์ํ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํ์ทจ๋์ง ์๋๋ก ๋ณด์์ ์ ๊ฒฝ์ฐ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ธ์ ๊ธฐ๋ฐ ๋ก๊ทธ์ธ | ํ ํฐ ๊ธฐ๋ฐ ๋ก๊ทธ์ธ | |
๋ณด์์ฑ | ์๋ฒ์ ์ค์ํ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ฏ๋ก ์๋์ ์ผ๋ก ์์ ํ๋ค. | ํด๋ผ์ด์ธํธ์ ์ค์ํ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ฏ๋ก ๋ณด์์ ์ ๊ฒฝ์จ์ผ ํ๋ค. |
ํ์ฅ์ฑ | ๋น๊ต์ ์ ํ์ ์ด๋ค | ๋น๊ต์ ๋๋ค |
์ํ ์ ์ง | ์๋ฒ๊ฐ ์ํ ๊ด๋ฆฌ | ํด๋ผ์ด์ธํธ๊ฐ ์ํ ๊ด๋ฆฌ |
๋ก๊ทธ์์ ๊ด๋ฆฌ | ์๋ฒ์์ ์ธ์ ๋ง๋ฃ ๊ฐ๋ฅ | ์ฆ๊ฐ์ ๋ฌดํจํ ์ด๋ ค์ |
๊ทธ๋ ๋ค๋ฉด Access Token๊ณผ Refresh Token์ ์์ ํ๊ฒ ๋ณด๊ดํ๊ธฐ ์ํด์๋ ํด๋ผ์ด์ธํธ์ ์ด๋์ ์ ์ฅํ๋ฉด ์ข์๊น?
์ค๋ ์ด๋ฌํ ์๊ฐ์ ํ๋ค.
1. Cookie๊ฐ localStorage๋ณด๋ค๋ ์์ ํ๋ค.
2. ๊ทธ๋ ๋ค๋ฉด Access Token๊ณผ Refresh Token์ ๋ชจ๋ Cookie์ ์ ์ฅํด๋ ๋๋๊ฐ?
์ฟ ํค๊ฐ ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ณด๋ค ์์ ํ ์ด์ ๋ ๋ค์ 3๊ฐ์ง ์ด์ ์์ XSS, CSRF ๊ณต๊ฒฉ์ ๋ ์ ๋์ํ ์ ์์ด์์ด๋ค.
- HttpOnly ์์ฑ: ์ฟ ํค์ HttpOnly ์์ฑ์ ์ ์ฉํ๋ฉฐ JavaScript๋ก ์ ๊ทผํ ์ ์๊ฒ ๋์ด, XSS ๊ณต๊ฒฉ์ ๋ ์ ๋์ํ ์ ์๋ค. ์ฆ, ๊ณต๊ฒฉ์ ๋ฐ๋๋ผ๋ ์ฟ ํค๋ฅผ ํ์ทจ๋นํ ์ํ์ ์ค์ผ ์ ์๋ค.
XSS ๊ณต๊ฒฉ์ด๋? Cross-Site-Scripting ๊ณต๊ฒฉ์ผ๋ก ๊ณต๊ฒฉ์๊ฐ ์
์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋๋ก ํ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ํตํด ๊ณต๊ฒฉ์๊ฐ ์ฌ์ฉ์์ ์ธ์
ํน์ ์ฟ ํค ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค. HttpOnly ์์ฑ์ ๊ณต๊ฒฉ์๊ฐ JavaScript๋ฅผ ํตํด ์ค์ํ ์ ๋ณด๋ฅผ ํ์ทจ๋นํ ์ํ์ ์ค์ด๋ ์ญํ ์ ํ๋ค.
- Secure ์์ฑ: ์ฟ ํค์ Secure ์์ฑ์ ์ค์ ํ๋ฉด HTTPS ์ฐ๊ฒฐ์์๋ง ์ ์ก๋๋๋ก ์ ํํ ์ ์๋ค.
- SameSite ์์ฑ: ์ฟ ํค์ SameSite ์์ฑ์ ์ค์ ํ๋ฉด ๋์ผ ์ถ์ฒ ๋ด์์๋ง ์ฟ ํค๊ฐ ์ ์ก๋๋๋ก ์ ํํ ์ ์๋ค. ์ด๋ฅผ ํตํด CSRF ๊ณต๊ฒฉ์ ๋น๊ต์ ์ ๋์ํ ์ ์๋ค.
CSRF ๊ณต๊ฒฉ์ด๋? Cross-Site Request Forgery์ผ๋ก ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋ ์ํ์์ ์
์ฉํ์ฌ ์ฌ์ฉ์์ ๊ถํ์ผ๋ก ์๋ํ์ง ์์ ์์ฒญ์ ์คํํ๋ ๊ณต๊ฒฉ์ด๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์์ ๊ถํ์ ํ์ทจ๋นํ ์ ์๋ค.
1. XSS(Cross-Site-Scripting) ๊ณต๊ฒฉ
: ์ฃผ๋ก ๋ณ์กฐ ํน์ ์์กฐ ๊ณต๊ฒฉ์ ํด๋นํ๋ค.
: ํด๋ผ์ด์ธํธ ์ธก ์คํฌ๋ฆฝํธ๋ฅผ ์ ์์ ์ผ๋ก ์กฐ์ํ๋ค. ๊ณต๊ฒฉ์๊ฐ ์น ํ์ด์ง์ JS, HTML ๋ฑ์ ์ ์์ ์ผ๋ก ์์ ํ๊ฑฐ๋ ๋ธ๋ผ์ฐ์ ์ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํด ๊ณต๊ฒฉํ๋ค. ์ด๋ฅผ ํตํด ํ ํฐ์ ํ์ทจํ ์ ์๋ค. ๋ง์ฝ ์ฟ ํค์ HTTPOnly ์ค์ ์ด ๋์ด ์๋ค๋ฉด JavaScript๋ฅผ ํตํด์ ์ฟ ํค๋ฅผ ์ฝ์ ์ ์๊ธฐ ๋๋ฌธ์ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์๋ค. localStorage ๊ฐ์ ๊ฒฝ์ฐ๋ XSS ๊ณต๊ฒฉ์ ๋งค์ฐ ์ทจ์ฝํ๋ค.
1. CSRF(Cross-Site Request Forgery) ๊ณต๊ฒฉ
: ์ฃผ๋ก ์์กฐ ๊ณต๊ฒฉ ์ ํ์ ํด๋นํ๋ค.
: CSRF๋ ๊ณต๊ฒฉ์๊ฐ ์ฌ์ฉ์์ ์ ๋ขฐ๋ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ํ์ฉํ์ฌ ๋ชฐ๋ ์๋ํ์ง ์์ ์์ ์ ์ํํ๋๋ก ํ๋ ๊ณต๊ฒฉ์ด๋ค. ์ฌ์ฉ์์ ๊ถํ์ผ๋ก ์ ์์ ์ธ ์ฌ์ดํธ(๋๋ฉ์ธ)์ ์์ฒญ์ ๋ณด๋ด ์๋ํ์ง ์์ ์์ ์ ํ๋๋ก ํ ์ ์๋ค. ์ฟ ํค์ SameSite ์์ฑ์ ์ ์ฉํ๋ค๋ฉด ๋ค๋ฅธ ๋๋ฉ์ธ์ผ๋ก์ ์ฟ ํค ์ ์ก์ ๋ง์ CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด Access Token๊ณผ Refresh Token์ ๋ชจ๋ ์ฟ ํค์ ์ ์ฅํ๋ฉด ์๋๋ ๊ฒ์ธ๊ฐ?
Access Token๊ณผ Refresh Token์ ๋ชจ๋ ์ฟ ํค์ ์ ์ฅํ๋ฉด ๋์์ ํ์ทจ๋นํ ์๋ ์์ด ์ํํ ์๋ ์๋ค๊ณ ํ๋ค. ๋ฐ๋ก ์ ์ฅํด์ผ ํ๋ค๋ฉด ๊ฐ์ฅ ์์ ํ ๋ฐฉ๋ฒ์ Access Token์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ , Refresh Token์ ์ฟ ํค์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ผ ์๋ ์๋ค. ํ์ง๋ง ์ด ๊ฒฝ์ฐ ์๋ก๊ณ ์นจ ์์ ๋งค๋ฒ Access Token์ด ์ฌ๋ผ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด ์กฐ๊ธ ๋นํจ์จ์ ์ผ ์๋ ์๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋ ๋ค๋ฉด Access Token์ localStorage์ Rrefresh Token์ ์ฟ ํค์ ์ ์ฅํ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ๋ก ์ ์ฅํ๋ฉฐ ํ ํฐ์ด ๋์์ ํ์ทจ๋นํ ์ํ์ ์ค์ผ ์ ์๊ณ , Access Token์ด ํ์ทจ๋นํ๋๋ผ๋ ๋น๊ต์ ์ ํจ ๊ธฐ๊ฐ์ด ์งง๊ธฐ ๋๋ฌธ์ ํผํด๋ฅผ ์ค์ผ ์ ์๋ค. ํ์ง๋ง localStorage์ Cookie์ ๋นํด ๋ณด์์ ์ทจ์ฝํ ๊ฒ์ ์ฌ์ค์ด๊ณ , ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๊ณ ํด์ ๋ณด์ ์ํ์ ์์ ํ ์ ๊ฑฐํ ์ ์๋ ๊ฒ์ ์๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ๋ง์ ๊ธ์ ์ฝ์ด๋ณด์์ ๋ ์๋ฒฝํ ๋ณด์์ ์๋ค๋ผ๋ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ๋ฐ์ ์๋ค. JWT๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ ์๊ฐ๋ถํฐ ๋ณด์์ ์ํ์ ์์ ํ ์ ๊ฑฐํ ์๋ ์๊ณ , ์ด๋ฅผ ์ต์ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํด์ผ ํ๋ ๊ฒ ๊ฐ๋ค.(์ฌ์ค ์ธ์
๊ธฐ๋ฐ ๋ก๊ทธ์ธ์ ์ฌ์ฉํด๋ ๋ณด์์๋ ์ ๊ฒฝ์จ์ผ ํ๋ค.) ๋ฐ๋ผ์ Access Token๊ณผ Refresh Token์ ์ด๋ป๊ฒ ์์ ํ๊ฒ ๋ณด๊ดํ ์ง ๊ณ ๋ฏผํ๊ณ , ํ์ทจ๋ฅผ ๋๋นํ๋ ๋ฐฉ์์ ๋ง๋ จํ๋ ๊ฒ์ด ์ค์ํ๋ค. ์๋ฅผ ๋ค์ด, Refresh Token Rotation(RTR - Refresh Token์ ํ ๋ฒ ์ฌ์ฉํ ๋๋ง๋ค ์๋ก์ด Refresh Token์ ๋ฐ๊ธํ๊ณ ์ด์ ํ ํฐ์ ๋ฌดํจํํ๋ ๋ฐฉ์)์ ์ฌ์ฉํ๊ฑฐ๋, Refresh Token์ผ๋ก Access Token์ ์ฌ๋ฐ๊ธํ ๋ ๋ค์ค ์ธ์ฆ(MFA)์ ๋์
ํด ๊ณต๊ฒฉ์ ๋์ํ ์ ์๋ค. ์ด๋ฌํ ๋ณด์ ์กฐ์น๋ค์ ํตํด ์ ์ฌ์ ์ธ ์ํ์ ์ต๋ํ ๋๋นํ๋ ๊ฒ์ด ์ค์ํ ๊ฒ ๊ฐ๋ค.
์ฐธ๊ณ
https://seungyong20.tistory.com/entry/JWT-Access-Token%EA%B3%BC-Refresh-Token-%EA%B7%B8%EB%A6%AC%EA%B3%A0-RTR-%EA%B8%B0%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
'๐CS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ ๋ฑ ํน, ์คํ ํ์ด๋ธ์ค, ๋ง์ด๋ฐ์ดํฐ 2.0 (0) | 2024.10.30 |
---|---|
์์ฑํ AI: ๊ฐ๋ , ํ์ฉ, ์์๋๋ ๋ฌธ์ ์ (1) | 2024.10.29 |
์ด์์ฒด์ (0) | 2024.07.10 |
React์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (0) | 2024.04.19 |
React ์ปดํฌ๋ํธ์ ๋ผ์ดํ์ฌ์ดํด (0) | 2024.04.19 |