[TIL] JWT
๐๐ป JWT : JSON Web Token
- ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ ์กํ๊ธฐ ์ํด ๊ณ ์๋ ์ธํฐ๋ท ํ์ค ์ธ์ฆ ๋ฐฉ์
- Json ํฌ๋งท์ผ๋ก ์ฌ์ฉ์์ ๋ํ ์์ฑ์ ์ ์ฅํ๋ ์น ํ ํฐ
- ํด๋ผ์ด์ธํธ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ํ ํฐ์ผ๋ก ๋ณด๊ดํ๋ ๋ฐฉ๋ฒ
- ์ (.)์ผ๋ก ๋๋์ด์ง๋ ์ธ๋ถ๋ฌธ ์กด์ฌ
๐JWT์ ๊ตฌ์กฐ
aaaaaaa . bbbbbb . ccccccc
------- ------- --------
Header Payload Signature
(1) Header
{
"alg" : "HS256",
"typ" : "JWT"
}
- ์ด๊ฒ์ด ์ด๋ค ์ข ๋ฅ์ ํ ํฐ์ธ์ง, ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก sign ํ ์ง๊ฐ ์ ํ์์
- JSON ํํ๋ก ๋ํ๋จ
(2) Payload
{
"sub" : "someInformation",
"name" : "philip",
"iat" : 12312345
}
- ์๋ฒ์์ ํ์ฉํ ์ ์๋ ์ ์ ์ ์ ๋ณด๊ฐ ๋ด๊ฒจ์์
- ์ด๋ค ์ ๋ณด์ ์ ๊ทผ ๊ฐ๋ฅํ์ง์ ๋ํ ๊ถํ์ ๋ด์ ์ ์๊ณ ์ฌ์ฉ์์ ์ ์ ์ด๋ฆ ๋ฑ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์์
(3) Signature
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload), secret)
- Header, Payload๋ฅผ base64 ์ธ์ฝ๋ฉํ ๊ฐ๊ณผ salt ๊ฐ์ ์กฐํฉ์ผ๋ก ์ํธํ๋ ๊ฐ
- ์ํ๋ ๋น๋ฐํค์ Header์์ ์ง์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์ํธํ
- base64 ์ธ์ฝ๋ฉ์ ํ ๊ฐ์ ๋๊ตฌ๋ ์ฝ๊ฒ ๋์ฝ๋ฉ ๊ฐ๋ฅ
→ ๋น๋ฐํค๊ฐ ์๋ค๋ฉด ํด๋ ์ ์ค๋ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ด ํ์
๐ก ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ
- ์๋ฒ ํน์ DB์ ์ ์ ์ ๋ณด๋ฅผ ๋ด๋ ๋ฐฉ์
- ๋งค๋ฒ ์ธ์ฆ์ด ํ์ํ๊ฑฐ๋ ๊ถํ ํ์ธ์ด ํ์ํ ์๊ฐ์ด ์ฌ ๋๋ง๋ค ๊ฐ์ง๊ณ ์๋ ์ธ์ ๊ฐ๊ณผ ์ผ์นํ๋์ง ํ์ธ
+ ๋งค ์์ฒญ๋ง๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ดํด๋ณด์์ผ ํจ
→ ์ด ๋ถ๋ด์ ํด๋ผ์ด์ธํธ์๊ฒ ๋๊ฒจ์ฃผ๊ธฐ ์ํด ๊ณ ์๋ ๊ฒ์ด ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
๐ก ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
- ํด๋ผ์ด์ธํธ์์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ณด๊ดํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ณ ์๋จ
- ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ์ ๊ฐ์ง๊ณ ์๋ฒ์๊ฒ ์ด๋ฅผ ๋ณด์ฌ์ฃผ๋ฉด ๋ค์ํ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๋ ๋ฐฉ์
- ์ฌ๊ธฐ์ ํ ํฐ์ ์ ์ ์ ๋ณด๋ฅผ ์ํธํํ ์ํ๋ก ๋ด์ ์ ์๊ณ ์ํธํ ํ๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์ ๋ด์ ์ ์์
→ ์ฆ, ์ํ ↓
๐JWT์ ์ข ๋ฅ
โช๏ธ ์์ธ์ค ํ ํฐ : Access Token
- ๋ณดํธ๋ ์ ๋ณด๋ค(์ ์ ์ ์ด๋ฉ์ผ, ์ฐ๋ฝ์ฒ, ์ฌ์ง ๋ฑ)์ ์ ๊ทผํ ์ ์๋ ๊ถํ ๋ถ์ฌ์ ์ฌ์ฉ
- ํด๋ผ์ด์ธํธ๊ฐ ์ฒ์ ์ธ์ฆ์ ๋ฐ๊ฒ ๋ ๋ ์์ธ์ค ํ ํฐ๊ณผ ๋ฆฌํ๋ ์ ํ ํฐ์ ๋ชจ๋ ๋ฐ์
→ But, ์ค์ ๋ก ๊ถํ์ ์ป๋ ๋ฐ ์ฌ์ฉํ๋ ํ ํฐ์ ์์ธ์ค ํ ํฐ
โช๏ธ ๋ฆฌํ๋ ์ ํ ํฐ : Refresh Token
- ์ก์ธ์ค ํ ํฐ์ ์ ํจ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋๋ค๋ฉด ๋ฆฌํ๋ ์ ํ ํฐ์ ์ฌ์ฉํ์ฌ ์๋ก์ด ์ก์ธ์ค ํ ํฐ ๋ฐ๊ธ
- ์ ์ ๋ ๋ค์ ๋ก๊ทธ์ธํ ํ์ ์์
- ํ์ทจ ๋ฑ ์ํ์ผ๋ก ํธ์ ๋ณด๋ค ์ ๋ณด๋ฅผ ์งํค๋ ๊ฒ์ด ์ค์ํ๋ฉด ์ฌ์ฉ X
๐ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์ : JWT์ ์ฅ์
โ ๋ฌด์ํ์ฑ ๋ฐ ํ์ฅ์ฑ : Statelessness & Scalability
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ ํ์๊ฐ ์์
→ ํ ํฐ ํด๋ ์ด ๋๋์ง๋ง ํ๋จ
- ํด๋ผ์ด์ธํธ๋ ์๋ก์ด ์์ฒญ์ ๋ณด๋ผ ๋ ๋ง๋ค ใดํ ํฐ์ ํค๋์ ์ถ๊ฐํจ์ผ๋ก ์ธ์ฆ์ ์ฐจ ์๋ฃ
โก ์์ ์ฑ
- ์ํธํํ ํ ํฐ์ ์ฌ์ฉ
- ์ํธํ ํค๋ฅผ ๋ ธ์ถํ ํ์๊ฐ ์์
โข ์ด๋์๋ ์์ฑ ๊ฐ๋ฅ
- ํ ํฐ์ ์์ฑํ๋ ์๋ฒ๊ฐ ๊ผญ ํ ํฐ์ ๋ง๋ค์ง ์์๋ ๋จ
- ํ ํฐ ์์ฑ์ฉ ์๋ฒ๋ฅผ ๋ง๋ค๊ฑฐ๋ ๋ค๋ฅธ ํ์ฌ์์ ํ ํฐ ๊ด๋ จ ์์ ์ ๋งก๊ธฐ๋ ๊ฒ ๋ฑ ๋ค์ํ ํ์ฉ์ด ๊ฐ๋ฅํจ
โฃ ๊ถํ ๋ถ์ฌ์ ์ฉ์ด
- ํ ํฐ์ payload(๋ด์ฉ๋ฌผ) ์์ ์ด๋ค ์ ๋ณด์ ์ ๊ทผ ๊ฐ๋ฅํ์ง ์ ์
- ex) ์ฌ์ง๊ณผ ์ฐ๋ฝ์ฒ ์ฌ์ฉ ๊ถํ ๋ถ์ฌ or ์ฌ์ง ์ฌ์ฉ ๊ถํ ๋ถ์ฌ or ์ฐ๋ฝ์ฒ ์ฌ์ฉ ๊ถํ ๋ถ์ฌ
๐ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์ : JWT์ ๋จ์
โ Payload ํด๋
- Palyload๋ base64๋ก ์ธ์ฝ๋ฉ ๋์ด ์์
- ํ ํฐ์ ํ์ทจํ์ฌ Payload๋ฅผ ํด๋ ํ๋ฉด ํ ํฐ ์์ฑ์ ์ ์ฅํ ๋ฐ์ดํฐ ํ์ธ ๊ฐ๋ฅ
- Payload์๋ ์ค์ํ ์ ๋ณด๋ฅผ ๋ฃ์ง ์์์ผ ํจ
โก ๋คํธ์ํฌ ๋ถํ
- ํ ํฐ์ด ๊ธธ์ด์ง๋ฉด ๋คํธ์ํฌ์ ๋ถํ๋ฅผ ์ค ์ ์์
- ํ ํฐ์ ์ ์ฅํ๋ ์ ๋ณด์ ์์ด ๋ง์์ง ์๋ก ํ ํฐ์ ๊ธธ์ด๋ ๊ธธ์ด์ง
- ์์ฒญ๋ง๋ค ๊ธธ์ด๊ฐ ๊ธด ํ ํฐ์ ํจ๊ป ์ ์กํ๋ฉด ๋คํธ์ํฌ์ ๋ถํ๋ฅผ ์ค ์ ์์
โข ์๋ ์ญ์ ๋ถ๊ฐ
- JWT์ ์ฅ์ ์ค ํ๋๋ ๋ฌด์ํ์ฑ → ์ํ๋ฅผ ์ ์ฅํ์ง ์์
- ๋๋ฌธ์ ํ ๋ฒ ์์ฑ๋ ํ ํฐ์ ์๋์ผ๋ก ์ญ์ ๋์ง ์์ผ๋ฉฐ ํ ํฐ ๋ง๋ฃ ์๊ฐ์ ์ถ๊ฐํด์ผ ํจ
- ํ ํฐ์ด ํ์ทจ๋ ๊ฒฝ์ฐ ํ ํฐ์ ๊ธฐํ์ด ๋ง๋ฃ๋ ๋ ๊น์ง ๋์ฒ ๋ถ๊ฐ๋ฅ
โฃ ํ ํฐ์ ์ ์ฅ
- ํ ํฐ์ ์ด๋๊ฐ์ ์ ์ฅ์ด ๋์ด์ผ ํจ
- ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ง๊ณ ์๋ค๊ฐ ์ธ์ฆ์ด ํ์ํ ์์ฒญ์ ๋ณด๋ผ ๋ ๋ง๋ค ํจ๊ป ์ ์กํด์ผ ํจ
๐ก์คํ๋ง ์ํ๋ฆฌํฐ ์ธ์ ์ ์ฑ
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.์ ์ฑ
์์)
โ SessionCreationPolicy.ALWAYS
- ์คํ๋ง ์ํ๋ฆฌํฐ๊ฐ ํญ์ ์ธ์ ์ ์์ฑ
โก SessionCreationPolicy.IF_REQUIRED
- ์คํ๋ง ์ํ๋ฆฌํฐ๊ฐ ํ์์ ์์ฑ
โข SessionCreationPolicy.NEVER
- ์คํ๋ง ์ํ๋ฆฌํฐ๊ฐ ์์ฑํ์ง ์์ง๋ง ๊ธฐ์กด์ ์กด์ฌํ๋ฉด ์ฌ์ฉ
โฃ SessionCreationPolicy.STATELESS
- ์คํ๋ง ์ํ๋ฆฌํฐ๊ฐ ์์ฑํ์ง๋ ์๊ณ ๊ธฐ์กด ๊ฒ์ ์ฌ์ฉํ์ง๋ ์์ (JWT ์ ๋ง์ด ์ฌ์ฉํ๋ ์ค์ )
๐กSpring CORS ์ค์ ํ๊ธฐ
โช๏ธ CORS (Cross-Origin Resource Sharing) ๋ ?
- ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์
- ์น ๋ธ๋ผ์ฐ์ ์์ ๋ค๋ฅธ ์ถ์ฒ์ ์์์ ๊ณต์ ํ๋ ๋ฐฉ๋ฒ
- ๋ธ๋ผ์ฐ์ ์ ์๋ฒ ๊ฐ ์ธ๋ถ ๋๋ฉ์ธ ์๋ฒ์ ์ ๊ทผํ๊ธฐ ์ํ ๊ถํ์ ์๋ ค์ฃผ๋ ๋ฉ์ปค๋์ฆ
- ๋์ผ ์ถ์ฒ(SOP)์ ๊ฒฝ์ฐ ์น ๋ธ๋ผ์ฐ์ ์ ๋ณด์์ ์ด์๊ฐ ์์ง๋ง ๊ต์ฐจ์ถ์ด์ ๊ฒฝ์ฐ ๋ณด์์ ์ด์๋ก ์น๋ธ๋ผ์ฐ์ ์ ์๋ฌ๋ฉ์์ง ๋ฐ์
→ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด CORS ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํจ
โธ Origin : ์ถ์ฒ
โ ํ๋กํ ์ฝ : https
โก ํธ์คํธ : test.com
โข ํฌํธ๋ฒํธ : 443
- ์ฆ, Origin์ ํ๋กํ ์ฝ + ํธ์คํธ + ํฌํธ๋ฒํธ๋ฅผ ํฉ์น ๊ฒ๊ณผ ๊ฐ์
โช๏ธ CorsConfiguration๊ณผ UrlBasedCorsConfiguratonSource๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํ
- CorsConfiguration : CORS ์์ฒญ์ด ์ด๋ป๊ฒ ํ์ฉ ๋๊ณ origin, ํค๋, ๋ฉ์๋ ๋ฑ์ด ์ฒ๋ฆฌ๋์ด์ผ ํ๋์ง ๋ฐฉ๋ฒ ์ง์
๐ JWT Bearer ์ธ์ฆ
๐ธ Session & Cookie ์ธ์ฆ ๋ฐฉ์
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ด๋ฉด ์ฌ์ฉ์๋ฅผ ํ์ธํ๊ณ Session ID๋ฅผ ๋ฐ๊ธํจ
- ๋ฐ๊ธํ ID๋ฅผ ํตํด ๋ค๋ฅธ ์์ฒญ๊ณผ ์๋ต์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์
๐ธ Token ์ธ์ฆ ๋ฐฉ์
- ์ ์ฅ์ ํ์ ์์ด ๋ก๊ทธ์ธ ์ ํ ํฐ์ ๋ฐ๊ธํ๊ณ ๋ฐ์ดํฐ ์์ฒญ ์์ ๋ฐ๊ธ๋ฐ์ ํ ํฐ์ ํค๋๋ฅผ ํตํด ์ ๋ฌํ์ฌ ์๋ต์ ๋ฐ๋ ๋ฐฉ์
* ์ฅ์ *
- ์ฟ ํค๋ ์ธ์ ์ ํตํ ์ธ์ฆ๋ณด๋ค ๋ณด์์ฑ์ด ๊ฐํ๊ณ ํจ์จ์
→ ์ฟ ํค ์ธ์ฆ์ ์ฟ ํค์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ด์ ์๋ฒ๋ก ๋ณด๋ด๊ฒ ๋๋๋ฐ HTTP ํต์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ๋ณด๊ฐ ์ ์ถ๋๊ธฐ ์ฌ์
→ ์ธ์ ์ธ์ฆ์ ์ธ์ ID๋ฅผ ๋ณด๋ด๋ฏ๋ก ์ฟ ํค์ ๋นํด ๋ณด์์ฑ์ด ๋์ผ๋ ์๋ฒ์์ ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ DB ๊ณต๊ฐ ํ์
- ํ ํฐ์ ๋ฐ์ดํฐ๊ฐ ์ธ์ฝ๋ฉ ๋์ด์์ง๋ง ๋๊ตฌ๋ ๋์ฝ๋ฉํ์ฌ ๋ฐ์ดํฐ๊ฐ ์ ์ถ๋ ์ ์์ง๋ง ์๋ช ํ๋๊ฐ ํค๋์ ํ์ด๋ก๋๋ฅผ ํตํด ๋ง๋ค์ด์ ธ
๋ฐ์ดํฐ ๋ณ์กฐ ํ ์ฌ์ ์ก์ ๋ง์ ์ ์์
- Stateless ์๋ฒ๋ฅผ ๋ง๋ค ์ ์์
- ์ธ์ฆ์ ๋ณด๋ฅผ OAuth๋ก ์ด์ฉํ ์ ์์
* ์์ฒญ ํค๋ Authorization ํ๋์ ๊ตฌ์กฐ *
Authorization: <type> <credentials>
- ์ผ๋ฐ์ ์ผ๋ก ํ ํฐ์ ์์ฒญ ํค๋์ Authorization ํ๋์ ๋ด๊ฒจ์ ธ ๋ณด๋ด์ง
โช๏ธ Bearer ์ธ์ฆ ํ์
- JWT or OAuth ์ ๋ํ ํ ํฐ ์ฌ์ฉ
๐ธ ํํฐ ์์ฑ
โช๏ธ addFIlterBefore( ํํฐ, ํน์ ํํฐ ์ด๋ฆ ) / addFIlterAfter( )
- SecurityFilterChain์ ์๋ ํํฐ ์ค ์ /ํ๋ก ํํฐ๋ฅผ ์ ์ฉํด์ฃผ๋ ๋ฉ์๋
- ํน์ ํํฐ ์ด๋ฆ์ด ์คํ๋๊ธฐ ์ ์ ๋ด๊ฐ ๋ง๋ ํํฐ๋ฅผ ๋จผ์ ์ ์ฉํ๊ฒ ๋จ
๐ธ ํ ํฐ ์ ์ฉ
โช๏ธ response.setCharacterEncoding("UTF-8")
- ์๋ธ๋ฆฟ์์ ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด์๋ out.println์ ์ฌ์ฉํ๋๋ฐ UTF-8 ์ง์ ํ์ง ์์ผ๋ฉด
๋ฌผ์ํ๊ฐ ์ถ๋ ฅ๋จ → ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด UTF-8 ์ค์
โช๏ธ request.setCharacterEncoding("UTF-8")
- ์ ๋ ฅํ ๊ฐ์ ์ ์กํ ๋ POST ๋ฐฉ์์ผ๋ก ๋ณด๋ด๋ ๊ฐ์ด ํ๊ธ์ผ ๊ฒฝ์ฐ, ๊นจ์ง์ง ์๊ฒ ์ ๋ฌํ๊ธฐ ์ํด ์ฌ์ฉ
โช๏ธ HttpServletRequest
- ServletRequest๋ฅผ ์์
- Http ํ๋กํ ์ฝ์ Request ์ ๋ณด๋ฅผ ์๋ธ๋ฆฟ์ ์ ๋ฌํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ
- ํค๋ ์ ๋ณด, ํ๋ผ๋ฏธํฐ, ์ฟ ํค, URI, URL ๋ฑ์ ์ ๋ณด๋ฅผ ์ฝ์ด๋ค์ด๋ ๋ฉ์๋ ๊ฐ์ง ํด๋์ค
- Body์ Stream์ ์ฝ์ด๋ค์ด๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์
โช๏ธ HttpServletResponse
- ServletResponse๋ฅผ ์์
- Servlet์ด HttpServletResponse ๊ฐ์ฒด์ Content Type, ์๋ต์ฝ๋, ์๋ต ๋ฉ์์ง๋ฅผ ๋ด์ ์ ์ก
โช๏ธ Object Mapper
- JSON ํํ์ ๋ฌธ์์ด์ JAVA ๊ฐ์ฒด๋ก (readValue(json๊ฐ์ฒด, ์ญ์ง๋ ฌํ๋ฅผ ์ํฌ ํด๋์ค-ํ์ฑ๊ฒฐ๊ณผ์ ๋ฌ)
โช๏ธ AuthenticationManager
- anthenticate์ ๋ฉ์๋๋ฅผ ๊ฐ์ง
๐ JWT Token
๐น JWT Token : ๋ก๊ทธ์ธ
โช๏ธ ์ธ์ฆ ๊ถํ ํ ์คํธ