Study/Java

[TIL] JWT

hong- 2022. 7. 29. 16:52

๐Ÿ‘‹๐Ÿป 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 

    โ‘  ํ”„๋กœํ† ์ฝœ : 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 : ๋กœ๊ทธ์ธ

  

  โ–ช๏ธ ์ธ์ฆ ๊ถŒํ•œ ํ…Œ์ŠคํŠธ