์ธ์ ? ํ ํฐ? ์ฟ ํค?
์ธ์ฆ ๋ฐฉ์์ ๋ํด ์ด์ผ๊ธฐํ ๋ ํท๊ฐ๋ฆฌ๋ ๊ฐ๋ ๋ค์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํฉ๋๋ค.
HTTP๋ ๋ฌด์ํ!
์ฐ์ HTTP ํ๋กํ ์ฝ์ด ๋ฌด์ํ(stateless)๋ผ๋ ๊ฒ์ ์ดํดํด์ผ ํฉ๋๋ค.
HTTP ํ๋กํ ์ฝ๋ก ์น์ ํตํด ํต์ ํด์ผ ํ ๋, ์ฐ๋ฆฌ๊ฐ ๋ณด๋ด๋ ๊ฐ๊ฐ์ ์์ฒญ์ ๋ ๋ฆฝ์ ์ ๋๋ค.
์์ฒญ์ด ๋๋๋ฉด ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ ๋ณด๋ฅผ ์์ด๋ฒ๋ฆฌ๊ณ , ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค ํด๋ผ์ด์ธํธ๊ฐ ๋๊ตฐ์ง ์๋ ค์ค์ผ ํฉ๋๋ค.

์๋ฒ์๊ฒ ์์ฒญ์ ๋ณด๋ผ ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋๊ตฐ์ง ์๋ ค์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋ํ์ ์ผ๋ก ์ธ์ ๊ณผ ํ ํฐ์ด ์๋ ๊ฒ์ ๋๋ค.
์ธ์ ์ธ์ฆ ๋ฐฉ์๊ณผ ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ ๋ก๊ทธ์ธ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณด๊ฒ ์ต๋๋ค.
์ธ์ (session)
์ธ์ ์ธ์ฆ ๋ฐฉ์์ผ๋ก ๋ก๊ทธ์ธ์ ํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

- ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด(์๋ฅผ ๋ค๋ฉด ์ ์ ๋ช , ๋น๋ฐ๋ฒํธ)๋ฅผ ๋ด์์ ์๋ฒ๋ก ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ธ๋ค.
- ์๋ฒ๋ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์ผ์นํ๋ฉด ์ธ์ DB์ ์ธ์ ID๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ์กํ๋ค.
- ํด๋ผ์ด์ธํธ๋ ๋ก๊ทธ์ธ ์ดํ ์์ฒญ๋ง๋ค ์ธ์ ID๋ฅผ ํจ๊ป ์ ์กํ๋ค.
- ์๋ฒ๋ ์ธ์ DB์์ ์ธ์ ID๋ฅผ ์ฐพ์์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค.
์ธ์ ์ ์ธ์ ID๋ฅผ ์์ฑํ๊ณ ์ ์ฅํ๊ธฐ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(์ฃผ๋ก Redis)๊ฐ ํ์ํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ์๊ฐ ๋์ด๋ ์๋ก ํ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์๋ ๋์ด๋๋ ๋จ์ ์ด ์์ต๋๋ค.
ํ์ง๋ง ํ์์ ๋ฐ๋ผ ์๋น์ค์ ๋ค์๊ณผ ๊ฐ์ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ์ถ๊ฐํ ์ ์๋ ์ฅ์ ๋ ์์ต๋๋ค.
- ๋น์ ์์ ์ธ ํ๋์ ํ๋ ๊ฒฝ์ฐ ๊ฐ์ ๋ก๊ทธ์์
- ๋น์ ์์ ์ธ ์์น์์ ๋ก๊ทธ์ธ ์๋ํ๊ฑฐ๋ ์ธ์ ๋์ฉ์ด ์์ฌ๋๋ ๊ฒฝ์ฐ ๊ฐ์ ๋ก๊ทธ์์
- ๋ก๊ทธ์ธ ๋ ๋๋ฐ์ด์ค๋ฅผ ๊ด๋ฆฌํ๊ณ ์ํ์ง ์๋ ๋๋ฐ์ด์ค์์ ๊ฐ์ ๋ก๊ทธ์์
- ๊ณ์ ๊ณต์ ์ซ์ ์ ํ (๋ทํ๋ฆญ์ค์ฒ๋ผ)
ํ ํฐ(token)
ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ผ๋ก ๋ก๊ทธ์ธ์ ํ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. JWT(JSON Web Token)์ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.

- ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด(์๋ฅผ ๋ค๋ฉด ์ ์ ๋ช , ๋น๋ฐ๋ฒํธ)๋ฅผ ๋ด์์ ์๋ฒ๋ก ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ธ๋ค.
- ์๋ฒ๋ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์ผ์นํ ๊ฒฝ์ฐ, ํด๋น ์ ๋ณด๋ฅผ ์ฌ์ฉํด ์๋ช ์๊ณ ๋ฆฌ์ฆ์ ํตํด JWT๋ฅผ ์์ฑํ ํ, ์ด๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ์กํ๋ค.
- ํด๋ผ์ด์ธํธ๋ ๋ก๊ทธ์ธ ์ดํ ์์ฒญ๋ง๋ค JWT๋ฅผ ํจ๊ป ์ ์กํ๋ค.
- ์๋ฒ๋ JWT๋ฅผ ๊ฒ์ฆํ์ฌ ์ ํจํ ํ ํฐ์ธ ๊ฒฝ์ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค.
ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ ๋ณ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํ์ํ์ง ์์ต๋๋ค.
ํ ํฐ ์์ฒด์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ด์์ ์๋ช ํ๊ธฐ ๋๋ฌธ์, ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ํ ํฐ์ ๊ฒ์ฆํด์ ๊ทธ ์์ ๋ด๊ธด ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
ํ์ง๋ง JWT ๊ฐ์ ํ ํฐ์ ์ํธํ๋ ๊ฒ์ด ์๋๋๋ค.
๋๊ตฌ๋ ํ์ด๋ก๋์ ๋ด๊ธด ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ๋ด์ผ๋ฉด ์ ๋ฉ๋๋ค.
์ฟ ํค(cookie)
๊ทธ๋ผ ์ฟ ํค๋ ๋ญ๊น์?
์ฟ ํค๋ ์ธ์ ์ด๋ ํ ํฐ ๊ฐ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ๋งค๊ฐ์ฒด์ผ ๋ฟ์ ๋๋ค.
๋ง์ฝ ์ฟ ํค๋ฅผ ์ฌ์ฉํด JWT๋ฅผ ์ ๋ฌํ๋ค๊ณ ํ๋ค๋ฉด ๋ก๊ทธ์ธ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

- ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ๋ก ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ธ๋ค.
- ์๋ฒ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ JWT๋ฅผ ์์ฑํ์ฌ Set-Cookie ํค๋์ ๋ด์์ ์ ๋ฌํ๋ค.
- ๋ธ๋ผ์ฐ์ ๋ ๋ก๊ทธ์ธ ์ดํ ์์ฒญ๋ง๋ค Cookie ํค๋์ JWT๋ฅผ ํฌํจํด์ ์ ์กํ๋ค.
- ์๋ฒ๋ JWT๋ฅผ ๊ฒ์ฆํ์ฌ ์ ํจํ ํ ํฐ์ธ ๊ฒฝ์ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ค.
์ด๋ JWT๊ฐ ์๋๋ผ ์ธ์ ์ ์ฌ์ฉํ๋ค๊ณ ํด๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.
์๋ฒ์์๋ ์ฟ ํค๋ฅผ ๋ณด๋ผ ๋ ์ฟ ํค๋ฅผ ๋ณด๋ผ ์ ์๋ ๋๋ฉ์ธ, ๋ง๋ฃ์๊ฐ ๋ฑ์ ์ค์ ํด์ ๋ณด๋ ๋๋ค.
ํ์ง๋ง ์ฟ ํค๋ ๋ธ๋ผ์ฐ์ ์คํ์ด๊ธฐ ๋๋ฌธ์ ์น ๋ธ๋ผ์ฐ์ ์์๋ง ๋์ํฉ๋๋ค.
iOS, Android์ ๊ฐ์ ๋ค์ดํฐ๋ธ ์ฑ์์๋ ์ฟ ํค๊ฐ ์์ต๋๋ค.
์ด๋ด ๋๋ ์์ฒญ ํค๋์ Authorization: <type> <credentials> ํ์์ผ๋ก ๋ณด๋ผ ์ ์์ต๋๋ค.
HTTP ํ๋กํ ์ฝ์์๋ Authorization ํค๋๊ฐ ์ฌ์ฉ์ ์ธ์ฆ์ ์ํ ํ์ค ์์น์ด๊ณ , ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ผ ๊ฒฝ์ฐ type์ Bearer๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. [์ฐธ๊ณ 1] [์ฐธ๊ณ 2]
โ Cookie ์ Authorization ์ ์ฐจ์ด๋?
Cookie์ Authorization ํค๋๋ ์ธ์ฆ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ๋งค๊ฐ์ฒด์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ด ๋์ ์ฐจ์ด๋ฅผ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
Cookie
- ์น ๋ธ๋ผ์ฐ์ ์๋ง ๋์ํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์๋์ผ๋ก ํฌํจํด์ ์์ฒญ์ ๋ณด๋ด๊ฒ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
- axios : { withCredentials: true } ์ต์ ์ถ๊ฐ
- Fetch API : { credentials: "include" } ์ต์ ์ถ๊ฐ
- ๋งค ์์ฒญ๋ง๋ค ์ธ์ฆ ์ ๋ณด๊ฐ ์๋์ผ๋ก ํฌํจ๋๊ธฐ ๋๋ฌธ์ CSRF ๊ณต๊ฒฉ์ ์ํ์ด ์์ต๋๋ค.
- ๐ CSRF ํ ํฐ์ ์ฌ์ฉํ๊ฑฐ๋, Referer Header ๊ฒ์ฆ์ ์ถ๊ฐํ์ฌ CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ ์ ์์ต๋๋ค.
- Javascript ์์์ document.cookie๋ก ์ ๊ทผํ์ฌ XSS ๊ณต๊ฒฉ์ ์ํ๋ ์์ต๋๋ค.
- ๐ ์๋ฒ ์ธก์์ ์ฟ ํค๋ฅผ ์ค์ ํ ๋ httpOnly ์ต์ ์ ์ถ๊ฐํ์ฌ Javascript๋ก ์ ๊ทผํ์ง ๋ชปํ๊ฒ ํด์ผ ํฉ๋๋ค.
Authorization
- ๋งค ์์ฒญ๋ง๋ค ์ธ์ฆ ์ ๋ณด๊ฐ ์๋์ผ๋ก ํฌํจ๋์ง ์๊ธฐ ๋๋ฌธ์ CSRF ๊ณต๊ฒฉ์๋ ๋น๊ต์ ์์ ํฉ๋๋ค.
- ๋์ ํด๋ผ์ด์ธํธ ์ธก์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ด๋์ ๋ณด๊ดํ ์ง ๊ณ ๋ฏผํด์ผ ํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์น ๋ธ๋ผ์ฐ์ ์ผ ๊ฒฝ์ฐ MDN์์๋ ๋ธ๋ผ์ฐ์ ์ ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ ์ธ์ ์คํ ๋ฆฌ์ง๋ฅผ ๊ถ์ฅํฉ๋๋ค๋ง, Javascript ์์์ document.localStorage, document.sessionStorage๋ก ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ XSS ๊ณต๊ฒฉ์ ์ํ์ด ์์ต๋๋ค.
- ๐ Access Token(์ดํ AT)์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ Refresh Token(์ดํ RT)๋ฅผ ์ฟ ํค์ ์ ์ฅํ๋ฉด, XSS ๊ณต๊ฒฉ์ ํผํ๋ฉด์๋ ์ ์์ ์ธ ์ฌ์ฉ์์๊ฒ๋ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. [์ฐธ๊ณ ]
- ๋ก๊ทธ์ธ ์์ฒญ์ ํตํด AT, RT๋ฅผ ๋ชจ๋ ๋ฐ๊ธ ๋ฐ์ต๋๋ค.
- AT๋ ์๋ต ๋ณธ๋ฌธ์ผ๋ก ๋ฐ์์ (JS ๋ณ์ ๋ฑ์ผ๋ก) ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ , ๋ก๊ทธ์ธ ์ดํ ์๋ฒ ์์ฒญ์ Authorization ํค๋์ ๋ด์์ ๋ณด๋ ๋๋ค.
- RT๋ ๋ง๋ฃ ๊ธฐ๊ฐ์ ์๋์ ์ผ๋ก ๊ธธ๊ฒ ์ค์ ํ ํ httpOnly ์ฟ ํค๋ก ๋ฐ์์ ์ ์ฅํฉ๋๋ค.
- AT๊ฐ ๋ง๋ฃ๋๋ฉด RT๋ฅผ ํตํด ์๋ก์ด AT๋ฅผ ์์ฒญํ๊ณ ์๋ต ๋ณธ๋ฌธ์ผ๋ก ๋ฐ์ต๋๋ค.
- RT๋ ๋ง๋ฃ๋๋ฉด ๋ก๊ทธ์์ ์ฒ๋ฆฌํฉ๋๋ค.
์ ๋ฆฌ
์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ | ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ | |
์ฅ์ | - ๋ณด์์ ์ํ ์๋น์ค ํ์ฅ์ด ๊ฐ๋ฅํจ. | - ๋ณ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์์ด ํ์ํ์ง ์์. |
๋จ์ | - ์ธ์ ์ ์ ์ฅํ๊ธฐ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์์ด ํ์ํจ. | - ๋ณด์์ ์ํ ์๋น์ค ํ์ฅ์ ์ด๋ ค์. - ํ์ด๋ก๋์ ๋ฏผ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ด์ง ์๋๋ก ์ฃผ์๊ฐ ํ์ํจ. |
Cookie | Authorization Header | |
ํน์ง | - ์น ๋ธ๋ผ์ฐ์ ์๋ง ๋์ํจ. - ์๋ฒ์ ์์ฒญ์ ์ธ์ฆ์ ๋ณด๋ฅผ ์๋์ผ๋ก ํฌํจ์ํฌ ์ ์์. |
- ๋ค์ดํฐ๋ธ ์ฑ ํด๋ผ์ด์ธํธ๋ฅผ ์ง์ํ ๊ฒฝ์ฐ ์ฌ์ฉ ๊ฐ๋ฅํจ. - ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ผ ๊ฒฝ์ฐ Bearer๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํจ. |
์ฅ์ | - ์น ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ ์ธก์์ ์ธ์ฆ ์ ๋ณด ๋ณด๊ด ๋ฐฉ๋ฒ์ ๋ฐ๋ก ๊ณ ๋ คํ์ง ์์๋ ๋จ. | - ์ธ์ฆ ์ ๋ณด๋ฅผ ์๋์ผ๋ก ํฌํจํ์ง ์์ผ๋ฏ๋ก CSRF ๊ณต๊ฒฉ์ ๋น๊ต์ ์์ ํจ. |
๋จ์ | - CSRF, XSS ๊ณต๊ฒฉ์ ๋ํ ๋ฐฉ์ด๊ฐ ํ์ํจ. | - ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ ์ธก์์ ์ธ์ฆ ์ ๋ณด ๋ณด๊ด ๋ฐฉ๋ฒ์ ๋ฐ๋ก ๊ณ ๋ คํด์ผ ํจ. - ํด๋ผ์ด์ธํธ๊ฐ ์น ๋ธ๋ผ์ฐ์ ์ผ ๋ ์ธ์ ์คํ ๋ฆฌ์ง๋ ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ XSS ๊ณต๊ฒฉ ์ํ์ฑ ์์. |
์ฐธ๊ณ
https://youtu.be/tosLBcAX1vk?si=uO3RaiNXDx6ZJy8B
https://www.cloudflare.com/ko-kr/learning/access-management/token-based-authentication/
https://docs.tosspayments.com/resources/glossary/bearer-auth
https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies
https://velog.io/@gwanuuoo/CSRF-%EA%B3%B5%EA%B2%A9%EA%B3%BC-%EB%B0%A9%EC%96%B4-%EA%B8%B0%EB%B2%95
https://hasura.io/blog/best-practices-of-using-jwt-with-graphql
https://medium.com/@uk960214/refresh-token-%EB%8F%84%EC%9E%85%EA%B8%B0-f12-dd79de9fb0f0