[React 22] - Login 1

yiwoojungยท2022๋…„ 9์›” 6์ผ
0

{C} Codecamp FE 06

๋ชฉ๋ก ๋ณด๊ธฐ
19/21

๐Ÿ‘พ ์˜ค๋Š˜์˜ ๋ชฉํ‘œ

  1. ๋กœ๊ทธ์ธ์˜ ์—ญ์‚ฌ
  2. JWT

1. ๋กœ๊ทธ์ธ์˜ ์—ญ์‚ฌ

๊ฐ€์žฅ ์˜›๋‚ ์— ์‚ฌ์šฉํ–ˆ๋˜ ๋กœ๊ทธ์ธ ๋ฐฉ์‹์„ ๋จผ์ € ์•Œ์•„๋ณด์ž.

๊ฐ€์žฅ ์˜›๋‚ ์— ์‚ฌ์šฉํ–ˆ๋˜ ๋กœ๊ทธ์ธ ๋ฐฉ์‹์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธํ•˜๋ฉด ๊ทธ ์ •๋ณด์— ๋Œ€ํ•œ ํŠน์ • ์•„์ด๋””(sessionId)๋ฅผ ๋ฐ›์•„์„œ ์ €์žฅํ•ด๋‘๊ณ  api๋ฅผ ์š”์ฒญํ• ๋•Œ๋งˆ๋‹ค sessionId๋ฅผ ๊ฐ™์ด ์ฒจ๋ถ€ํ•ด์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์—์„œ๋Š” ์‚ฌ์šฉ์ž๋“ค์˜ ๋ชจ๋“  ์š”์ฒญ๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์š”์ฒญ์ด ๋งŽ์•„์ง€๊ฒŒ ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์ด ๋ถ€์กฑํ•˜๊ฒŒ ๋œ๋‹ค.
๊ทธ๋ž˜์„œ ํ˜„์žฌ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๋ฐฉ์‹์œผ๋กœ ์˜›๋‚  ๋ฐฉ์‹๊ณผ ํฐ ํ‹€์€ ๋น„์Šทํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ์œ ์ €๋“ค์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.


ํ˜„์žฌ ๋กœ๊ทธ์ธ ๋ฐฉ์‹๊ณผ JWT ์•Œ์•„๋ณด๊ธฐ


2. JWT

JWT๋Š” ๋ˆ„๊ตฌ๋“ ์ง€ ๋ณผ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์กฐ์ž‘์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

VERIFY SIGNATURE์— ์ž…๋ ฅํ•˜๋Š” KEY๋ฅผ ๊ฐ€์ง€๊ณ  ์ฒ˜์Œ์— ์„œ๋ช…๋œ ๋‚ด์šฉ์ด๋ž‘ ๋น„๊ต๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐ์ž‘๋œ๊ฑด์ง€ ์•„๋‹Œ์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


์ด์ œ ์•ž์œผ๋กœ ์šฐ๋ฆฌ๋Š” JWT๋ฅผ ๋กœ๊ทธ์ธ์— ์ ‘๊ทผํ•˜๋Š” ์šฉ๋„๋กœ ์“ธ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ accessToken์ด๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์ด๋‹ค. ๋กœ๊ทธ์ธ์— ์‚ฌ์šฉ๋˜๋Š” ํ† ํฐ์€ ์–ด๋–ค ๊ฑธ๋กœ๋„ ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊ทธ ์ค‘์—์„œ JWT๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. (๋‘๊ฐœ๊ฐ€ ๊ฐ™๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ์•„๋‹ˆ๋‹ค.)

accessToken !== JWT
JWT !== accessToken

accessToken ์ฒจ๋ถ€ํ•˜๊ธฐ

์ด ํ† ๊ทผ์„ ์‹ค์ œ API์— ํ•จ๊ป˜ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” HTTP Headers์— ์ฒจ๋ถ€ํ•˜๋ฉด ๋œ๋‹ค.

API๋ฅผ ๋ณด๋‚ผ ๋•Œ request header(์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ), response header(์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ)๋“ฑ์ด ์žˆ๋‹ค.
๋ฐ์ดํ„ฐ์˜ ์š”์•ฝ์ •๋ณด, ์–ด๋””์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ฐœ๋๋Š”์ง€(Origin), ์–ด๋–ป๊ฒŒ ์••์ถ•์ด ๋˜์—ˆ๋Š”์ง€ ๋“ฑ์— ๊ด€ํ•œ ์ •๋ณด๋“ค์ด ์š”์•ฝ๋˜์–ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.
์ด๋•Œ request header์— accessToken์„ ๊ฐ™์ด ์ฒจ๋ถ€ํ•ด์„œ ๋ณด๋‚ด์ฃผ๋ฉด ๋œ๋‹ค.


{
	"Authorization" : "Bearer accessToken"
}

๋‹ค์Œ์ฒ˜๋Ÿผ Request Headers์˜ Authorization ๋ถ€๋ถ„์— ํ† ํฐ์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ Authorization ๊ณผ Bearer์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณด์ž.

์ธ์ฆ๊ณผ ์ธ๊ฐ€

์ธ์ฆ์€ Authentication์ด๊ณ  ์ธ๊ฐ€๋Š” Authorization์ด๋‹ค.
์ธ์ฆ์€ ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง€๊ณ  ํ† ํฐ(accessToken)์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. login API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
์ธ๊ฐ€๋Š” ์ด๋ฏธ ๋ฐ›์€ ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ๋‚ด ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๊ฑฐ๋‚˜(fetchUserLoggedIn) ์ƒํ’ˆ์„ ๋“ฑ๋ก(createUser)ํ•˜๊ฑฐ๋‚˜ ๋“ฑ์˜ ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋Ÿฌํ•œ ์ž‘์—…์„ ํ•˜๋ ค๋ฉด ์ด ์‚ฌ๋žŒ์ด ๋ˆ„๊ตฐ์ง€ ์•Œ์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— accessToken์œผ๋กœ ๋ณตํ˜ธํ™”๋ฅผ ํ†ตํ•ด์„œ ์œ ์ €๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ์ธ๊ฐ€๋ผ๊ณ  ํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ์ธ์ฆ์„ ํ• ๋•Œ๋Š” ์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ธ๊ฐ€๋ฅผ ํ•  ๋•Œ๋Š” request headers์— accessToken์„ ๋„˜๊ธฐ๊ฒŒ ๋œ๋‹ค. ์ธ์ฆ์€ ํ•œ๋ฒˆ๋งŒ ํ•˜๋ฉด ๋˜๊ณ  ์ธ๊ฐ€๋Š” ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

Bearer

authorization์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๊ฒŒ ๋  ๋•Œ ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์ด ์–ด๋–ค ๊ฒƒ์ธ์ง€ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ž์—ด์ด๊ณ  Bearer ๋ง๊ณ  Basic ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ๊ด€๋ก€์ƒ Bearer๋Š” ํ† ํฐ ์ธ์ฆ์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋Š” ํŠน์ •ํ•œ ๊ธฐ๋Šฅ์„ ํ•˜์ง€๋Š” ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋นผ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ ๋ฐฑ์—”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ์ฝ”๋”ฉ์„ ํ•ด๋†จ๋ƒ์— ๋”ฐ๋ผ์„œ ๋‹ฌ๋ผ์ง„๋‹ค. ๋ฐฑ์—”๋“œ์—์„œ ์ด ํ† ํฐ์„ ๊ฐ€์ ธ๊ฐˆ ๋•Œ ๋ฌธ์ž์—ด์—์„œ replace("Bearer", "")ํ•ด์„œ ํ† ํฐ์„ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ•ด๋†จ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


๐Ÿ” ์•”ํ˜ธํ™” ๋ฐฉ์‹

์–‘๋ฐฉํ–ฅ ์•”ํ˜ธํ™”

  • ์•”ํ˜ธํ™” ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณตํ˜ธํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹
  • JWT

๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™” (Hash)

  • ํŠน์ • ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™” ํ•˜๊ฒŒ ๋˜๋ฉด ๋ณตํ˜ธํ™” ํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹
  • ์•”ํ˜ธํ™”๋งŒ ๊ฐ€๋Šฅํ•˜๊ณ  ๋ณตํ˜ธํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ

ํ•˜์ง€๋งŒ ์™„๋ฒฝํ•œ ๋ณด์•ˆ์€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ €๋„ ๊ฐœ๋ฐœ์ž๋„ ๋ณด์•ˆ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.


profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€