์ธ์ ๊ด๋ฆฌ ๊ฐ์
์ธ์ ์คํ ์ด
Redis, PostgreSQL ํ์ฅ ๊ฐ๋ฅํ ์ ์ฅ์
์ธ์ ๋ง๋ฃ
์๋ ๋ง๋ฃ ์ฌ๋ผ์ด๋ฉ ๋ง๋ฃ
ํ ํฐ ๊ฐฑ์
Refresh Token Access Token ์ฌ๋ฐ๊ธ
๋ก๊ทธ์์
์ธ์
๋ฌดํจํ ํ ํฐ ๋ธ๋๋ฆฌ์คํธ
์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ
์ธ์ ์ ๋์ ์๋ฆฌ
์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ์ ์๋ฒ๊ฐ ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ์๋ฒ ์ธก์ ์ ์ฅํ๋ ๋ฐฉ์์ ๋๋ค. ๋์ ๋ฐฉ์์ ์ดํดํ๋ฉด ๋ณด์๊ณผ ํ์ฅ์ฑ ๋ฌธ์ ๋ฅผ ๋ ์ ๋ค๋ฃฐ ์ ์์ต๋๋ค. ์ธ์ ์ธ์ฆ ํ๋ฆ:- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ๊ฐ ์ธ์ ID๋ฅผ ์์ฑ
- ์ธ์ ๋ฐ์ดํฐ(์ฌ์ฉ์ ID ๋ฑ)๋ฅผ ์ธ์ ์คํ ์ด์ ์ ์ฅ
- ์ธ์ ID๋ฅผ ์ฟ ํค๋ก ํด๋ผ์ด์ธํธ์ ์ ์ก
- ์ดํ ์์ฒญ๋ง๋ค ์ฟ ํค์ ์ธ์ ID๋ก ์ฌ์ฉ์ ์ธ์ฆ
- ์๋ฒ๊ฐ ์ธ์ ์ ์์ ํ ์ ์ด (์ธ์ ๋ ๋ฌดํจํ ๊ฐ๋ฅ)
- ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ํด๋ผ์ด์ธํธ์ ๋ ธ์ถ๋์ง ์์
- ๊ตฌํ์ด ๊ฐ๋จํ๊ณ ๊ฒ์ฆ๋ ๋ฐฉ์
- ์๋ฒ์ ์ํ๋ฅผ ์ ์ฅํ๋ฏ๋ก ํ์ฅ์ฑ ๊ณ ๋ ค ํ์
- ์ธ์ ์คํ ์ด๊ฐ ๋จ์ผ ์คํจ ์ง์ (SPOF)์ด ๋ ์ ์์
์ธ์ ์คํ ์ด ์ค์
๋ฉ๋ชจ๋ฆฌ ์คํ ์ด (๊ฐ๋ฐ์ฉ): ๋ฉ๋ชจ๋ฆฌ ์คํ ์ด๋ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์๋ฒ๋ฅผ ์ฌ์์ํ๋ฉด ๋ชจ๋ ์ธ์ ์ด ์ฌ๋ผ์ง๊ณ , ์ฌ๋ฌ ์๋ฒ ์ธ์คํด์ค ๊ฐ์ ์ธ์ ์ ๊ณต์ ํ ์ ์์ต๋๋ค.prefix: ์ธ์ ํค์ ์ ๋์ฌ๋ฅผ ๋ถ์ฌ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ๊ตฌ๋ถttl: Time To Live, ์ธ์ ์๋ ๋ง๋ฃ ์๊ฐ (์ด ๋จ์)client: Redis ํด๋ผ์ด์ธํธ ์ธ์คํด์ค
Redis๋ ํด๋ฌ์คํฐ ๋ชจ๋๋ฅผ ์ง์ํ์ฌ ๊ณ ๊ฐ์ฉ์ฑ(HA)์ ๊ตฌํํ ์ ์์ต๋๋ค. AWS ElastiCache, Azure Cache
for Redis ๋ฑ์ ๊ด๋ฆฌํ ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ด์์ด ๋ ํธ๋ฆฌํฉ๋๋ค.
์ธ์ ๋ง๋ฃ ์ ๋ต
๊ณ ์ ๋ง๋ฃ (Fixed Expiration): ์ธ์ ์ด ์์ฑ๋ ์์ ๋ถํฐ ์ ํด์ง ์๊ฐ์ด ์ง๋๋ฉด ๋ฌด์กฐ๊ฑด ๋ง๋ฃ๋ฉ๋๋ค. ๋ณด์์ฑ์ ๋์ง๋ง ์ฌ์ฉ์ ๊ฒฝํ์ด ์ข์ง ์์ ์ ์์ต๋๋ค.์ธ์ ๋ฐ์ดํฐ ๊ด๋ฆฌ
์ธ์ ์๋ ์ต์ํ์ ์ ๋ณด๋ง ์ ์ฅํด์ผ ํฉ๋๋ค. ์ธ์ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ์ฑ๋ฅ์ด ์ ํ๋๊ณ , ์คํ ๋ฆฌ์ง ๋น์ฉ์ด ์ฆ๊ฐํฉ๋๋ค.JWT ํ ํฐ ๊ด๋ฆฌ
JWT์ ๋์ ์๋ฆฌ
JWT(JSON Web Token)๋ ์ํ๋ฅผ ์ ์ฅํ์ง ์๋(stateless) ์ธ์ฆ ๋ฐฉ์์ ๋๋ค. ์๋ฒ๊ฐ ํ ํฐ์ ์์ฑํ ํ์๋ ํ ํฐ ์์ฒด์ ๋ชจ๋ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ด, ์๋ฒ๊ฐ ๋ณ๋๋ก ์ ์ฅํ ํ์๊ฐ ์์ต๋๋ค. JWT ๊ตฌ์กฐ:- Header: ํ ํฐ ํ์
๊ณผ ์๊ณ ๋ฆฌ์ฆ (์:
{"alg": "HS256", "typ": "JWT"}) - Payload: ์ฌ์ฉ์ ์ ๋ณด์ ํด๋ ์ (์:
{"userId": 123, "role": "user"}) - Signature: ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ๋ ์๋ช
- ์๋ฒ๊ฐ ์ํ๋ฅผ ์ ์ฅํ์ง ์์ ํ์ฅ์ฑ์ด ์ข์
- ๋ง์ดํฌ๋ก์๋น์ค ํ๊ฒฝ์ ์ ํฉ
- ํ ํฐ ์์ฒด์ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ด ๋ณ๋ ์กฐํ ๋ถํ์
- ํ ํฐ์ ์๋ฒ์์ ๊ฐ์ ๋ก ๋ฌดํจํํ๊ธฐ ์ด๋ ค์
- ํ ํฐ ํฌ๊ธฐ๊ฐ ์ฟ ํค๋ณด๋ค ํผ
- ํ ํฐ์ด ํ์ทจ๋๋ฉด ๋ง๋ฃ ์ ๊น์ง ์ฌ์ฉ ๊ฐ๋ฅ
Access Token๊ณผ Refresh Token
Access Token์ API ์์ฒญ์ ์ฌ์ฉ๋๋ ์งง์ ์๋ช ์ ํ ํฐ์ ๋๋ค. ๋ณดํต 15๋ถ~1์๊ฐ ์ ๋์ ์งง์ ์ ํจ๊ธฐ๊ฐ์ ๊ฐ์ง๋๋ค. ํ์ทจ๋๋๋ผ๋ ํผํด๋ฅผ ์ต์ํํ ์ ์์ต๋๋ค. Refresh Token์ Access Token์ ์ฌ๋ฐ๊ธ๋ฐ๊ธฐ ์ํ ๊ธด ์๋ช ์ ํ ํฐ์ ๋๋ค. ๋ณดํต 7์ผ~30์ผ ์ ๋์ ์ ํจ๊ธฐ๊ฐ์ ๊ฐ์ง๋ฉฐ, ์๋ฒ์ ์ ์ฅํ์ฌ ๊ด๋ฆฌํฉ๋๋ค. ์ ๋ ๊ฐ์ ํ ํฐ์ ์ฌ์ฉํ๋์? ๋ง์ฝ Access Token์ ์ ํจ๊ธฐ๊ฐ์ 30์ผ๋ก ์ค์ ํ๋ฉด:- ํ ํฐ์ด ํ์ทจ๋๋ฉด 30์ผ ๋์ ์ ์ฉ๋ ์ ์์
- ์ฌ์ฉ์ ๊ถํ ๋ณ๊ฒฝ์ด ์ฆ์ ๋ฐ์๋์ง ์์
- ํ์ทจ๋ Access Token์ ์งง์ ์๊ฐ๋ง ์ ํจ
- ๊ถํ ๋ณ๊ฒฝ์ ๋น ๋ฅด๊ฒ ๋ฐ์ ๊ฐ๋ฅ
- Refresh Token์ ์๋ฒ์ ์ ์ฅํ์ฌ ๋ฌดํจํ ๊ฐ๋ฅ
Refresh Token ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง
ํ ํฐ ๊ฐฑ์ ๊ตฌํ
ํ ํฐ ๋ฌดํจํ (Logout)
JWT๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง๋ฃ ์ ๊น์ง ์ ํจํ์ง๋ง, ๋ธ๋๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋ก ๋ฌดํจํํ ์ ์์ต๋๋ค.ํ ํฐ ๋ธ๋๋ฆฌ์คํธ ๋ฏธ๋ค์จ์ด
์ค์ ํจํด
๋์ ์ ์ ์ ํ
ํ ๊ณ์ ์ผ๋ก ์ฌ๋ฌ ๊ธฐ๊ธฐ์์ ๋์ ์ ์์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.๋ง๋ฃ๋ ์ธ์ ์ ๋ฆฌ
์ฃผ๊ธฐ์ ์ผ๋ก ๋ง๋ฃ๋ Refresh Token์ ์ญ์ ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํฌ๊ธฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.์ฃผ์์ฌํญ
๋ค์ ๋จ๊ณ
์ธ์ฆ ์ค์
์ธ์ฆ ์์คํ
๊ตฌ์ถ
๋ณดํธ๋ ๋ผ์ฐํธ
Guards๋ก ๊ถํ ์ ์ด
Context
Context ์์ธํ ์์๋ณด๊ธฐ
Workflows
์์
์ค์ผ์ค๋ง