๐ ์ด ํฌ์คํ ์์๋ HTTP์ ์ธ๊ฐ ๋ฐฉ์ ์ค ํ๋์ธ JWT์ ๋ํด ์ ๋ฆฌํ์์ต๋๋ค.
๐ฅ ์ธ๊ฐ(Authorization)๋ ์ ํ์ํ ๊น?
๐ฅ ์ธ๊ฐ(Authorization)์๋ ์ด๋ค ๋ฐฉ์์ ์ด์ฉํ ๊น?
๐ฅ Access_Token & Refresh_Token ์ด๋?
โ๏ธ ์ฌ์ฉ์๊ฐ ์์ ์ ๊ณ์ ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ก๊ทธ์ธํ๋ ๊ฒ์ ์ธ์ฆ์ด๋ผํ๊ณ , ์ฌ์ฉ์๊ฐ ์์ ์ ๋ฉ์ผํจ์ ๋ค์ด๊ฐ๊ณ , ์์ ์ด ์ด ๊ธ์ ์ญ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ธ์ฆ ์ํ์์ ์ด๋ ํ ๊ถํ์ ๊ฐ๋ ๊ฒ์ด ์ธ๊ฐ์ ๊ฐ๋ ์ด๋ค.
โ๏ธ ๋ก๊ทธ์ธ์ด๋ผ๋๊ฒ ๋ณด์์ ์ง๊ฒฐ๋๋ฉด์๋ ์ฌ์ฉ์๋ค์ด ๋ถํธํ์ง ์๋๋ก ํด์ผํ๊ธฐ ๋๋ฌธ์ ์๋ฒ ๊ฐ๋ฐ์๋ ์ธ์ฆ๊ณผ ์ธ๊ฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผํ ์ง ๊ณ ๋ฏผ์ ๊ฐ์ง ์ ๋ฐ์ ์๋ค.
โ๏ธ ๋ํ์ ์ธ ์ธ๊ฐ(Authorization) ๋ฐฉ์์ Session์ด๋ JWT์ผ๋ก ๋๋๋ค.
โ๏ธ ์ธ์ ์ ์ธ์ ID๋ฅผ ์ฌ์ฉํด์ ์ด๋ค ์ฌ์ฉ์๊ฐ ์๋ฒ์ ๋ก๊ทธ์ธ ๋์ด์์์ด ์ง์๋๋ ์ด ์ํ๋ฅผ ์ธ์ ๋ฐฉ์์ด๋ผ ํ๋ค.
โ๏ธ ์ธ์ ์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ํ์ ๋, ์ด๋ฅผ ์ธ์ฆํ ์ ์๋ ํ๋ฅผ ๋ฐ์ผ๋ก ์๋ผ์ ํ๋๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ด ์น๋ธ๋ผ์ฐ์ ๊ฐ ์ฟ ํค ์ ๋ณด๋ก ๊ฐ๊ณ , ํ๋๋ ์๋ฒ๊ฐ ๊ฐ๊ณ ์์์ผ๋ก์จ ์ด๋ฅผ ๋์กฐํด๋ณด๋ ๋ฐฉ์์ผ๋ก ์ธ๊ฐ๋ฅผ ๊ตฌํํ๋ค.
โ๏ธ ์๋ฒ๋ ์ด ๋ฐ์ชฝ์ง๋ฆฌ ํฐ์ผ์ ๋ฉ๋ชจ๋ฆฌ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํด ๋๋๋ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ฉด ๋น ๋ฅด์ง๋ง ์๋ฒ๊ฐ ์ฅ์ ๊ฐ ์๊ฒจ ์ฌ๋ถํ ๋์ผํ๋ ์ํฉ์ด ์๊ธฐ๋ฉด ์๋ฒ์์ ์ธ์ ์ ๋ณด๋ฅผ ๋ชจ๋ ์์ด๋ฒ๋ฆด ์ ์๋ค๋ ๋จ์ ์๋ค.
โ๏ธ ์๋ฒ์ ๋ค๋ฅธ ์ ์ฅ์ฅ์น๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ์ ์ ์ ์ฅํ๋ ๊ฒ์ ์๋๊ฐ ๋๋ฆด ๋ฟ ์๋๋ผ ์๋ฒ๊ฐ ์ฌ๋ฌ๋ ์๋ ๊ฒฝ์ฐ์๋ HTTP์ Stateless, Connectionless์ ํน์ง ๋๋ฌธ์ ๊ตฌํํ๊ธฐ ๊น๋ค๋กญ๋ค.
โ๏ธ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ ๋์ค๋ MemCached ๊ฐ์ ๋ฉ๋ชจ๋ฆฌํ ๊ณต์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๋ฅผ ๋ฌ์ ์ด๋ฅผ ๊ด๋ฆฌํ๊ธฐ๋ ํ์ง๋ง, ์ด ๋ํ ์๋ฒ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ธ์ ์ ๋ณด๋ฅผ ์ ์งํ๊ธฐ ์ด๋ ค์ด ๋จ์ ์ ๊ฐ๊ณ ์๋ค.
โ๏ธ ์ฆ, ์๋ฒ์ธก์ ๋ณต์กํ ๊ตฌ์ฑ๊ณผ ํ๊ฒฝ์์ ์ด๋ค ์ํ๋ฅผ ๊ธฐ์ตํด์ผ๋ ์ด๋ ค์ ๋๋ฌธ์ ์ด๋ฌํ ๋ถ๋ด์ ๋ฎ์ถ๊ณ ์ ๊ณ ์๋ ๊ฒ์ด Token ๋ฐฉ์์ธ JWT๋ค.
โ๏ธ JWT ๋ํ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ํ๋ฉด ์ธ๊ฐ๋ฅผ ํ ์ ์๋ ์ด๋ค ํ๋ฅผ ์ฃผ๋๋ฐ ์ด๋ฒ์๋ ๋ฐ์ผ๋ก ์ฐข์ง์๊ณ ๊ทธ๋ฅ ์ค๋ค. ์ด๋ ์ด ํ๋ฅผ Token์ด๋ผํ๊ณ , ๋ฐ์ผ๋ก ์ฐข์ง์๋๋ค๋ ๊ฒ์ ์๋ฒ๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ๊ธฐ์ตํ๊ณ ์์ง ์๋๋ค๋ ์๋ฏธ์ด๋ค.
โ๏ธ ์ด ํ ๊ทผ์ ์ธ์ฝ๋ฉ ๋๋ ์ํธ๋ 3๊ฐ์ง ๋ฐ์ดํฐ๋ก ์ด๋ค์ ธ์๋๋ฐ, ์ด 3๊ฐ์ ์์ญ์ header, payload, signature๋ผ ํ๊ณ ๋ง์นจํ 2๊ฐ๋ก ๋๋ ์ ธ ์๋ค.
โ๏ธ ์ด ์ค payload๋ฅผ Base64 ๋ฐฉ์์ผ๋ก ๋์ฝ๋ฉํด๋ณด๋ฉด ๋๊ฐ ๋๊ฐ์๊ฒ ๋ฐ๊ธํ๋์ง, ์ธ์ ๊น์ง ์ ํจํ์ง, ์ฌ์ฉ์์ id๋ฒํธ, ๊ด๋ฆฌ์์ฌ๋ถ ๋ฑ์ด JSONํ์์ผ๋ก ๋ค์ด์๋ค.
โ๏ธ ์ด์ ์ด๋ฐ token์ ๋ฐ๊ธํ๋ฉด ์๋ฒ๊ฐ ์์ฒญ๋ง๋ค ์ผ์ผ์ด ๋ฉ๋ชจ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค์ ธ๋ด์ผํ ์ผ์ ์ค์ด๋ค์ง๋ง, Base64๋ก ์ธ์ฝ๋ฉ ๋์ด์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋์ฝ๋ฉํ์ฌ ์ ์ํ ์ ์๋ ์ฌ์ง๊ฐ ์กด์ฌํ๋ค.
โ๏ธ ๋๋ฌธ์ header๋ถ๋ถ๊ณผ signature ๋ถ๋ถ์ด ํจ๊ป ์๋ค. header๋ฅผ ๋์ฝ๋ฉํด๋ณด๋ฉด typ์ด ์กด์ฌํ๋๋ฐ ์ด๋ ๊ณ ์ ๊ฐ์ด๊ณ , alg๋ signature๋ฅผ ๋ง๋๋๋ฐ ์ฌ์ฉ๋๋ ์ฌ๋ฌ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๊ฐ ์ง์ ๋์ด ์๋ค.
โ๏ธ ์ฆ, payload ๊ฐ๊ณผ ์๋ฒ์ ๊ฐ์ถฐ๋ ผ SECRET_KEY๋ฅผ header์ alg ๋ฐฉ์์ผ๋ก ์์ฑํ ๊ฒ์ด signature์ด๋ค. ๋ฐ๋ผ์ JWT์ ์ํธํ ๋ฐฉ์์ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ณด๋ด์ ธ์๋ ๋ณตํธํ๊ฐ ๊ฐ๋ฅํ์ง๋ง, ํด๋ผ์ด์ธํธ์์๋ ๊ณ์ฐ์ด ์ด๋ ต๋ค.
โ๏ธ ์ด์ JWT๋ ์๋ฒ์์ ์ํ ์ ์งํ์ง ์๊ธฐ ๋๋ฌธ์ Stateless์ ํน์ฑ์ ๊ฐ์ง๊ณ ์๊ณ , Sesstion์ ๋ฐ๋๋ก Statefulํ ํน์ง์ ๊ฐ๊ณ ์๋ค.
โ๏ธ JWT๋ ์ด๋ฌํ ์ฅ์ ์ด ์์ง๋ง, Session์ ๋์ฒดํ๊ธฐ์๋ JWT์๋ ํ๊ณ๊ฐ ์กด์ฌํ๋ค.
โ๏ธ Session์ ๋ถ๋ด์ด ์กด์ฌํ๊ณ ๊ตฌํํ๊ธฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์์ง๋ง, Statefulํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์ตํ๋ ๋์์ ์ํ๋ค์ ์ธ์ ๋ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ค. ์๋ฅผ๋ค์ด, ํ ๊ธฐ๊ธฐ์๋ง ๋ก๊ทธ์ธ์ด ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ๋๋ฐ์ด์ค๋ก ์ ์ํ๋ฉด ํ ์ธ์ ์ ์ข ๋ฃ์ํฌ ์ ์๋ค.
โ๏ธ ์ด์ ๋ฐํด JWT๋ ์ด๋๊ฐ ๊ธฐ๋กํ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐํธํ๊ธดํ์ง๋ง ํต์ ํ๊ธด ์ด๋ ต๋ค. ์๋ฅผ ๋ค์ด, ํด์ปค๊ฐ ํ ํฐ์ ํ์ทจํ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ฌดํจํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค.
โ๏ธ ์ด๋ฌํ JWT์ ํ๊ณ๋ฅผ ๋ณด์ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋๋ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ์, 2๊ฐ์ ํ ํฐ์ ๋ฐ๊ธํ๋ ๊ฒ์ด๋ค. ์๋ช ์ด ๋ช ์๊ฐ์ด๋ ๋ช๋ถ ์ดํ๋ก ์งง์ access_token๊ณผ ๋ณดํต 2์ฃผ์ ๋๋ก ๊ธฐ๊ฐ์ด ์กํ ์๋ refresh_token์ด๋ค.
โ๏ธ ์๋ฒ๋ refresh_token๊ณผ ์์ํ๋ ๊ฐ์ ์ ์ฅํด ๋๋๋ฐ, ํด๋ผ์ด์ธํธ์์ access_token์ ๋ง๋ฃ๊ธฐ๊ฐ์ด ์ง๋ refresh_token์ ์ ์กํ๋ฉด ๊ทธ๊ฑธ ์๋ฒ์ ์ ์ฅ๋ ๊ฐ๊ณผ ๋์กฐํ๊ณ ๋ง๋ค๋ฉด ์๋ก์ด access_token์ ๋ฐ๊ธํ๋ ๊ฒ์ด๋ค.
โ๏ธ ์ด์ refresh_token๋ง ์์ ํ๊ฒ ๊ด๋ฆฌ๋๋ค๋ฉด ์ด๊ฒ ์ ํจํ ๋์์ access_token์ด ๋ง๋ฃ๋ ๋๋ง๋ค ๋ค์ ๋ก๊ทธ์ธํ ํ์ ์์ด ์ธ๊ฐ๋ฅผ ํด์ฃผ๋ ๋ฐฉ์์ด๋ค.
โ๏ธ ์ฆ, ๋งค๋ฒ ์ธ๊ฐ๋ฅผ ํ ๋ ์ฌ์ฉํ๋ access_token๊ณผ access_token์ ์ ํจ๊ธฐ๊ฐ์ด ์ง๋ฌ์ ๋ ์ฌ๋ฐ๊ธ ๋ฐ๊ธฐ ์ํ refresh_token์ ํ์ฉํ๋ ๊ฒ์ด๋ค.
โ๏ธ ๋ํ ์๋ฒ์์ ๋๊ตฐ๊ฐ๋ฅผ ๊ฐ์ ๋ก ๋ก๊ทธ์์ ์ํจ๋ค๋์ง ํ ํฐ์ ๋ฌดํจ๊ณผ์ํค๊ณ ์ถ๋ค๋ฉด refresh_token์ DB์์ ์ง์์ ํ ํฐ ๊ฐฑ์ ์ด ์๋๊ฒ ์ ์ดํ ์ ์๋ค. ๋ค๋ง, ์ด๋ token์ ํ๊ณ์ ์ ๋ถ๋ถ์ ์ผ๋ก ๋ณด์ํ๊ฒ ๋ฟ์ด์ง ์์ ํ ํด๊ฒฐ์ฑ ์ ์๋๋ค.