Post

์ฟ ํ‚ค, ์„ธ์…˜, JWT

๐Ÿ“’์ธ์ฆ, ์ธ๊ฐ€

์ธ์ฆ (Authentication)

์ธ์ฆ์€ ์‹ ์›์„ ํ™•์ธํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค.
๋น„๋ฐ€๋ฒˆํ˜ธ, ํ•˜๋“œ์›จ์–ด ํ† ํฐ, ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ธ๊ฐ€ (Authorization)

์ธ๊ฐ€๋Š” ์ธ์ฆ ์ดํ›„์˜ ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋– ํ•œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ๊ฐ€ ๋ฐ”๋กœ ์ธ๊ฐ€์ด๋‹ค.

๋น„๊ต

  • ์‚ฌ์ดํŠธ์— ๊ฐ€์ž…๋œ ์‚ฌ์šฉ์ž๋ผ๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์ธ์ฆ
  • ์ธ์ฆ ํ›„์— ํŽ˜์ด์ง€ ์ ‘๊ทผ ๊ถŒํ•œ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ์ธ๊ฐ€

๐Ÿ“’ ๋กœ๊ทธ์ธ์ด๋ž€?

loginflow

์‚ฌ์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ œ์–ดํ•˜๊ณ  ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•œ ์ปดํ“จํ„ฐ ๋ณด์•ˆ ์ ˆ์ฐจ

๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ์ด์œ ์™€ ๊ตฌํ˜„์„ ์œ„ํ•ด ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์€?

1. ์‚ฌ์šฉ์ž ์‹๋ณ„

ํ•ด๋‹น ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด

2. ์ ‘๊ทผ ๋ฐ ๋™์ž‘ ์ œ์–ด

2-1. ๊ถŒํ•œ์ด ์—†๋Š” ์ž์›์— ์ ‘๊ทผํ•˜์ง€ ์•Š๋Š” ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ

  • ๊ด€๋ฆฌ์ž ์ „์šฉ ํŽ˜์ด์ง€์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๋ฐ˜ ์œ ์ €๊ฐ€ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก github repo์˜ setting ๋ฒ„ํŠผ์ด ๊ด€๋ฆฌ์ž๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ณด์—ฌ์ง€์ง€ ์•Š๋„๋ก ์„ค์ •

2-2. ๊ถŒํ•œ์ด ์—†๋Š” ์ž์›์˜ ์กด์žฌ๋ฅผ ๋ชจ๋ฅด๋„๋ก ํ•˜๊ธฐ

  • ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ๋ฅผ ์ผ๋ฐ˜ ์œ ์ €๊ฐ€ ์ง์ ‘ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์คŒ์œผ๋กœ์จ ๊ถŒํ•œ์ด ์—†๋Š” ํŽ˜์ด์ง€&๋ฐ์ดํ„ฐ๋ฅผ ์ˆจ๊ธฐ๊ธฐ

3. ์ธ์ฆ ์ •๋ณด ๊ด€๋ฆฌํ•˜๊ธฐ

๋กœ๊ทธ์ธ์ด ๊ณ„์† ์œ ์ง€๋  ์ˆ˜ ์žˆ๋„๋ก token์„ ์ฟ ํ‚ค, ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€, ์„น์…˜์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด๋‘์ง€ ์•Š๋Š”๋‹ค๋ฉด ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ถ”๊ฐ€ํ•  ๋•Œ๋„ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผํ•˜๊ณ , ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋กœ ์ด๋™ํ•  ๋•Œ๋„ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผํ•จ

์ฟ ํ‚ค? ์„ธ์…˜? JWT?

์„œ๋ฒ„๋Š” ๋ฌด์ƒํƒœ์„ฑ(stateless)๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ ์ €์žฅ์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋งค๋ฒˆ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊ทธ์ธ์„ ์œ ์ง€(์ธ์ฆ/์ธ๊ฐ€)ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค

1. ์ฟ ํ‚ค

HTTP ์ฟ ํ‚ค๋ž€ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†กํ•˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋œปํ•œ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ(Cookie)๋ฅผ ์ €์žฅํ•ด ๋†“์•˜๋‹ค๊ฐ€ ๋™์ผํ•œ ์„œ๋ฒ„๋กœ ์žฌ์š”์ฒญ ์‹œ ์ œ๊ณต๋ฐ›์•˜๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ์ „์†กํ•œ๋‹ค.

โ–  ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ

์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•  ๋•Œ
์„œ๋ฒ„๋Š” ID์™€ PW๋ฅผ Cookie์— ๋‹ด์•„ ์‘๋‹ตํ•˜๊ณ ,
์ดํ›„ ์š”์ฒญ๋ถ€ํ„ฐ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ID/PW๋ฅผ Cookie์— ๋‹ด์•„ ํ•จ๊ป˜ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์—
,
์ธ์ฆ/์ธ๊ฐ€๋ฅผ ์œ„ํ•ด ๋งค๋ฒˆ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ฒŒ ๋œ๋‹ค.

โ–  ์žฅ์ 

  • ๊ธฐ์กด ๋กœ๊ทธ์ธ์„ ์œ„ํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ฆ/์ธ๊ฐ€๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ์ด ํ•„์š” ์—†๋‹ค.
  • ์„œ๋ฒ„์— ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ์ €์žฅ ๊ณต๊ฐ„์ด ํ•„์š” ์—†๊ณ , Statelessํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ–  ๋‹จ์ 

  • ์‚ฌ์šฉ์ž์˜ ์ฃผ์š” ์ •๋ณด๋ฅผ ๋งค๋ฒˆ ์š”์ฒญ์— ๋‹ด์•„์•ผ ํ•˜๊ธฐ์— ๋ณด์•ˆ์ด ์ทจ์•ฝํ•˜๋‹ค.

2. ์„ธ์…˜

์ฟ ํ‚ค์˜ ์ทจ์•ฝํ•œ ๋ณด์•ˆ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„ธ์…˜
Session์€ ๊ณ ๊ฐ์˜ ์ฃผ์š” ์ •๋ณด๊ฐ€ ์•„๋‹Œ, ๋‹จ์ง€ ๊ณ ๊ฐ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’ ์ƒ์„ฑํ•ด Cookie๋กœ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค.

์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์ดํ›„ ๋กœ๊ทธ์•„์›ƒ ํ˜น์€ ๋กœ๊ทธ์ธ ๋งŒ๋ฃŒ๊นŒ์ง€์˜ ๊ธฐ๊ฐ„

โ–  ์„ธ์…˜๋ฅผ ์‚ฌ์šฉํ•œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ

274501142-09e785bb-accf-4248-a5a7-e853b0ef67fc

A ์‚ฌ์šฉ์ž๊ฐ€ ID/PW๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ์„ ํ–ˆ๋‹ค๋ฉด
A์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’๋ฅผ ์ƒ์„ฑํ•ด Cookie๋กœ ๋ธŒ๋ผ์šฐ์ €์— ์‹ฌ๊ณ  ๋งค๋ฒˆ ์š”์ฒญ ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑํ•œ ๊ฐ’์„ ํ†ตํ•ด ์ธ์ฆ/์ธ๊ฐ€๋ฅผ ์ž๋™์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.
์ด ๋•Œ ์ƒ์„ฑ๋˜๋Š” ์‚ฌ์šฉ์ž ์‹๋ณ„ ๊ฐ’์„ Session ID๋ผ ํ•œ๋‹ค.

โ–  ์žฅ์ 

  • ์ฟ ํ‚ค๋ณด๋‹ค ๋ณด์•ˆ์ด ๋น„๊ต์  ์ข‹๋‹ค.

โ–  ๋‹จ์ 

  • ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ณ  ์„œ๋ฒ„์— ์ €์žฅํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค.
  • ์„œ๋ฒ„ ์ €์žฅ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค.
  • Statelessํ•˜๋‹ค๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค. (์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—)

Token?

์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๊ฐ€ ์ˆจ๊ฒจ์ง„ ์•”ํ˜ธํ™”๋œ Access Token์„ ๋ฐœํ–‰ํ•˜๊ณ , ์ธ์ฆ์ด ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์— Token๊ณผ ํ•จ๊ป˜ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. ์„œ๋ฒ„๋Š” ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ Token ํ•ด๋…์„ ํ†ตํ•ด Token ์†์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋“ค์„ ์•Œ์•„๋‚ด๊ณ  ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ธ์ฆ/์ธ๊ฐ€๊ฐ€ ์ž๋™์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

3. JWT (Json Web Token)

JSON ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ •ํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ํ† ํฐ

jwt ๊ณต์‹ ๋ฌธ์„œ

โ–  JWT ๊ตฌ์กฐ

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMNg1I%2FbtrNhSfsmXs%2FtMK1UkKEq3BPAZ96kF6k7k%2Fimg.png

  • Header: ํ† ํฐ์„ ์•”ํ˜ธํ™”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ํ† ํฐ ํ˜•ํƒœ
  • PAYLOAD: ์‚ฌ์šฉ์ž ์ •๋ณด
    • sub: ํ† ํฐ ์ œ๋ชฉ
    • iat: ์–ธ์ œ ๋ฐœ๊ธ‰๋˜์—ˆ๋Š”์ง€
  • SIGNATURE: ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ,
    • MY_SECRET_KEY : ์„œ๋ฒ„๋งŒ ์•Œ๊ณ  ์žˆ๊ณ , ์„œ๋ฒ„์™€ ๋น„๊ตํ•˜์—ฌ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌํ•  ๋ฐ์ดํ„ฐ

โ–  ํ† ํฐ ์‚ฌ์šฉํ•œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ

loginflow

์„œ๋น„์Šค์— ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ํ•˜๋ฉด ์„œ๋น„์Šค๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๊ณ , ์ „๋‹ฌํ•œ๋‹ค.
ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐœ๊ธ‰๋ฐ›์€ ํ† ํฐ์„ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ํ† ํฐ์„ ์‚ฌ์šฉํ•ด ์ธ์ฆ/์ธ๊ฐ€๋ฅผ ์š”์ฒญํ•œ๋‹ค.

โ–  ํ† ํฐ ์‚ฌ์šฉํ•œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ - ์‹ค์ œ ์„œ๋น„์Šค

loginflow2 ์œ ์ € ์ง„์ž… ํ›„ ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‹ค์Œ ๋‹จ๊ณ„ ๊ฒฐ์ •
1-1. ํ† ํฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์„œ๋ฒ„์— token์˜ ์œ ํšจ์„ฑ์„ ํ™•์ธ

  • ํ† ํฐ์ด ์œ ํšจํ•˜๋‹ค๋ฉด ๋กœ๊ทธ์ธ ์„ฑ๊ณต!
  • ํ† ํฐ์ด ์œ ํšจํ•˜์ง€ ์•Š๋‹ค๋ฉด ๋กœ๊ทธ์ธ ์ง„ํ–‰

1-2. ํ† ํฐ์ด ์—†๋‹ค๋ฉด ๋กœ๊ทธ์ธ ์ง„ํ–‰

  • ์‚ฌ์šฉ์ž์˜ id์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ฐ›์•„ ์„œ๋ฒ„์— ์ธ์ฆ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ , ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด token์„ ๋ฐœ๊ธ‰๋ฐ›์•„์„œ ๋กœ๊ทธ์ธ ์„ฑ๊ณต!

์ฐธ๊ณ  ์‚ฌ์ดํŠธ

This post is licensed under CC BY 4.0 by the author.