HTTP #9 ์ธ์ -์ฟ ํค, JWTํ ํฐ
by JiwonDev๋ก๊ทธ์ธ/๋ก๊ทธ์์์ฒ๋ผ ์ํ์ ๋ณด๋ฅผ ์ ์งํ๊ธฐ์ํด ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋ค.
์ฟ ํค์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฃ๋๋ค๋ฉด ์ค๊ฐ์ ๊ฐ๋ก์ฑ์(intercept) ์ ๋ณด๊ฐ ํ์ทจ/์ ์ถ๋ ์ ์๋ค.
์ฟ ํค๋ฅผ ์ํธํํ๋ค ํ๋ค, ์ํธํ๋ ์ฟ ํค๋ฅผ ํ๋ฒ ํ์ทจ๋นํ๋ฉด ํ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๊ทธ๋์ ์น ์๋ฒ์ 'Session ์ ์ฅ์'๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ์ฌ์ฉํ๋๊ฒ ์ผ๋ฐ์ ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ์ดํ์ ๋์จ ๋ฐฉ์์ธ JWT ํ ํฐ์ ๋ํด์๋ ์์๋ณด์.
์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ ๊ด์ ์์ ๋ณด๋ ๋ฌผ๋ฆฌ์ ์ธ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- Cookie : ๋ธ๋ผ์ฐ์ ์์ ์๋ต์์ฒญ์ ํฌํจํ์ฌ ๋ณด๋ด๋ ๋ฐ์ดํฐ
- Storage : ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ. ์ฟ ํค์ฒ๋ผ ์๋์ผ๋ก ์๋ต์ ํฌํจํ์ง ์๋๋ค.
- Session : ์๋ฒ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ ์ฅ์, ์ ํจ๊ธฐ๊ฐ์ด ์๋ Session Cookie๋ฅผ ํจ๊ป ํ์ฉ
- Token : ์ธ์ฆ์ ์ํด ์ฌ์ฉ๋๋ ์ํธํ๋ ๋ฌธ์์ด. JSON ๊ฐ์ ํ์์ ๋ฐ์ดํฐ๋ฅผ Base64๋ก ์ํธํํ ๊ฒ์ด๋ค.
โก ํด๋ผ์ด์ธํธ์์๋ ๋ธ๋ผ์ฐ์ LocalStorage์ ํ ํฐ๊ฐ ์ ์ฅํ๊ณ , Static ๋ณ์๋ก ๋ถ๋ฌ์์ ์ฌ์ฉํ๋ค.
# Session๊ณผ Cookie
์๋ฒ์ ์ธ์ ์์ฅ์๋ฅผ ์ด์ฉํ๊ณ ์ฌ์ฉ์์๊ฒ ์ธ์ Key(JSessionID)๋ฅผ ์ฟ ํค๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ ์ธ์ฆ์ ์ฐจ๋ฅผ ๋ฐ์ ๋ก๊ทธ์ธํ๊ฒ ๋๋ค.
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ํ๋ฉด HTTP POST๋ก [ID, PW ์ ๋ณด]๋ฅผ ์๋ฒ์ ์ ๋ฌํ๋ค.
- ์๋ฒ์์๋ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๋ค.
โก ์ธ์ฆ์ ์ฑ๊ณตํ๋ค๋ฉด ์ฌ์ฉ์๋ฐ์ดํฐ๋ฅผ HttpSession์ ์ ์ฅํ๊ณ ์ธ์ ID๋ฅผ ๋ฐํํ๋ค. - ์ธ์ฆ์ ์ฑ๊ณตํ๋ค๋ฉด ์๋ฒ๋ ์ธ์ ID(JSessionID)๋ฅผ ์๋ต์ ๋ฃ์ด ๋ณด๋ธ๋ค.
- ์ดํ ํด๋ผ์ด์ธํธ๋ ์ธ์ ์ฟ ํค์ ์๋ JSessionID๋ฅผ ์์ฒญ์ ํจ๊ป ๋ณด๋ด์ ๋ก๊ทธ์ธ๋์์์ ์ฆ๋ช ํ๋ค.
- ์๋ฒ์์๋ ์ฌ์ฉ์ ์์ฒญ์ JSessionID๊ฐ ์๋ค๋ฉด ์ธ์
์ ์ฅ์์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๊ณ , ์์ฒญ์ ํ๋ฝํด์ค๋ค.
โก ๋ชจ๋ Controller์ ์ธ์ ๊ฒ์ฆ์ ๋ฃ์ผ๋ฉด ๋ฒ๊ฑฐ๋กญ๋ค. ์คํ๋ง ์ธํฐ์ ํฐ๋ฅผ ์ด์ฉํด ์ธ์ ์ ๊ด๋ฆฌํ์.
@ Session์ ์ฅ๋จ์
- ์ฅ์ : ์๋ฒ์์ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค. ๋ํ ํด๋ผ์ด์ธํธ์ ์ ๋ณด๋ ธ์ถ์ ๋ง์ ์ ์๋ค.
- ๋จ์ 1 : JSessionID๋ฅผ ํ์ทจํด๋ฒ๋ฆฌ๋ ์ธ์ ํ์ด์ฌํน์ ๋นํ ์ ์๋ค.
- ๋จ์ 2: ์ธ์
์ ๊ณ์ํด์ ์์ธ๋ค. ์ด๋ ์๋ฒ์ ์ ์ฅ์๋ฅผ ๊ณ์ ์ฐจ์งํ๊ณ , ์๋ฒ์์ ์ธ์
์ ๊ด๋ฆฌํ๋ ๋ถํ๊ฐ ์๊ธด๋ค.
โก ์ธ์ ๊ฐ์ ์ ์งํด์ผ ํ๊ธฐ์ HTTP์ ๋ฌด์ํ์ฑ, ๋น์ฐ๊ฒฐ์ฑ์ ์ป๋ ์๋ฒ Scale-Out์ ์ฅ์ ์ ์๋๋ค.
# HTTP Authentication ์ ์ด ํค๋ - Basic
HTTP๋ ๋ค๋ฅธ ์ธ์ฆ ํ๋กํ ์ฝ์ ์ฌ์ฉํ ์ ์๋๋ก WWW-Authenticate ์ Authoization ์ ์ด ํค๋๋ฅผ ์ ๊ณตํ๋ค.
- ํด๋ผ์ด์ธํธ๋ Authorization ํค๋์ ์ธ์ฝ๋ฉ ๋ฌธ์์ด(* ์ํธํ ๋ ๊ฒ์ด ์๋)์ ์ ์กํ๋ค.
โก [ username+":"+password ] ๊ฐ์ Base64๋ก ์ธ์ฝ๋ฉํ์ฌ [ Basic YWxhZGRpbjP... ] ์ผ๋ก ์๋ฒ๋ก ๋ณด๋ธ๋ค. - ์๋ฒ๋ ํด๋น ๊ฐ์ ๋์ฝ๋ฉํ์ฌ ์ฝ์ด๋ค์ด๊ณ , 401 Unauthorized ๋ฐ์ ์ WWW-Authenticate์ ์คํจ์ด์ ๋ฅผ ์๋ตํ๋ค.
# HTTP Authentication ์ ์ด ํค๋ - Bearer
Bearer๋ ์ง๊พผ, ์ด๋ฐ์ธ์ ์๋ฏธํ๋ค. JWT์ ๊ฐ์ ํ ํฐ ์ธ์ฆ ๋ฐฉ์์์ ์ฌ์ฉ๋๋ค.
- ๋ก๊ทธ์ธ ์ [๋ก๊ทธ์ธํ๋ ์๋ฒ or ๋ค๋ฅธ ์ธ์ฆ์๋ฒ]๋ก ๋ถํฐ Token(์ํธํ๋ ๋ฌธ์์ด)์ ์๋ต ๋ฐ๋๋ค.
- ์ดํ ์์ฒญ์ Authentication ํค๋์ Token ๊ฐ์ ๋ฃ์ด ๋ณด๋ธ๋ค.
- ์ธ์ ์ ๋ณด๊ฐ ํ ํฐ ์์ฒด์ ๋ด์ฅ๋์ด ์๋ค. โก ๋ฌด์ํ HTTP ์์ฒญ์ ์ ์งํ ์ ์๋ค. (์๋ฒ ์ฑ๋ฅ๊ณผ ๋ณด์์ด ๋ฐ์ด๋๋ค)
# Token - JWT (Json Web Token)
JWT๋ ์ธ์ฆ์ ํ์ํ ์ ๋ณด๋ค์ ์ธ์ฝ๋ฉ ์ํจ ํ ๋ฌธ์์ด์ ์๋ฏธํ๋ค.
์๋ฒ์ ์๋ต ๋ฐ์ ๋์๋ Body์ ๋ฐ๊ณ , ์ดํ Authorization ํค๋์[ Bearer <token value> ]๋ก ๋ฃ์ด ๋ณด๋ธ๋ค.
Token์๋ ์๋ฒ์ ๋น๋ฐํค๋ก ๋ง๋ ์ ์์๋ช ์ด ํฌํจ๋์ด ์๋ค. ๊ทธ ์ธ์ ๋ฐ์ดํฐ๋ ์ํธํ ๋์ด์์ง ์๋ค.
Encoded Header + "." + Encoded Payload + "." + Verify Signature
- Token : ์ธ์ฆ์ ์ํด ์ฌ์ฉ๋๋ ์ํธํ๋ ๋ฌธ์์ด. JSON ๊ฐ์ ํ์์ ๋ฐ์ดํฐ๋ฅผ Base64๋ก ์ธ์ฝ๋ฉํ ๊ฒ์ด๋ค.
โก ํด๋ผ์ด์ธํธ์์๋ ๋ธ๋ผ์ฐ์ LocalStorage์ ํ ํฐ๊ฐ ์ ์ฅํ๊ณ , Static ๋ณ์๋ก ๋ถ๋ฌ์์ ์ฌ์ฉํ๋ค.
- Header์๋ ๋๊ตฌ๋ ์ฝ์ ์ ์๋ ์ํธํ ๋ฐฉ์(alg), ๋ฐ์ดํฐ ์ ํํ์ (typ)๋ฑ์ ํฌํจํ๋ค.
- Payload๋ ๋๊ตฌ๋ ์ฝ์ ์ ์๋ ์๋ฒ์ ๋ณด๋ผ ๋ฐ์ดํฐ์ด๋ค. (์ฌ์ฉ์์ ID์ ๋ณด, ์ ํจ๊ธฐ๊ฐ๋ฑ์ด ํฌํจ๋์ด์๋ค)
- Verify Signature๋ [Base64๋ก ์ธ์ฝ๋ฉํ Heaer+Payload] ์ ๋น๋ฐํค๋ก ๋ง๋ ์ํธํ๋ ์ ์์๋ช
์ด๋ค.
- ํ ํฐ Payload์ ๋ค์ด์๋ ๋ฐ์ดํฐ(Claim)๋ค์ ์๋์ ๊ฐ๋ค.
์ธ์ ๊ณผ ๋ค๋ฅธ์ ์, JWT๋ ์๋ฒ์์ ์ธ์ ์ ์ฅ์๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ์ง ์๋๋ค.
- ๊ฐ๊ฐ์ ์์ฒญ์ ๋ณ๊ฐ๋ก ์ฒ๋ฆฌํ๋ค.
- Header์ Verify Signature๋ ๋๊ตฌ๋ ์ฝ์ ์ ์์ง๋ง Payload๋ ์ํธํ๋๋ค.
โก ์ด Payload์์ ์ฌ์ฉ์ ๋ก๊ทธ์ธ์ ํ์ํ ์ ๋ณด(์ด๋ฆ,ID)๊ฐ์๊ฒ ๋ค ํฌํจ๋์ด์๋ค. - ๋ค๋ง ์ธ์ ์ ๋นํด ์ ์กํ๋ ๊ธ์์๊ฐ ํจ์ฌ ๊ธธ์ด ๋คํธ์ํฌ ๋น์ฉ์ด ์ฆ๊ฐํ๋ค๋ ๋จ์ ์ด ์๋ค.
์ธ์ฆ์ ์ฐจ๋ ์๋์ ๊ฐ๋ค.
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ํ๋ค.
- ์๋ฒ์์๋ JWT์ ๊ณ์ ์ ๋ณด๋ฅผ ์ฝ๊ณ ์ฌ์ฉ์์ ๊ณ ์ ID๊ฐ์ ๋ถ์ฌํด Payload์ ๋ฃ๋๋ค.
โก JWT ํ ํฐ์ ์ ํจ๊ธฐ๊ฐ์ ์ค์ ํ๊ณ Payload๋ฅผ ์ํธํํ์ฌ Access Token์ ์๋ต์ ๋ฃ์ด๋ณด๋ธ๋ค.
โก ๊ทธ๋ฆฌ๊ณ ์ฝ์ ์ ์๋ Header์ ์ ์์๋ช Verify Signature๋ฅผ Access Token์ ๋ฃ์ด์ค๋ค. - ์ฌ์ฉ์๋ Access Token์ ์ ์ฅํ ํ, ์ธ์ฆ์ด ํ์ํ ์์ฒญ์ ํ ๋๋ง๋ค ํ ํฐ์ ๊ฐ์ด ๋ณด๋ธ๋ค.
- ์๋ฒ์์๋ ํ ํฐ์ Verify Signature๋ฅผ ๋น๋ฐํค๋ก ๋ณตํธํํ์ฌ ์กฐ์์ฌ๋ถ, ์ ํจ๊ธฐ๊ฐ์ ํ์ธํ๋ค.
- ์๋ช ๊ฒ์ฆ์ด ์๋ฃ๋์๋ค๋ฉด Payload๋ฅผ ๋์ฝ๋ฉํ์ฌ ํ ํฐ์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ฝ์ด๋ค์ธ๋ค.
@ ํ ํฐ(JWT)์ ์ฅ๋จ์
- ์ธ์
/์ฟ ํค์ ๋ค๋ฅด๊ฒ ๋ณ๋์ ์ ์ฅ์๊ฐ ํ์์๊ณ , ์๋ฒ์์ ๋น๋ฐํค ํ๋๋ง ๊ฐ์ง๊ณ ์์๋๊ธฐ์ ๊ฐํธํ๋ค.
โก ์ฌ๋ฌ ์๋ฒ์์ ์ธ์ ์ ์ฅ์๋ฅผ ๋๊ธฐํํ๋ ๊ท์ฐฎ์ ์์ ์ด ํ์์๋ค. Scale-Out์ด ์ฌ์์ง๋ค. - ๋ฐ๊ธํ ํ ํฐ์ ๋ค๋ฅธ ์ธ์ฆ์์คํ
๊ณผ ์ฐ๋ํด์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค. (=ํ ํฐ ๊ธฐ๋ฅ์ ํ์ฅ์ด ์ฝ๋ค.)
โก ์๋ฅผ ๋ค์ด Facebook, Google์์ ๋ฐ๊ธํ ํ ํฐ์ ์ด์ฉํด์ ๋ด ์ฌ์ดํธ์ ๋ก๊ทธ์ธํ๋ OAuth2๋ฑ์ ๋ง๋ค ์ ์๋ค.
๋จ์ ์ ์๋์ ๊ฐ๋ค.
- ๊ฒฐ๊ตญ ์์ฒญ์ ์ค์ด์ ๋ณด๋ด์ผํ๊ธฐ์ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ธฐ ํ๋ค๊ณ , ๋คํธ์ํฌ ๋น์ฉ์ ๋ญ๋น๊ฐ ์๊ธด๋ค.
- Payload๋ ๋๊ตฌ๋ ์ฝ์ ์ ์์ผ๋ฏ๋ก ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์๋ ์๋๋ค.
- JWT์ ์ ํจ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋๊ธฐ ์ ๊น์ง ๊ณ์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค. ํ ํฐ ์์ฒด๋ฅผ ํ์น๋ฉด ๋ต์ด์๋ค.
โก ๊ทธ๋์ Access Token์ ์ ํจ๊ธฐ๊ฐ์ ์งง๊ฒํ๊ณ , Refresh Token์ด๋ผ๋ ์๋ก์ด ํ ํฐ์ ๋ฐ๊ธํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
โก Refresh Token์ AccessToken์ ๋ฐ๊ธฐ์ํ ํ ํฐ์ด๋ค. ์ด๋ ๊ฒ ๊ตฌ์ฑํ๋ฉด ์๋ฒ์์ ํ์ทจ๋ฅผ ๊ฐ์งํ์ ๋ Refresh Token ์์ฒญ์ ๊ฑฐ๋ถํ์ฌ ํน์ ์ธ์ ์ ๋ฉ์ถ๊ฒ ํ ์ ์๋ค. - ๋ณดํต ์ ํจ๊ธฐ๊ฐ์ 1์๊ฐ/30์ผ ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉฐ ๊ทธ๋ฅ AccessToken๋ง ์ฌ์ฉํ๋ ์ฌ์ดํธ๋ ์๊ธดํ๋ค. (github๋ฑ)
# ์ธ์ /์ฟ ํค vs ํ ํฐ(JWT)
์ธ์ /์ฟ ํค ๋ฐฉ์์ ๋งค๋ฒ SessionId๋ฅผ ์ด์ฉํ์ฌ ์ธ์ ์ ์ฅ์์์ ์ฐพ์์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๋ค.
๋ํ ์๋ฒ์์ ๊ณตํต๋ ์ธ์ ์ํ๋ฅผ ๊ด๋ฆฌํด์ผํ๋ค. ์ฌ๋ฌ ์๋ฒ์์์ ์ธ์ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ์๋ค.
2021.12 ์ถ๊ฐ๋ด์ฉ
'๐๊ธฐ๋ณธ ์ง์ > ์น ๊ธฐ๋ณธ์ง์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ทธ๋์ Rest API๊ฐ ๋์ฒด ๋ญ๋ฐ (์ญ์ฌ์ด์ผ๊ธฐ) (0) | 2022.02.26 |
---|---|
๋คํธ์ํฌ OSI 7๊ณ์ธต, TCP/IP 4๊ณ์ธต (0) | 2021.09.08 |
HTTP #8 ํค๋ (์์ฒญํค๋, ์๋ตํค๋, ์ฟ ํค, ์บ์, ํ๋ก์) (0) | 2021.09.06 |
HTTP #7 ์ํ์ฝ๋ (200,300,400,500) (1) | 2021.09.06 |
HTTP #6 ๊ธฐ๋ณธ์ ์ธ API ์ค๊ณ (0) | 2021.09.06 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev