JWT + Redis ์ธ์ฆ ์ค๊ณ - ์ธ์ ๋์ JWT๋ฅผ ์ ํํ ์ด์
๋ชฉ์ฐจ
Booktine์ ๋ก๊ทธ์ธ ๊ธฐ๋ฐ ๊ธฐ๋ฅ์ด ๋ง์ ์๋น์ค๋ค. ๋ฐ๋ผ์ ์ธ์ฆ ๊ตฌ์กฐ๋ฅผ ์ด๋ป๊ฒ ์ค๊ณํ ์ง๊ฐ ์๋น์ค ์ ์ฒด ๊ตฌ์กฐ์ ํฐ ์ํฅ์ ์คฌ๋ค.
1. ๋ฐฐ๊ฒฝ
Booktine์ ๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ง ์ด์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ด ๋ง๋ค. ๋ ์ ๊ธฐ๋ก ์์ฑ, ๋ฉ๋ชจ, ์งํ๋ฅ ๊ด๋ฆฌ ๋ฑ ๋๋ถ๋ถ์ ํต์ฌ ๊ธฐ๋ฅ์ด ์ธ์ฆ์ ์ ์ ๋ก ํ๋ค. ๋ฐ๋ผ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ธ์ฆ์ ์ฒ๋ฆฌํ ์ง๊ฐ ์ค์ํ ์ค๊ณ ๊ฒฐ์ ์ค ํ๋์๋ค.
ํต์ฌ ๊ธฐ์ค์ ๋ค์๊ณผ ๊ฐ์๋ค.
- ์๋ฒ ํ์ฅ์ฑ
- ํ๋ก ํธ์๋(React)์์ ์ฐ๋ ํธ์์ฑ
- ๊ตฌํ ๋ณต์ก๋
2. ์ธ์ฆ ๋ฐฉ์ ๋น๊ต
| ๋ฐฉ์ | ์ค๋ช | ํ์ฅ์ฑ | ๊ตฌํ ๋์ด๋ |
|---|---|---|---|
| ์ธ์ | ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ , ํด๋ผ์ด์ธํธ๋ ์ธ์ ID๋ง ๊ฐ๋๋ค. | ๋ฎ์ (์๋ฒ ์ํ ์ ์ง ํ์) | ๋ฎ์ |
| JWT | ์ธ์ฆ ์ ๋ณด๋ฅผ ํ ํฐ์ ๋ด์ ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ๋ณด๊ดํ๋ค. | ๋์ (Stateless) | ์ค๊ฐ |
3. ์ธ์ ์ ์ ํํ์ง ์์ ์ด์
์ธ์ ์ ๊ตฌํ์ด ๋จ์ํ๊ณ Spring Security์์ ๊ธฐ๋ณธ ์ฐ๋์ด ์ ๋์ด ์๋ค๋ ์ฅ์ ์ด ์๋ค. ํ์ง๋ง ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ์ ๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ๋จํ๋ค.
- ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์๋ฒ ์ฌ์์ ์ ๋ก๊ทธ์ธ ์ํ๊ฐ ์ด๊ธฐํ๋๋ค.
- ์๋ฒ๋ฅผ ์ํ ํ์ฅํ ๊ฒฝ์ฐ ์ธ์ ๋๊ธฐํ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
- React ๊ธฐ๋ฐ SPA์์ ์ฐ๋์์ CORS ์ค์ ์ด ๋ณต์กํด์ง ์ ์๋ค.
- REST API ๊ตฌ์กฐ์์๋ Stateless ๋ฐฉ์์ด ๋ ์์ฐ์ค๋ฝ๋ค.
๋ฌด์๋ณด๋ค ํ๋ก ํธ์๋๊ฐ React๋ก ๋ถ๋ฆฌ๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์, ์ฟ ํค ๊ธฐ๋ฐ ์ธ์ ๋ณด๋ค ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ด ์ฐ๋ํ๊ธฐ ๋ ํธ๋ฆฌํ๋ค๊ณ ํ๋จํ๋ค.
4. ๊ฒฐ์ - JWT + Redis
Access Token / Refresh Token ๋ฐ๊ธ
JWT๋ Access Token๊ณผ Refresh Token ๋ ๊ฐ์ง๋ฅผ ๋ฐ๊ธํ๋ ๊ตฌ์กฐ๋ก ์ค๊ณํ๋ค. Access Token์ ๋ง๋ฃ ์๊ฐ์ ์งง๊ฒ ์ค์ ํด ํ์ทจ ์ํ์ ์ค์ด๊ณ , ๋ง๋ฃ ์ Refresh Token์ผ๋ก ์ฌ๋ฐ๊ธ๋ฐ๋๋ก ํ๋ค.


Refresh Token์ Redis์ ์ ์ฅํ ์ด์
JWT๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ๊ฐ ์ํ๋ฅผ ์ ์ฅํ์ง ์๊ธฐ ๋๋ฌธ์, ํ๋ฒ ๋ฐ๊ธ๋ ํ ํฐ์ ์๋ฒ์์ ๊ฐ์ ๋ก ๋ฌดํจํํ๊ธฐ ์ด๋ ต๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Refresh Token์ Redis์ ์ ์ฅํ๋ค.
- ๋ก๊ทธ์์ ์ Redis์์ Refresh Token์ ์ญ์ ํ๋ฉด ์ฌ๋ฐ๊ธ์ด ๋ถ๊ฐ๋ฅํด์ง๋ค.
- Redis TTL ๊ธฐ๋ฅ์ผ๋ก ๋ง๋ฃ ์ฒ๋ฆฌ๋ฅผ ์๋ํํ ์ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์ ์ฅ์๋ผ ์กฐํ ์๋๊ฐ ๋น ๋ฅด๋ค.
- RDB์ ์ ์ฅํ๋ ๋ฐฉ์๋ณด๋ค DB ๋ถ๋ด์ด ์ ๋ค.
๋ณ๋ Repository ํด๋์ค ์์ด StringRedisTemplate์ AuthService์์ ์ง์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค.

๋ก๊ทธ์ธ ์ ์ง ์ฌ๋ถ์ ๋ฐ๋ผ Refresh Token์ TTL๋ ๋ค๋ฅด๊ฒ ์ค์ ํ๋ค. ๋ก๊ทธ์ธ ์ ์ง๋ฅผ ์ ํํ์ง ์์ผ๋ฉด ์ต๋ 12์๊ฐ์ผ๋ก ์ ํํ๋ค.


์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์๋ฒ๋ Access Token๊ณผ Refresh Token์ ์์ฑํ๋ค. Refresh Token์ Redis์ TTL๊ณผ ํจ๊ป ์ ์ฅ๋๊ณ , Access Token์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌ๋๋ค.
๋ก๊ทธ์์ ๋ฐ Access Token ๋ธ๋๋ฆฌ์คํธ
๋ก๊ทธ์์ ์์๋ Redis์์ Refresh Token์ ์ญ์ ํ๊ณ , ํ์ฌ Access Token์ ๋ธ๋๋ฆฌ์คํธ์ ๋ฑ๋กํ๋ค.
Access Token์ ๋ง๋ฃ ์ ๊น์ง ์ ํจํ๊ธฐ ๋๋ฌธ์, ๋ธ๋๋ฆฌ์คํธ์ ๋ฑ๋กํด ์ฌ์ฌ์ฉ์ ๋ง๋๋ค.
๋ธ๋๋ฆฌ์คํธ์ TTL์ Access Token์ ๋จ์ ๋ง๋ฃ ์๊ฐ์ผ๋ก ์ค์ ํ๋ค.


๋ก๊ทธ์์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด Refresh Token์ Redis์์ ์ญ์ ๋๋ค. ๋์์ ํ์ฌ Access Token์ ๋ธ๋๋ฆฌ์คํธ์ ๋ฑ๋ก๋์ด ๋ง๋ฃ ์ ๊น์ง ์ฌ์ฌ์ฉ๋์ง ๋ชปํ๋๋ก ์ฐจ๋จ๋๋ค.
JwtFilter์์๋ ๋งค ์์ฒญ๋ง๋ค ๋ธ๋๋ฆฌ์คํธ ๋ฑ๋ก ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.

Access Token ์ฌ๋ฐ๊ธ
Refresh Token ๊ฒ์ฆ ํ Redis์ ์ ์ฅ๋ ๊ฐ๊ณผ ์ผ์นํ๋ ๊ฒฝ์ฐ์๋ง ์ Access Token์ ๋ฐ๊ธํ๋ค.


ํด๋ผ์ด์ธํธ๋ ๋ง๋ฃ๋ Access Token ๋์ Refresh Token์ผ๋ก ์ฌ๋ฐ๊ธ ์์ฒญ์ ๋ณด๋ธ๋ค. ์๋ฒ๋ Redis์ ์ ์ฅ๋ Refresh Token๊ณผ ๋น๊ต ๊ฒ์ฆ ํ ์๋ก์ด Access Token์ ๋ฐ๊ธํ๋ค.
์ ํ ์ด์
- React ๊ธฐ๋ฐ SPA์ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์ฐ๋์ด ์์ฐ์ค๋ฝ๋ค.
- Stateless ๊ตฌ์กฐ๋ก ์๋ฒ ํ์ฅ์ ์ ๋ฆฌํ๋ค.
- Redis TTL๋ก Refresh Token ๋ง๋ฃ๋ฅผ ์๋ ์ฒ๋ฆฌํ ์ ์๋ค.
- ๋ก๊ทธ์์ ์ Refresh Token ์ญ์ + Access Token ๋ธ๋๋ฆฌ์คํธ ๋ฑ๋ก์ผ๋ก ๊ฐ์ ๋ฌดํจํ๊ฐ ๊ฐ๋ฅํ๋ค.
5. JWT์ ํ๊ณ
Access Token์ ๋ง๋ฃ ์ ๊น์ง ์๋ฒ์์ ๊ฐ์ ๋ก ๋ฌดํจํํ ์ ์๋ค. ๋ฐ๋ผ์ ํ์ทจ๋ ๊ฒฝ์ฐ์๋ ๋ง๋ฃ ์๊ฐ๊น์ง๋ ์ ํจํ๊ฒ ์ฌ์ฉ๋ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
๋ค๋ง Access Token์ ๋ง๋ฃ ์๊ฐ์ ์งง๊ฒ ์ค์ ํ๊ณ , ๋ก๊ทธ์์ ์ ๋ธ๋๋ฆฌ์คํธ์ ๋ฑ๋กํ๋ ๋ฐฉ์์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ต์ํํ๋ค.
'๐ป PROJECT > [Spring Boot, React] ๋ ์ ์ต๊ด ๊ด๋ฆฌ ์๋น์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [์ค๊ณ์์ฌ๊ฒฐ์ ] ์๋ฆฌ์ฆ ๋ชฉ๋ก (0) | 2026.05.21 |
|---|---|
| [ํ๋ก์ ํธ ๊ฐ์] ํ๋ก์ ํธ ์๊ฐ ๋ฐ ๊ธฐํ (0) | 2026.05.12 |
| [์ค๊ณ์์ฌ๊ฒฐ์ ] ๊ตญ๋ด ๋์ ๊ฒ์ API ์ ํ ๊ณผ์ (0) | 2026.05.08 |
| [ํธ๋ฌ๋ธ์ํ ] JWT secret ํค ๊ธธ์ด ๋ถ์กฑ์ผ๋ก ์ธํ WeakKeyException (0) | 2026.05.07 |
| [ํธ๋ฌ๋ธ์ํ ] ์ปค๋ฎค๋ํฐ ์ข์์ ์ํ ๋ถ์ผ์น๋ก ์ธํ 409 ์ค๋ฅ (0) | 2026.05.07 |