์ธ์ฆ์ด๋ ๋ฌด์์ธ๊ฐ
์ธ์ฆ์ ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ํ์ธํ๋ ๊ณผ์ ์
๋๋ค.
๋ก๊ทธ์ธ์ ์๋ก ๋ค๋ฉด, ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์์ด๋์ ๋น๋ฐ๋ฒํธ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๊ฐ๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ ๊ณผ์ ์ด ๋ฐ๋ก ์ธ์ฆ์
๋๋ค.
์๋ฅผ ๋ค์ด ์ถ์ ์ฆ์ ๋ฐ๋ ์ํฉ์ ์๊ฐํด๋ณด์๋ฉด ์ดํด๊ฐ ์ฝ์ต๋๋ค. ์ถ์ ์ฆ์ ํตํด ํด๋น ์ธ๋ฌผ์ด ์ค์ ๊ตฌ์ฑ์์ธ์ง ์ ์ฆํ๋ ๊ฒ์ด ๊ณง ์ธ์ฆ์ ๋๋ค.
์ธ์ฆ ์ฒ๋ฆฌ๊ฐ ๋์ง ์์ผ๋ฉด ์๋ฒ๋ ํด๋ผ์ด์ธํธ์๊ฒ 401 ์๋ฌ๋ฅผ ์๋ตํ ์ ์์ต๋๋ค.
401 ์๋ฌ๋ "๊ถํ ์์(Unauthorized)"์ ์๋ฏธํ๋ HTTP ์ํ ์ฝ๋๋ก, ์ฌ์ฉ์๊ฐ ์์ฒญํ ๋ฆฌ์์ค์ ์ ๊ทผํ๊ธฐ ์ํ ์ ํจํ ์ธ์ฆ ์ ๋ณด(๋ก๊ทธ์ธ ์ ๋ณด ๋ฑ)๊ฐ ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค.
์ด ์๋ฌ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๋ค์ ํ์ธํ๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ์
๋ ฅํ๊ฑฐ๋, ๋ธ๋ผ์ฐ์ ์บ์๋ฅผ ์ญ์ ํ๊ฑฐ๋, ์ฌ์ดํธ ๊ด๋ฆฌ์์๊ฒ ๋ฌธ์ํ์ฌ ๊ณ์ ์ ๊ทผ์ ์์ฒญํด์ผ ํฉ๋๋ค.
- 401 Unauthorized
- “ํ์ฌ ์์ฒญ์ ์ธ์ฆ์ด ํ์ํ๋ค”๋ ๋ป์ ๋๋ค.
- ์ฆ, ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ์ ์ ์๋ ์ํ์ ๋๋ค.
- ์ฃผ์ ์ํฉ
- ๋ก๊ทธ์ธํ์ง ์์ ์ฌ์ฉ์๊ฐ ๋ณดํธ๋ API ํธ์ถ ์๋
- ์๋ชป๋ ํ ํฐ(JWT) ๋๋ ๋ง๋ฃ๋ ํ ํฐ์ผ๋ก ์์ฒญ
- Authorization ํค๋๊ฐ ๋๋ฝ๋ ๊ฒฝ์ฐ
์ธ๊ฐ๋ ๋ฌด์์ธ๊ฐ
์ธ๊ฐ(Authorization)๋ ์ธ์ฆ๋ ์ฌ์ฉ์์๊ฒ ํน์ ์์์ ๋ํ ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํ๊ฑฐ๋ ๊ฒ์ฆํ๋ ๊ณผ์ ์
๋๋ค.
์ฆ, “๋๊ตฌ์ธ์ง”๊ฐ ํ์ธ๋ ๋ค, “๋ฌด์์ ํ ์ ์๋๊ฐ”๋ฅผ ํ๋จํ๋ ๋จ๊ณ์
๋๋ค.
์๋ฅผ ๋ค์ด ๊ฐ์ ํ์ฌ ์ถ์ ์ฆ์ ๊ฐ์ง ๋ ์ฌ๋์ด๋ผ๋, ํ ๋ช ์ 14์ธต๊น์ง๋ง ๊ฐ ์ ์๊ณ ๋ค๋ฅธ ํ ๋ช ์ 12์ธต VIP ๊ตฌ์ญ์๋ ๊ฐ ์ ์๋ค๊ณ ํ๋ฉด, ์ด ์ฐจ์ด๊ฐ ์ธ๊ฐ์ ๋๋ค.
๊ถํ์ด ํ์ฉ ๋์ง ์์ผ๋ฉด ์๋ฒ๋ ํด๋ผ์ด์ธํธ์๊ฒ 403 ์๋ฌ๋ฅผ ์๋ตํ ์ ์์ต๋๋ค.
403 Forbidden ์ค๋ฅ๋ ํด๋ผ์ด์ธํธ(์ฌ์ฉ์)๊ฐ ์น ์๋ฒ์ ์์ฒญ์ ๋ณด๋์ง๋ง, ์๋ฒ๊ฐ ํด๋น ์์ฒญ์ ๋ํ ์ ๊ทผ ๊ถํ์ด ์๋ค๊ณ ํ๋จํ์ฌ ์ ๊ทผ์ ๊ฑฐ๋ถํ ๋ ๋ฐ์ํ๋ HTTP ์ํ ์ฝ๋์ ๋๋ค. ์ด ์ค๋ฅ๋ ์๋ฒ๊ฐ ์ฌ์ฉ์๋ฅผ ์ธ์ํ์ง๋ง, ํน์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ด ์์์ ์๋ฏธํฉ๋๋ค.
- 403 Forbidden
- “์์ฒญ์ ์ดํดํ์ง๋ง, ์ธ๊ฐ๋์ง ์์ ์ฌ์ฉ์๋ผ์ ๊ฑฐ๋ถํ๋ค”๋ ๋ป์ ๋๋ค.
- ์ฆ, ๋๊ตฌ์ธ์ง๋ ์์ง๋ง ๊ถํ์ด ์๋ ์ํ์ ๋๋ค.
- ์ฃผ์ ์ํฉ
- ์ผ๋ฐ ์ฌ์ฉ์(USER)๊ฐ ๊ด๋ฆฌ์ ํ์ด์ง(ADMIN)์ ์ ๊ทผ
- ํ์ผ ๋ค์ด๋ก๋ ๊ถํ์ด ์๋ ๊ณ์ ์ด ํด๋น ๋ฆฌ์์ค๋ฅผ ์์ฒญ
- RBAC(Role Based Access Control)์์ ๊ถํ ๋งค์นญ ์คํจ
401 vs 403 ์ฐจ์ด ์ ๋ฆฌ
| 401 Unauthorized | 403 Forbidden | |
| ๋ฌธ์ | ์ธ์ฆ ์คํจ (๋๊ตฐ์ง ๋ชจ๋ฆ) | ์ธ๊ฐ ์คํจ (๋๊ตฐ์ง๋ ์๋๋ฐ ๊ถํ ์์) |
| ์์ธ | ๋ก๊ทธ์ธ ํ์, ํ ํฐ ์์/๋ง๋ฃ/์๋ชป๋จ | ๊ถํ(Role, Scope) ๋ถ์กฑ |
| ํด๊ฒฐ | ์ฌ๋ก๊ทธ์ธ, ํ ํฐ ๊ฐฑ์ ํ์ | ๊ด๋ฆฌ์ ๊ถํ ์์ฒญ, ๊ถํ ์ ์ฑ ์์ ํ์ |
| ์์ | ๋ง๋ฃ๋ JWT ํ ํฐ ์์ฒญ | USER ๊ถํ์ผ๋ก ADMIN API ํธ์ถ |
์น ์๋น์ค์์์ ์ ์ฉ
ํญ์ ์ธ์ฆ → ์ธ๊ฐ ์์ผ๋ก ์งํ๋ฉ๋๋ค. ์ธ์ฆ์ด ์ ํ๋์ง ์์ผ๋ฉด ์ธ๊ฐ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค.
“์ด ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ๋ชจ๋ฅด๋ ์ํ์์ ๊ถํ์ ์ค ์๋ ์๊ธฐ ๋๋ฌธ”์
๋๋ค.
- ์ธ์ฆ: ๋ก๊ทธ์ธ (์์ด๋/๋น๋ฐ๋ฒํธ, OAuth ์์ ๋ก๊ทธ์ธ, ์ธ์ฆ ์๋ฒ ๊ธฐ๋ฐ)
- ์ธ๊ฐ: ๊ถํ(Role)์ ๋ฐ๋ฅธ ์ ๊ทผ ์ ์ด (์: USER๋ ์์ ์ด ์์ฑํ ๊ธ๋ง ์์ ๊ฐ๋ฅ, ADMIN์ ๋ชจ๋ ๊ธ ์ญ์ ๊ฐ๋ฅ)
์๋น์ค ์ฑ์ฅ์ ๋ฐ๋ฅธ ์ธ์ฆ·์ธ๊ฐ์ ๋ณ์ฒ์ฌ
๊ธฐ๋ณธ ์ธ์ฆ(Basic Auth)
๋จ์ผ ์๋ฒ, ๋จ์ API์์ “์ง๊ธ ๋น์ฅ ์ธ์ฆ๋ง ๋๋ฉด ๋๋ค”๋ ์๊ตฌ์ํฉ์ ๋ง์กฑ์ํค๊ธฐ ์ํด, ์ด๊ธฐ ํ๋ก์ ํธ ์ธ์ฆ์ธ๊ฐ๋ก ์ฌ์ฉํ์ต๋๋ค. ๋ธ๋ผ์ฐ์ /ํด๋ผ์ด์ธํธ๊ฐ Authorization: Basic <base64(id:pw)> ํค๋๋ฅผ ๋ณด๋ ๋๋ค. ๋๋ ํผ ๋ฐ์ดํฐ์ ๊ณ์ ์ ๋ณด์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณด๋ด๊ธฐ ๋ ํ์ฃ . ๊ตฌํ์ด ๋งค์ฐ ๋จ์ํฉ๋๋ค. ์๋ฒ๋ ๋งค ์์ฒญ๋ง๋ค ํค๋๋ฅผ ๋ณตํธํํ์ฌ DB๋ก ๊ฒ์ฆํ๋ฉด ๋์ ๋๋ค.

ํ์ง๋ง, ๋งค์ฐ ์ฌ๋ฌ๊ฐ์ง ๋จ์ ๊ณผ ๋ณด์์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
- ์๊ฒฉ์ฆ๋ช ์ด ๋ฐ๋ณต ์ ์ก๋ฉ๋๋ค. ์ ์ถ ์ ํผํด๊ฐ ํฝ๋๋ค.
- ๋ก๊ทธ/๋ฆฌํผ๋ฌ/ํ๋ก์ ๋ฑ์์ ํ์ ์ด ๋จ๊ธฐ ์ฝ์ต๋๋ค.
- ์ธ์ (์ํ)์ด ์์ด UX๊ฐ ๋จ์ด์ง๊ณ , ๊ถํ ๋ณ๊ฒฝ/๋ก๊ทธ์์ ์ ์ด๊ฐ ์ด๋ ต์ต๋๋ค.
๋ด๋ถ๋ง ์์ค์ด ์๋๋ผ๋ฉด ํผํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํด๋ผ์ด์ธํธ ์ ์ฅ(์ฟ ํค/์คํ ๋ฆฌ์ง์ id/pw)
๋งค ์์ฒญ ์๊ฒฉ์ฆ๋ช ์ ํ์ดํํ๊ธฐ ๋ถํธํฉ๋๋ค. ๊ทธ๋์ ์ฟ ํค/๋ก์ปฌ์คํ ๋ฆฌ์ง์ id/pw๋ฅผ ๋ฃ์ด ์๋์ผ๋ก ๋ณด๋ด๋ ํจํด์ ์ผ์ต๋๋ค.
ํ ๋ฒ ๋ก๊ทธ์ธํ๋ฉด ๊ณ์ ์์ฒญ์ด ๊ฐ๋ฅํ๋ฏ๋ก ๋งค์ฐ ํธํ๊ฒ ์ธ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๋งํผ ํด์ปค๋คํํ ๋ ํธํ๊ฒ ์ ์ฉ์ด ๊ฐ๋ฅํด์ก์ต๋๋ค.

- ์๊ฒฉ์ฆ๋ช ์์ฒด๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ์ฅํ๋ฏ๋ก XSS·๋๋ฒ๊ฑฐ·ํ์ฅํ๋ก๊ทธ๋จ·๋ฌผ๋ฆฌ์ ํ์ทจ์ ์ทจ์ฝํฉ๋๋ค.
- ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ ์ ์ฑ , ๊ต์ฒด ์ฃผ๊ธฐ, ์ ์ถ ๊ฐ์ง์ ์ถฉ๋ํฉ๋๋ค.
์๊ฒฉ์ฆ๋ช ์ ํด๋ผ์ด์ธํธ์ ์ ์ฅํ๋๊ฑด ํด์ปค๋ค์๊ฒ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ณต๊ฐํ ์ ์๋ ์ํ์ด ์์ผ๋ฏ๋ก ์ ์ผ ํผํด์ผ ํฉ๋๋ค.
์๋ฒ ์ธ์ (Session in App Memory)
์ ํด๋ผ์ด์ธํธ์ ์๊ฒฉ์ฆ๋ช ์ ์ ์ฅํ๋ ๊ฑธ ๋ณด์ํ๊ธฐ ์ํด ์๋ฒ์ ์ธ์ ๊ฐ๋ ์ด ๋์ ๋์ต๋๋ค. “id/pw ๋์ ์ธ์ ID๋ง ๊ฐ๊ณ ๋ค๋์.” ๊ทธ๋ฆฌ๊ณ ์น ํต์ ์ ํ ๋ ์ด ์ธ์ ID ๋ฅผ ์ฃผ๊ณ ๋ฐ์๋ผ๋ ์ทจ์ง์ ๋๋ค.
- ๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์๋ฒ๊ฐ sessionId๋ฅผ ๋ง๋ค๊ณ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ(in-memory)์ ์ฌ์ฉ์ ์ํ๋ฅผ ์ ์ฅํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ฟ ํค๋ก sessionId๋ง ๋ณด๊ดํฉ๋๋ค.

ํด๋ผ์ด์ธํธ์๋ ๋ฏผ๊ฐ ์ ๋ณด๊ฐ ๋จ์ง ์๊ณ , ์๋ฒ์์ ์ธ์ ๋ง๋ฃ/๊ฐ์ ์ข ๋ฃ/๊ถํ ์ฆ์ ๋ฐ์์ด ๊ฐ๋ฅํด์ก์ต๋๋ค. ๋ํ ์ฟ ํค์ HttpOnly/Secure/SameSite๋ฅผ ๋ถ์ฌ XSS·CSRF ๋ด์ฑ์ ๊ฐํํ ์ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ์ ์๊ฒฉ ์ฆ๋ช ์ ๋ณด๋ค์ ๋ค๊ณ ์๋ ๊ฒ๋ณด๋ค ๋งค์ฐ ์ ์ฉํด์ก์ง๋ง, ๋ช๋ช ๋ถ์กฑํ ์ฌํญ์ด ์์ต๋๋ค.
- ์๋ฒ ์ฌ๊ธฐ๋ ์ ๋ฉ๋ชจ๋ฆฌ ์ธ์ ์ด ๋ชจ๋ ์ฌ๋ผ์ง๋๋ค.
- ์ํ ํ์ฅ ์ ๋ฌธ์ ๊ฐ ์์๋ฉ๋๋ค.(๋จ์ผ ์ธ์คํด์ค/์๊ท๋ชจ ์๋น์ค์์๋ง ์ ์ฉ)
๊ณต์ ์ธ์ ์คํ ๋ฆฌ์ง
์๋น์ค๊ฐ ์ ๋๋ฉด ์๋ฒ๋ฅผ ๋๋ฆฝ๋๋ค. ์ฌ๊ธฐ์ ์ธ์ ์ผ๊ด์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฌ์ฉ์๋ 1๋ฒ ์๋ฒ์ ๋ก๊ทธ์ธ์ ์๋ํ๊ณ , 1๋ฒ ์๋ฒ๋ ์ฌ์ฉ์์ ๋ํ ์ธ์ ์ ๋ณด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ์ฌ ์๊ณ ์๊ฒ ๋ฉ๋๋ค. ๊ทผ๋ฐ ์ฌ์ฉ์๊ฐ ๋ค์ ์์ฒญ์๋ณด๋์ ๋ ๋ก๋๋ฐธ๋ฐ์์ ์ํด 2๋ฒ ์๋ฒ์ ์์ฒญ์ด ๊ฐ๋ค๋ฉด, 2๋ฒ ์๋ฒ๋ ์ฌ์ฉ์์ ์ธ์ ์ ๋ณด๋ฅผ ์์ ์๊ธฐ ๋๋ฌธ์ 401 ์๋ฌ๋ ๋ฐํํ ๊ฒ์ ๋๋ค. ๋ถ๋ช ์ฌ์ฉ์๋ ์ด๋ฏธ ๋ก๊ทธ์ธ์ ํ๋๋ฐ๋ ๋ง์ด์ฃ .

์ด๊ฑธ ํด๊ฒฐํ๊ธฐ ์ํด 1๋ฒ ์๋ฒ์ ๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ผ๋ฉด ์์ผ๋ก ๊ณ์ 1๋ฒ ์๋ฒ๋ก ์์ฒญ์ ๋ผ์ฐํ ํ ์ ์์ต๋๋ค. ์คํฐํค ์ธ์ (์ธ์ ์ดํผ๋ํฐ) ๋๋ถ์ ๋น์ฅ์ ์ธ์ ์ ๋ณด๋ฅผ ๋ชป์ฐพ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ํ์ง๋ง, ์ฌ์ ํ ๋ฌธ์ ์ ์ด ์์ต๋๋ค.
- ํด๋น ์๋ฒ๊ฐ ๋ด๋ ค๊ฐ๋ฉด ์ธ์ ์ ์ค.
- ํธ๋ํฝ ์ ๋ฆผ·์ค์ผ์ผ ์ธ/์์ ์ ์ํ ์ด๋์ด ์ด๋ ต์ต๋๋ค.
์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด ๋์จ ๊ฐ๋ ์ด ๊ณต์ ์ธ์ ์คํ ๋ฆฌ์ง์ ๋๋ค. ์ธ์ ์ ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ๊ฐ ์ ์ฅํ๋ ๊ฒ์ด ์๋, ์ธ๋ถ ์ ์ฅ์(๋ณดํต Redis) ์ ๋ณด๊ดํฉ๋๋ค. ๋ชจ๋ ์๋ฒ๊ฐ ๊ฐ์ ์ ์ฅ์๋ฅผ ์กฐํํฉ๋๋ค.
- ์ด๋ ์๋ฒ๋ก ๊ฐ๋ ์ธ์ ์ ๋ณด๋ฅผ ์กฐํํ ์ ์์ต๋๋ค. → ์ํ ํ์ฅ ์ฉ์ด.
- ์ธ์ ๋ง๋ฃ/๊ฐ์ ์ข ๋ฃ/๋ธ๋๋ฆฌ์คํธ ๊ด๋ฆฌ๊ฐ ์ฝ์ต๋๋ค.

ํ์ง๋ง, ๊ณต์ ์ธ์ ์คํ ๋ฆฌ์ง๋ฅผ ๋์ ํ๊ฒ ๋๋ฏ๋ก์จ ๋ฐ๋ผ์ค๋ ๋จ์ ๊ณผ ์๊ณผ์ ๋ ์๊ฒผ์ต๋๋ค.
- ์ธ์ ์ ์ฅ์๊ฐ ํซ ์คํ/๋จ์ผ ์ฅ์ ์ง์ (SPOF) ๊ฐ ๋ฉ๋๋ค → ํด๋ฌ์คํฐ๋ง, ๋ณต์ , ๋ชจ๋ํฐ๋ง ํ์.
- ๋ชจ๋ ์์ฒญ์ด ์ธ๋ถ ์ ์ฅ์๋ฅผ ๊ฑฐ์น๋ฉด ๋ ์ดํด์·๋น์ฉ ์ฆ๊ฐ.
- ๋๊ท๋ชจ ํธ๋ํฝ์์ ์ธ์ I/O๊ฐ ๋ณ๋ชฉ์ด ๋ ์ ์์ต๋๋ค.
ํ ํฐ ๊ธฐ๋ฐ(Stateless)์ผ๋ก ์ ํ
HTTP ํ๋กํ ์ฝ ์์ฒด๊ฐ ๋ฌด์ํ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค. ๊ฐ๋จํ๊ฒ ๋ฌด์ํ์ฑ์ด๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ด์ ์์ฒญ ์ํ๋ฅผ ๋ณด์กดํ์ง ์๋ ํน์ฑ์ ๋งํฉ๋๋ค. ์๋ฒ๋ ๋งค ์์ฒญ์ ๋ ๋ฆฝ์ ์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ฉฐ, ์ด์ ์์ฒญ์ ๋งฅ๋ฝ์ด๋ ์ธ์ ์ ๊ธฐ์ตํ์ง ์์ต๋๋ค. ํ์ง๋ง ๊ณต์ ์ธ์ ์คํ ๋ฆฌ์ง๋ ์ฌ์ฉ์์ ์ธ์ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฌด์ํ์ฑ์ ์ด๊ธ๋ฉ๋๋ค.
“์ธ์ ์ํ๋ฅผ ์ค์์ ๋๋ ๋์ , ์๋ช ๋ ํ ํฐ์ผ๋ก ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ค๊ณ ๋ค๋์.” ๋ผ๋ ๊ฐ๋ ์ผ๋ก ๋์จ ๊ธฐ์ ์ด ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์ธ๊ฐ์ ๋๋ค.
์๋ฒ๊ฐ ๋ก๊ทธ์ธ ์ ์ํฌ๋ฆฟ ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ช ๋ Self-contained Token๋ฅผ ๋ฐ๊ธํฉ๋๋ค. ์ดํ ์์ฒญ๋ค์ ์๋ฒ์์ ๋ด๋ถ ์ ์ฅ์ ์กฐํ ์์ด ์ํฌ๋ฆฟ ํค๋ก ํ ํฐ ์๋ช ๊ฒ์ฆ๋ง์ผ๋ก ์ธ์ฆ์ ๋๋ ๋๋ค.

Self-Contained Token (์๊ฐ ํฌํจ ํ ํฐ)
Self-contained ํ ํฐ์ ์ธ์ฆ๊ณผ ์ธ๊ฐ์ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ณ๋์ ์กฐํ ์๋น์ค ์์ด ํ ํฐ ์์ฒด์ ๋ด๊ณ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ๋ณดํต JWT(JSON Web Token) ํํ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ํ ํฐ์ ๋์งํธ ์๋ช ์ด ๋์ด ์๊ธฐ ๋๋ฌธ์, ์์ ์๋ฒ๋ ์ธ๋ถ ์กฐํ ์์ด ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ๊ณ ์ฌ์ฉ์ ์ ์๊ณผ ๊ถํ(ํด๋ ์)์ ์ถ์ถํ ์ ์์ต๋๋ค. ํ ํฐ ์์ฒด๋ก๋ ํด๋ ํ๊ธฐ ์ฌ์ ๋น๋ฐ๋ฒํธ ๊ฐ์ ์ ๋ณด๋ค์ ๋ด์ง๋ ์์ต๋๋ค. ์ด๋ฆ, ๋ง๋ฃ ๊ธฐํ, ๊ถํ๋ฑ์ ์ ๋ณด๋ฅผ ๋ฃ์ ์ ์์ต๋๋ค.
Self-Contained Token์ ๋์ ๋ฐฉ์
- ๋ฐ๊ธ(Issuance)
- ์ฌ์ฉ์๊ฐ ์ธ์ฆ์ ์ฑ๊ณตํ๋ฉด, ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ self-contained ํ ํฐ์ ๋ฐ๊ธํฉ๋๋ค.
- ๋ด์ฉ(Contents)
- ํ ํฐ์๋ ์ฌ์ฉ์ ๋๋ ํด๋ผ์ด์ธํธ์ ์ ์, ๊ถํ, ๊ทธ๋ฆฌ๊ณ ๊ธฐํ ๋ฉํ๋ฐ์ดํฐ๊ฐ ํฌํจ๋๋ฉฐ, ํ ํฐ์ ๊ตฌ์กฐ ์์ ์ธ์ฝ๋ฉ๋ฉ๋๋ค.
- ์ ๋ฌ(Verification)
- ํด๋ผ์ด์ธํธ๋ ๋ฐ๊ธ๋ฐ์ ํ ํฐ์ API ์์ฒญ์ ํจ๊ป ์ ์กํฉ๋๋ค. (์ฃผ๋ก Authenticate ํค๋)
- ์๋ฒ ์ธก ๊ฒ์ฆ(Server-Side Validation)
- ๋ฆฌ์์ค๋ฅผ ๋ฐ๋ ์๋ฒ๋ ํ ํฐ์ ์๋ช ์ ์ง์ ๊ฒ์ฆํ๊ณ , ๋ด๋ถ์ ๋ด๊ธด ํด๋ ์์ ์ถ์ถํ์ฌ ์ฌ์ฉ์์ ์ ์์ ํ์ธํ๊ณ ์ ๊ทผ ๊ถํ์ ํ์ฉํ๊ฑฐ๋ ๊ฑฐ๋ถํฉ๋๋ค.
์ธ๋ถ ์ธ์ ์ ์ฅ์๊ฐ ํ์ ์์ผ๋ฏ๋ก ๋ ์ดํด์·๋น์ฉ ์ ๊ฐ, ์ฅ์ ๋ฉด์ ์ ์ถ์ํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ๋ํ ์๋ฒ๋ฅผ ๋ฌดํํ ๋๋ ค๋ ๊ทธ ์๋ฒ ์์ฒด์์ ์ํฌ๋ฆฟ ํค๋ก ๊ฒ์ฆ๋ง ํ๋ฉด ๋๋ฏ๋ก ์๋ฒ ์ํ ํ์ฅ์ ์ต์ ์ ๋๋ค.
ํ์ง๋ง, ์ด์ ๋ฐ๋ฅธ ๋ฌธ์ ์ ๋ ์์ฃ .
- ํ์ทจ๋๋ฉด ๋ง๋ฃ ์ ๊น์ง ๋ง๊ธฐ ์ด๋ ต์ต๋๋ค(์๋ฒ๊ฐ ์ํ๋ฅผ ๋ค๊ณ ์์ง ์๊ธฐ ๋๋ฌธ).
- ์ฆ์ ๊ฐ์ ๋ก๊ทธ์์/๊ถํ๋ฐํ์ด ์ด๋ ต์ต๋๋ค(์ด๋ฏธ ๋ฐ๊ธ๋ ํ ํฐ์ ์ ํจ).
- ํ ํฐ ํฌ๊ธฐ๊ฐ ์ปค์ง๋ฉด ํค๋ ๋น์ฉ์ด ์ฆ๊ฐํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ ํฐ๋ Access Token๊ณผ Refresh Token์ผ๋ก ๋๋๊ณ , ์ธ์ฆ์ธ๊ฐ ๋ฐฉ์๋ ํ์ด๋ธ๋ฆฌ๋ ํ์์ ์ฌ์ฉํ๋๋ก ๋ฐ๋์์ต๋๋ค.
Access Token
Access Token์ ์ฌ์ฉ์๊ฐ ์ธ์ฆ์ ์ฑ๊ณตํ์ ๋ ๋ฐ๊ธ๋๋ ์งง์ ์๋ช ์ ํ ํฐ์ผ๋ก, ๋ฆฌ์์ค์ ์ ๊ทผ(API)ํ ๋ ๋งค ์์ฒญ๋ง๋ค ํฌํจ๋ฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ API ํธ์ถ ์ Authorization: Bearer <access_token> ํค๋์ ๋ด์ ์ ์กํฉ๋๋ค.
- ํ์ทจ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ ๋ณดํต ์๋ช ์ด ์งง์ต๋๋ค. (5๋ถ~15๋ถ ์ ๋ ๊ถ์ฅ)
- ์๋ฒ๋ ์ถ๊ฐ ์กฐํ ์์ด ํ ํฐ ์๋ช ๋ง ๊ฒ์ฆํ๋ฉด ๊ถํ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ ๊ฒ Access Token ์์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ฌด์ํ์ฑ์ ๋ณด์ฅํ๊ฒ ๋๊ณ , ๋ถํ์ํ ์ธ์ ์คํ ๋ฆฌ์ง ์กฐํ๋ ํ ํ์๊ฐ ์๋ ๊ฒ์ด์ฃ .
Refresh Token
Refresh Token์ Access Token์ด ๋ง๋ฃ๋์์ ๋, ์๋ก์ด Access Token์ ๋ฐ๊ธ๋ฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฐฑ์ ์์ฒญ ํ ํฐ์ ๋๋ค.


- ์ผ๋ฐ์ ์ผ๋ก ์๋ฒ ์ธก ์ ์ฅ์(์: Redis, DB)์ ๊ธฐ๋กํ์ฌ ๊ด๋ฆฌํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ Refresh Token์ ๋ณด๊ดํ๊ณ ์๋ค๊ฐ Access Token์ด ๋ง๋ฃ๋๋ฉด ์ฌ๋ฐ๊ธ ์์ฒญ์ ํฉ๋๋ค.
- ์๋ช ์ ๊ธธ๊ฒ ์ค์ ํฉ๋๋ค. (๋ฉฐ์น ~ ๋ช ์ฃผ)
- ๋ณด์ ๊ฐํ๋ฅผ ์ํด Refresh Token ํ์ (Rotation) ๊ธฐ๋ฒ์ ์๋๋ค. → ์ฌ๋ฐ๊ธ ์๋ง๋ค ์๋ก์ด Refresh Token ๋ฐ๊ธ, ๊ธฐ์กด ๊ฒ์ ์ฆ์ ํ๊ธฐ. ์ด์ RT๊ฐ ๋ค์ ์ค๋ฉด ํ์ทจ๋ก ๊ฐ์ฃผํ๊ณ ์ ์ฒด ์ธ์ ์ ๋ฌดํจํํฉ๋๋ค.
์ด๋ ๊ฒ Access Token ๊ณผ Refresh Token์ ํ์ฉํ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ธ๊ฐ๋ ๋น๊ต ๋ณด์๊ณผ ํธ์์ฑ์ ๊ท ํ์ ๋ง์ถ ์ ์์์ต๋๋ค. ํ์ง๋ง RT ์ ์ฅ์๋ ๊ฒฐ๊ตญ ๋ ํ๋์ ์ค์์ํ์ ๋๋ค. ๋ค๋ง ์ ๊ทผ ๋น๋๊ฐ ๋ฎ๊ณ , Access ๊ฒ์ฆ์ ์ฌ์ ํ ๋ฌด์ํ๋ผ ๋ณ๋ชฉ์ด ํฌ๊ฒ ์ค์ด๋ญ๋๋ค.
OAuth 2.0
์ฌ๋ฌ ๊ฐ์ง ์น์๋น์ค๊ฐ ๋ฐ์ ํ๋ฉด์, ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ฅ์ ํ์ฉํ๋ ์๋น์ค๋ ์ ์ ๋ง์์ก์ต๋๋ค. ์๋ฅผ ๋ค์ด, A ์๋น์ค๊ฐ ๊ตฌ๊ธ ์บ๋ฆฐ๋์ ์ฐ๋ํด ์ฌ์ฉ์์ ์ผ์ ์ ํตํฉ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๊ฒฝ์ฐ A ์๋น์ค๋ ์ฌ์ฉ์์ ๊ตฌ๊ธ ์บ๋ฆฐ๋์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ด ํ์ํฉ๋๋ค.
๊ณผ๊ฑฐ ๋ฐฉ์์ด๋ผ๋ฉด A ์๋น์ค๊ฐ ์ฌ์ฉ์์ ๊ตฌ๊ธ ๊ณ์ ID์ PW๋ฅผ ์ง์ ๋ฐ์ ์ ์ฅํ๊ณ , ์ด๋ฅผ ํตํด ๊ตฌ๊ธ ์บ๋ฆฐ๋์ ์ ๊ทผํ๋ ์์ผ๋ก ๊ตฌํํ์ต๋๋ค. ํ์ง๋ง ์ด ๋ฐฉ์์๋ ์น๋ช
์ ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
- ๋ณด์ ์ํ
์ฌ์ฉ์์ ๊ตฌ๊ธ ๊ณ์ ID/PW๋ฅผ A ์๋น์ค๊ฐ ์ง์ ๋ณด๊ดํ๊ธฐ ๋๋ฌธ์, ์ ์ถ ์ ๊ตฌ๊ธ ์บ๋ฆฐ๋๋ฟ ์๋๋ผ ๊ตฌ๊ธ ๋๋ผ์ด๋ธ, ์ง๋ฉ์ผ ๋ฑ ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ์ํ์ ๋ ธ์ถ๋ฉ๋๋ค. - ์๋น์ค ์ด์ ๋ถ๋ด
A ์๋น์ค ์ ์ฅ์์๋ ํ์ฌ ์๋น์ค ๊ณ์ ์ ์ง์ ๋ณด๊ดํ๋ค๋ ๊ฒ์ ํฐ ๋ถ๋ด์ ๋๋ค. ๋ณด์์ฌ๊ณ ๊ฐ ๋ฐ์ํ๋ฉด ์๋น์ค ์์ฒด๊ฐ ์ ๋ขฐ๋ฅผ ์๊ณ ์กด์ํ๊ธฐ ์ด๋ ค์์ง๋๋ค. - ํ๋ซํผ ์ ๊ณต์ ์
์ฅ
๊ตฌ๊ธ ๊ฐ์ ์๋น์ค ์ ๊ณต์ ์ ์ฅ์์๋ ๊ฐ๋ ฅํ ๋ณด์ ์ฒด๊ณ๋ฅผ ๋ง๋ จํ๋๋ผ๋, ์ 3์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณด๊ดํ๋ ์๊ฐ ๋ชจ๋ ๋ ธ๋ ฅ์ด ๋ฌด์ฉ์ง๋ฌผ์ด ๋ฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด OAuth 2.0์ ๋๋ค. ํต์ฌ ์์ด๋์ด๋ ์ธ์ฆ(Authentication)์ ์๋น์ค ์ ๊ณต์๊ฐ ์ง์ ํ๊ณ , ์ธ๊ฐ(Authorization, ๊ถํ ์์)๋ ์ 3์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ฐ๋๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
OAuth 2.0 ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋ ๋ธ๋ก๊ทธ ๊ธ์ ๋ฐ๋ก ์ ๋ฆฌํด ๋์์ต๋๋ค.
์ “์ธ์ ์คํ ๋ฆฌ์ง(๊ณต์ ์ธ์ )”๊ฐ ๋์๊ณ , ์ “ํ ํฐ”์ผ๋ก ๊ฐ๋๊ฐ?
| ๋ฐฐ๊ฒฝ/๋ฌธ์ | ์ ํ | ํด๊ฒฐํ ๊ฒ | ๋๊ฐ ๋ฐ ๋ถ์์ฉ |
| ๋จ์ผ ์๋ฒ UX·๋ณด์ ํฅ์ ํ์ | ์๋ฒ ์ธ์ (in-memory) | id/pw๋ฅผ ๋ค๊ณ ๋ค๋์ง ์์, ๋ง๋ฃ/๊ฐ์ ๋ก๊ทธ์์ ๊ฐ๋ฅ | ์ฌ๊ธฐ๋ ์ ์ธ์ ์ ์ค, ์ํ ํ์ฅ ํ๊ณ |
| ๋ค์ค ์๋ฒ/๋ก๋๋ฐธ๋ฐ์ | ๊ณต์ ์ธ์ ์คํ ๋ฆฌ์ง(Redis/DB) | ์๋ฒ ๊ฐ ์ธ์ ์ผ๊ด์ฑ | ์ ์ฅ์๊ฐ ๋ณ๋ชฉ/ํซ์คํ, ๋ชจ๋ ์์ฒญ I/O ์ฆ๊ฐ |
| ์๋ฒ๊ฐ ์ํ์ฑ์ ๊ฐ์ง | ํ ํฐ(JWT) | ๋ฌด์ํ ๊ฒ์ฆ, ๋ฌดํ ์ํ ํ์ฅ, ์ธ๋ถ ์ ์ฅ์ ์ ๊ฑฐ | ์ฆ์ ํ์ ์ด๋ ค์, ํ์ทจ ์ํ → RT ํ์ /๋ธ๋๋ฆฌ์คํธ๋ก ๋ณด์ |
| ์ธ๋ถ ์์ ์ ๊ทผ/SSO | OAuth2 / OIDC | ์ธ์ฆ·์ธ๊ฐ ๋ถ๋ฆฌ, ๋น๋ฐ๋ฒํธ ๋น๋ณด๊ด, ๋ฒ์ ๊ธฐ๋ฐ ์ ๊ทผ | ํ๋กํ ์ฝ ๋ณต์ก์ฑ, ๋ณด์ ํ๋ผ๋ฏธํฐ ์ค์ ํ์ |
๊ฒฐ๊ตญ ํธ๋ํฝ·ํ์ฅ์ฑ·๋ณด์ ๋ชฉํ๊ฐ ๊ธฐ์ ์ ํ์ ํ๊ฒ ๋์ต๋๋ค.
- ๊ณต์ ์ธ์ ์ “๋ฉํฐ ์๋ฒ์ ์ฒซ ๊ณ ๋น”๋ฅผ ๋๊ธฐ๊ธฐ ์ํ ํฉ๋ฆฌ์ ํํ์ด์์ต๋๋ค.
- ํ ํฐ์ “๊ธ๋ก๋ฒ ํ์ฅ์ฑ๊ณผ ๋ฌด์ํ์ฑ”์ ์ํ ๋ค์ ๋จ๊ณ์์ต๋๋ค.
- OAuth/OIDC๋ “ํ ์๋น์ค์์ ์์ ํ ์์๊ณผ ํตํฉ”์ ์ํ ํ์ค์ด์์ต๋๋ค.
'Web programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์ํ์น vs ์์ง์์ค (0) | 2024.03.29 |
|---|---|
| NGINX ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ ์ค์ ํธ๋ฌ๋ธ ์ํ (0) | 2024.02.27 |
| SSL Termination ์ ์ํด NginX ๋ก ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ ๊ตฌ์ถํ๊ธฐ (0) | 2024.02.20 |
| CORS ์๋ฌ ๊ฐ๋ ๊ณผ ํด๊ฒฐ๋ฒ (Spring MVC, Spring Security) (0) | 2023.12.20 |
| Web programming : RESTful URL ์ค๊ณ ๊ท์น (0) | 2023.12.13 |
๋๊ธ