๐Ÿ–ฅFrontEnd/React

๋ฆฌ์•กํŠธ ์ธ์ฆ ๊ณต๋ถ€ํ•˜๊ธฐ, ๋กœ๊ทธ์ธ ๋กœ๊ทธ์•„์›ƒ ์ฝ”๋“œ

hellohailie 2022. 8. 1. 23:51

 

๋Œ€๋ถ€๋ถ„์˜ ์›น์•ฑ์—๋Š” ์ธ์ฆ DOM์ด ํ•„์š”ํ•˜๋‹ค.  

์ธ์ฆ DOM =Authentication DOM

 

์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•ด์•ผ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ตฌ์—ญ์ด ์žˆ๋‹ค. 

 

1. ๋ฆฌ์•กํŠธ ์•ฑ์—์„œ ์ธ์ฆ์ด ์ž‘๋™ํ•˜๋Š” ์›๋ฆฌ

2. ์‚ฌ์šฉ์ž ์ธ์ฆ์˜ ์˜ˆ์‹œ (๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ, ๋กœ๊ทธ์ธ ์‹œ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฒ•)

3. ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€ ๋– ๋‚˜๋„ ๋กœ๊ทธ์ธ ์œ ์ง€ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ & ์ž๋™ ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ

 

 


์›น์‚ฌ์ดํŠธ์—์„œ ์ธ์ฆ์ด ํ•„์š”ํ•œ ์ด์œ 
=> ๋ณดํ˜ธํ•ด์•ผ ํ•  ์ •๋ณด๊ฐ€ ์žˆ๋‹ค!!

 

์œ ์ € ๋น„๋ฐ€๋ฒˆํ˜ธ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ๋ฐ ๋ฏธ์ธ์ฆ ์‚ฌ์šฉ์ž์˜ ์ ‘๊ทผ์ด ์ œํ•œ๋œ ํŽ˜์ด์ง€์— ๋ฆฌ์•กํŠธ ์•ฑ์ด ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ๊ทธ ์š”์ฒญ์„ ๋ฐ›๋Š” API ์—”๋“œ ํฌ์ธํŠธ๊ฐ€ ๊ทธ๋Ÿฐ ๋ฐ์ดํ„ฐ์— ์†ํ•œ๋‹ค. 

 

ํ”„๋กœํ•„ ํŽ˜์ด์ง€ ์ž์ฒด์—๋„ ์ ‘๊ทผ ์ œํ•œ + ์š”์ฒญ๋ฐ›๋Š” API ์—”๋“œํฌ์ธํŠธ์—๋„ ์ ‘๊ทผ ์ œํ•œ ๊ฑธ์–ด์•ผ ํ•œ๋‹ค. 

 

 


์ธ์ฆ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ?

 

์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์ฆ์€ 2๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค. 

1๋‹จ๊ณ„ = ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผ ํ—ˆ๊ฐ€ ๋ฐ›๊ธฐ

๋กœ๊ทธ์ธ์œผ๋กœ ์ž๊ฒฉ ์ฆ๋ช…ํ•ด์„œ ์ ‘๊ทผ ํ—ˆ๊ฐ€ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๋กœ๊ทธ์ธ ์‹œ ์ž๊ฒฉ ์ฆ๋ช… ์ œ๊ณตํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„๋กœ ์ „์†ก๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ดํŽด์„œ ์‚ฌ์šฉ์ž์˜ ์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•˜๊ณ , ์œ ํšจ์„ฑ์ด ๊ฒ€์ฆ๋˜๋ฉด ์š”์ฒญ์„ ๋ฐ›์€ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๊ฐ€ ์ ‘๊ทผ์„ ํ—ˆ๊ฐ€ํ•œ๋‹ค. 

(๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ yes/no ๋กœ๋งŒ ์‘๋‹ตํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. )

2๋‹จ๊ณ„ = ์„œ๋ฒ„์ชฝ์—์„œ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค ๋ณด๋‚ด์ฃผ๊ธฐ

 

 

Server-side Session ์ด๋‚˜ Authentication Token์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

 

1. Server-side Session

์‚ฌ์šฉ์ž ์ ‘๊ทผ์„ ํ—ˆ๊ฐ€ํ•œ ์„œ๋ฒ„๊ฐ€ ํ—ˆ๊ฐ€๋ฅผ ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ(ํŠน์ • ์‚ฌ์šฉ์ž)์˜ ๊ณ ์œ  ID๋ฅผ ์ €์žฅํ•œ๋‹ค.

์„œ๋ฒ„๊ฐ€ ํŠน์ • ํด๋ผ์ด์–ธํŠธ์˜ ๊ณ ์œ  ID๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ธ์ฆ์„ ๊ฑฐ์น˜๋Š” ๋ชจ๋“  ์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ์ž์˜ ๊ณ ์œ  ID๊ฐ€ ์„œ๋ฒ„์— ์ €์žฅ๋œ๋‹ค.

์ด ID๋Š” ์„œ๋ฒ„์—๋งŒ ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ๋„ ์ „์†ก๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘ ์ด ID๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค.

 

๐Ÿ‘‰ํ›„์†์š”์ฒญ ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ID๋ฅผ ์„œ๋ฒ„์— ํ›„์† ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ํ•จ๊ป˜ ์ฒจ๋ถ€ํ•˜๋Š”๋ฐ, ์„œ๋ฒ„๊ฐ€ ID๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ID๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋˜๊ณ , ํ›„์† ์š”์ฒญ์ด ํ—ˆ๊ฐ€๋œ๋‹ค. ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ฉด ๋ถˆ๊ฐ€!

 

๐Ÿ‘‰๋‹จ์  = ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ๊ฒฐํ•ฉ์ด ๊ธด๋ฐ€ํ•˜๋ฉด ์•„๋ฌด ์ด์ƒ ์—†์ง€๋งŒ ๋ถ„๋ฆฌ๋ผ ์žˆ๋‹ค๋ฉด ์ด์•ผ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

(์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜  ์ƒํƒœ๋ฅผ ๋ณด์กดํ•˜์ง€ ์•Š๋Š” ๋ฌด์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์—)

์ ‘์†ํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์„  ์•ˆ ๋œ๋‹ค. 

๐Ÿ‘‰๋‹จ์  ํ•ด๊ฒฐ๋ฐฉ๋ฒ• 

๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ ๋ถ„๋ฆฌ ์ƒํƒœ๋Š” ํŠนํžˆ ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์•ฑ ๊ฐœ๋ฐœ์—์„œ๋Š” Server-side Session ๋ง๊ณ   Authentication Token ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. 

 

 

2. Authentication Token

์‚ฌ์šฉ์ž๊ฐ€ ์•„์ด๋””๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์„œ๋ฒ„์— ์ž๊ฒฉ ์ฆ๋ช…์„ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„๊ฐ€ ๊ทธ๊ฑธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ ์กฐํ•ฉ๊ณผ ๋น„๊ตํ•ด ์œ ํšจ์„ฑ์„ ํ™•์ธํ•œ๋‹ค. (์—ฌ๊ธฐ๊นŒ์ง€ Server-side Session ๋ฐฉ์‹๊ณผ ๊ฐ™์Œ)

๊ทธ๋Ÿฐ๋ฐ ์ž๊ฒฉ์ด ์ฆ๋ช…๋˜๋ฉด ์„œ๋ฒ„๊ฐ€ ํ—ˆ๊ฐ€ ํ† ํฐ์ด๋ผ๋Š” ๊ฑธ ์ƒ์„ฑํ•œ๋‹ค.

(ํ† ํฐ์€ ์„œ๋ฒ„๊ฐ€ ํŠน์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ค‘์š”ํ•œ ๊ฑด ์„œ๋ฒ„๋งŒ ์•„๋Š” ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ํ•ด์‹ฑํ•œ๋‹ค. )

ํ† ํฐ์€ ์„œ๋ฒ„์— ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋‹ค์‹œ ์ „์†ก๋˜์ง€๋งŒ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฒ•์€ ์„œ๋ฒ„๋งŒ ์•Œ๊ณ  ์žˆ๋‹ค.!!

๐Ÿ‘‰ํ›„์†์š”์ฒญ ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•

ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ํ† ํฐ์„ ์„œ๋ฒ„์˜ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ๋ณด๋‚ธ๋‹ค. 

์„œ๋ฒ„๋Š” ์„ธ์…˜ ๊ธฐ๋ฐ˜ ๊ธฐ๋ฒ•๊ณผ ๋‹ฌ๋ฆฌ ID๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ์ž์‹ ์ด ์ƒ์„ฑํ•œ ํ† ํฐ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

์™œ๋ƒ๋ฉด ํ† ํฐ ์ƒ์„ฑ์— ์‚ฌ์šฉ๋œ ๊ฐœ์ธํ‚ค๋ฅผ ์•„๋Š” ๊ฑด ์„œ๋ฒ„๋ฟ์ด๊ธฐ์—!!

๊ทธ๋ž˜์„œ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์ฒจ๋ถ€๋œ ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ์„œ๋ฒ„๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. 

ํ† ํฐ์ด ์œ„์กฐ๋๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํ‚ค๋กœ ์ƒ์„ฑ๋์œผ๋ฉด ์„œ๋ฒ„๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ ‘๊ทผ์„ ๊ฑฐ๋ถ€ํ•œ๋‹ค. 

 

์ถ”๊ฐ€๊ณต๋ถ€

 

Authentication Token์€ ์ผ๋ฐ˜์ ์œผ๋กœ 'JSON ์›น ํ† ํฐ (JWT)' ํ˜•์‹์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค. 

JWT๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ๊ตฌ์„ฑ๋œ ๊ธด ๋ฌธ์ž์—ด์ด๋‹ค. (private key์˜ ๋„์›€์œผ๋กœ ์„œ๋ฒ„์—์„œ๋งŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค. )

 

 

 idToken์ด ๋‹ด๊ธด ์‘๋‹ต์„ ๋ฐ›์•˜๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์œ ํšจํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ œ๊ณตํ•œ ๊ฒƒ์ด๋‹ค. 

 

์—ฌ๊ธฐ๊นŒ์ง€ ๋งˆ์ณค๋‹ค๋ฉด, ์ž‘๋™์ค‘์ธ ๋ฆฌ์•กํŠธ ์•ฑ ์–ด๋”˜๊ฐ€์— ํ† ํฐ์„ ์ €์žฅํ•ด์•ผํ•œ๋‹ค. 

์™œ?

๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ!

 

ํ† ํฐ์€ app wide state ์ด์–ด์•ผ ํ•œ๋‹ค. => ์ปจํ…์ŠคํŠธ api or ๋ฆฌ๋•์Šค ํ™œ์šฉํ•˜๊ธฐ!

 

 

์ฐธ๊ณ )

const userIsLoggedIn = !!token;

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์ด๋‹ค. 

๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ boolean ํƒ€์ž…์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ํ˜• ๋ณ€ํ™˜(Type Conversion)ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. 

์ฐธ ๋˜๋Š” ๊ฑฐ์ง“ ๊ฐ’์„ ๋ถ€์šธ ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. 

ํ† ํฐ์ด ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ 

ํ† ํฐ์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

 


์„œ๋“œ ํŒŒํ‹ฐ API๋กœ ์ž‘์—…ํ•œ๋‹ค๋ฉด ํ† ํฐ์„ ์–ด๋–ป๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š”์ง€๋Š” ์—”๋“œํฌ์ธํŠธ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. 

์—ฌ๊ธฐ์„œ๋Š” body์— ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ, ๋‹ค๋ฅธ ์—”๋“œํฌ์ธํŠธ๋Š” ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ† ํฐ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๊ณ , 

์–ด๋–ค API ์—”๋“œํฌ์ธํŠธ๋Š” headers์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์„œ๋“œํŒŒํ‹ฐ API๋กœ ์ž‘์—… ์ค‘์ด๋ฉด API ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ํ† ํฐ ์ถ”๊ฐ€ ๋ฐฉ์‹์„ ํ™•์ธํ•˜๊ธฐ!!


'usehistory' is not exported from 'react-router-dom'. ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์„œ , ๊ฒ€์ƒ‰์„ ํ•ด๋ณด๋‹ˆ useNavigate๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
 

import { useNavigate } from 'react-router-dom';

const navigate = useNavigate(); navigate('/home')

 


๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ์€ ํŒŒ์ด์–ด๋ฒ ์ด์Šค์— ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š์•„๋„ ๋œ๋‹ค. 

์™œ๋ƒ๋ฉด, ์ธ์ฆ ํ† ํฐ ๋ฐฉ์‹์€ ๋กœ๊ทธ์ธํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ์–ด๋– ํ•œ ์ •๋ณด๋„ ์„œ๋ฒ„์— ์ €์žฅ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค! 

 

๊ทธ๋ž˜์„œ ๋กœ๊ทธ์•„์›ƒ ์‹œ ๋ฐ”๊ฟ”์•ผํ•  ๊ฒƒ์€ state ๋‹จ ํ•˜๋‚˜์ด๋‹ค!

context-API์—์„œ ํ† ํฐ์„ ๋น„์šฐ๋ฉด ๋œ๋‹ค. (๋นˆ ๋ฌธ์ž์—ด์ด๋‚˜ null๋กœ ์„ค์ •ํ•˜๊ธฐ)

 


๋กœ๊ทธ์ธ ์ƒํƒœ๊ฐ€ ์•„๋‹ ๋•Œ๋„ URL์— ์ง์ ‘ ‘/profile’์„ ๋ถ™์—ฌ ์ ‘์†ํ•˜๋ฉด ํ”„๋กœํ•„ ํŽ˜์ด์ง€๊ฐ€ ๋œฌ๋‹ค.  (์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š”๊ฒŒ ์ •์ƒ)

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• => ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๊ธฐ

** ๋กœ๊ทธ์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ App.js์˜ ๋ผ์šฐํŠธ ์„ค์ •์„ ๋™์ ์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด๋‹ค. 

 

=> ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์ธ์ฆ ์ƒํƒœ๋ฅผ ํŠน์ • ๋ผ์šฐํ„ฐ์˜ ์กฐ๊ฑด์œผ๋กœ ์‚ผ์œผ๋ฉด ๋œ๋‹ค. 

 

AuthContext ์ปดํฌ๋„ŒํŠธ์˜ isLoggedIn์„ ์‚ฌ์šฉํ•˜๋ฉด๋œ๋‹ค. 
import { useContext } from "react";
import AuthContext from "./store/auth-context";

function App() {
  const authCtx = useContext(AuthContext);

  return (
    <Layout>
      <Switch>
        <Route path='/' exact>
          <HomePage />
        </Route>
        {!authCtx.isLoggedIn && (
          <Route path='/auth'>
            <AuthPage />
          </Route>
        )}
        {authCtx.isLoggedIn && (
          <Route path='/profile'>
            <UserProfile />
          </Route>
        )}
      </Switch>
    </Layout>
  );
}

 

๐Ÿ‘‡ ์‚ฌ์šฉ์ž๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒฝ๋กœ๋กœ ์ ‘์†ํ•˜๊ฑฐ๋‚˜ ๋กœ๊ทธ์ธ ์—†์ด '/profile'์— ์ ‘์†ํ•  ๋•Œ๋งˆ๋‹ค ์ž‘๋™ํ•œ๋‹ค. ๐Ÿ‘‡

import { Switch, Route, Redirect } from "react-router-dom";

function App() {
	return 
    	<Route path='*'>
          <Redirect to='/' />
        </Route>      
}

 

 


๋‹ค์‹œ ๋กœ๋“œํ•˜๊ฑฐ๋‚˜ URL์„ ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค ์ธ์ฆ ์ƒํƒœ๋ฅผ ์žƒ๋Š”๋‹ค. ์™œ๋ƒ๋ฉด ๋ฆฌ์•กํŠธ ์•ฑ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฑฐ๋‹ˆ๊นŒ!

 

๋กœ๋“œํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์žƒ๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ํ† ํฐ์„ ๋ฆฌ์•กํŠธ ์ƒํƒœ ๋ฐ”๊นฅ ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค. 

=> ๋ธŒ๋ผ์šฐ์ €์— ์žˆ๋Š” ์ €์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ™œ์šฉํ•˜์ž. ex) ์ฟ ํ‚ค, ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ => ๊ทธ๋Ÿฌ๋ฉด ํŽ˜์ด์ง€ ๋ฆฌ๋กœ๋“œํ•ด๋„ ๋ฐ์ดํ„ฐ ์‚ด์•„๋‚จ์•„ ์žˆ๋‹ค!

 

1. ๋กœ๊ทธ์ธํ•˜๋ฉด ํ† ํฐ์„ ์ €์žฅํ•˜๊ณ  ์‹ถ๋‹ค. 

const loginHandler = (token) => {
    setToken(token);
    localStorage.setItem("token", token);
  };

2. ๋กœ๊ทธ์•„์›ƒํ•˜๋ฉด ํ† ํฐ์„ ์ง€์šฐ๊ณ  ์‹ถ๋‹ค.  

const logoutHandler = () => {
    setToken(null);
    localStorage.removeItem("token");
  };

3. ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๋ฉด ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋ณด๊ณ  ํ† ํฐ์ด ์žˆ์œผ๋ฉด, ํ† ํฐ์„ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ์— ์ƒˆ ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค. 

 

const initialToken = localStorage.getItem("token"); // ์ •ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”
const [token, setToken] = useState(initialToken);

 

ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ์‚ฌ์šฉ์ž ๋กœ๊ทธ์•„์›ƒ ํ•˜๊ธฐ

๋ฐฉ๋ฒ•1. ํƒ€์ด๋จธ ์„ค์ •

๋ฐฉ๋ฒ•2. ๋กœ์ปฌ ์ €์žฅ์†Œ์— ๋‚จ์€ ์‹œ๊ฐ„ ์ €์žฅํ•˜๊ธฐ

 

๋งŒ๋ฃŒ์‹œ๊ฐ„, ํƒ€์ด๋จธ ์„ค์ •ํ•˜๊ธฐ (ํ•œ์‹œ๊ฐ„์ด ๋””ํดํŠธ)

 

//Auth-context.js

const logoutHandler = () => {
    setToken(null);
    localStorage.removeItem("token");
  };

const loginHandler = (token, expirationTime) => {
    setToken(token);
    localStorage.setItem("token", token);

    const remainingTime = calculateRemainingTime(expirationTime);

    setTimeout(logoutHandler, remainingTime);
  };

 

 //Authform.js
 
 .then((data) => {
        console.log(data);
        const expirationTime = new Date(
          new Date().getTime() + +data.expiresIn * 1000
        );
        authCtx.login(data.idToken, expirationTime.toISOString());
        history.replace("/"); // ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ๋ฐ ๋กœ๊ทธ์ธ ํ›„์— ๋ฆฌ๋””๋ ‰์…˜ํ•˜๊ธฐ
      })

 

 

๐Ÿ˜ƒ ์ž˜๋ชป๋œ ๊ฐœ๋… ์ „๋‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €์˜ ์„ฑ์žฅ์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค๐Ÿค“