Front-end Developer
<Nextjs> RouteGuard ์ปดํฌ๋ํธ (2023/04/09) ๋ณธ๋ฌธ
๐ก RouteGuard
๋ page route๊ฐ์ auth checkํ๋ middleware ์ปดํฌ๋ํธ์
๋๋ค.
๋์ ํ๊ฒ๋ ์ด์ โ
- ๋ก๊ทธ์ธ์ด ํ์ํ ํ์ด์ง๋ฅผ
๋ก๊ทธ์ธ ํ์ง ์๊ฑฐ๋ JWT ํ ํฐ์ด ๋ง๋ฃ๋ ๊ฒฝ์ฐ์
๋ผ์ฐํ ์ ์๋ํ ๊ฒฝ์ฐ ๋ก๊ทธ์ธ ํ์ด์ง๋ก redirectํ๊ธฐ ์ํด์ - ๋ก๊ทธ์ธ ํ ์ํ์์
ํ์ด์ง๋ฅผ reloadํ ๊ฒฝ์ฐ
JWT ํ ํฐ์ผ๋ก ๋ ์๊ฐ ์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์
์ปดํฌ๋ํธ ๋ก์ง ์ ๋ฆฌ ๐ก
MyApp
์ปดํฌ๋ํธ๋ Next.js app์ root component์
๋๋ค. <RouteGuard>
๋ ํ์ฌ ๋ ๋๋ง๋๋ page Component <Component {…pageProps} />
๋ฅผ children์ผ๋ก ๊ฐ์ธ์ auth ๋ก์ง์ ์คํ์ํค๋ middleware์ ์ญํ ์ํ๋ค.
RouteGuard
์ปดํฌ๋ํธ๋ ์์์ ๋งํ๋ฏ์ด ํ์ด์ง routing ์ด๋ฒคํธ๊ฐ ์์๋ ๋ auth ์ฒดํฌ ๋ก์ง์ ์คํ์ํค๋ middleware์
๋๋ค.
- ๋ฐ์ ์ฝ๋์๋ฐ๋ผ ์์ฐจ์ ์ผ๋ก ๋ก์ง์ ์ค๋ช
ํ์๋ฉด,
setUser
(setter ํจ์)๋ ํ๋ผ๋ฏธํฐ์ ์ ์ ์ ๋ณด๋ฅผ ๋ฃ์ด์ recoil(์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ก ๊ด๋ฆฌํ๋ user state ๊ฐ์ ์ ๋ฐ์ดํธํฉ๋๋ค. isAuthenticated
๋ ํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธํ ์ํ์ธ์ง ์๋์ง๋ฅผ ๋ํ๋ด๋ state์ ๋๋ค. boolean type์ ๊ฐ์ ๊ฐ์ง๊ณ ์๊ณ default value๋false
์ ๋๋ค.setIsAuthenticated
๋ isAuthenticated๋ฅผ ์ ๋ฐ์ดํธํ๋ setter ํจ์์ ๋๋ค.routeGuardExceptedPathList
๋ auth ์ฒดํฌ ๋ก์ง์ ํจ์๋ฅผ ์คํํ ํ์์๋ ํ์ด์ง path๋ฅผ ์์๋ก ๊ฐ์ง๊ณ ์๋ ๋ฐฐ์ด์ ๋๋ค.isValidPath
๋ ํ์ฌ ํ์ด์ง path๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ routeGuardExceptedPathList์ ํฌํจ๋ path์ธ์ง ํ์ธํด์ boolean type์ returnํ๋ callback ํจ์์ ๋๋ค.true
๋ฅผ ๋ฆฌํดํ๋ฉด auth check ํจ์ ์คํ,false
๋ฅผ ๋ฆฌํดํ๋ฉด auth check ํจ์ ์คํํ์ง ์์ต๋๋ค.
authCheck
ํจ์๋ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ JWT ํ ํฐ๊ฐ์ผ๋ก ํด๋ผ์ด์ธํธ์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.jwtToken
๋ณ์ ๊ฐ์ดundefined
์ผ๊ฒฝ์ฐ ๋ก๊ทธ์ธ์ ํ์ง ์์๋ค๊ณ ํ๋จํ๊ณ ๋ก๊ทธ์ธ ํ์ด์ง๋ก redirect ์ํต๋๋ค. url query์ returnPath๋ฅผ ์ถ๊ฐํ ์ด์ ๋ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋์ด๊ฐ๋ค์ ๋ก๊ทธ์ธ ์ฑ๊ณต์ํ๋ฉด ์๋ routingํ๋ ค๊ณ ํ๋ ํ์ด์ง๋ก ๋์ด๊ฐ๊ฒํ๊ธฐ ์ํด์ url query์ path๋ฅผ ์ ์ฅํฉ๋๋ค.jwtToken
๋ณ์ ๊ฐ์ด undefined๊ฐ ์๋๊ฒฝ์ฐ JWT ํ ํฐ์ผ๋ก ์ ์ ์ ๋ณด๋ฅผ ์์ฒญํฉ๋๋ค.then
์ผ๋ก return ํ ๊ฒฝ์ฐ ํ ํฐ์ด ๋ง๋ฃ๋์ง ์์๋ค๊ณ ํ๋จํ๊ณ return ๋ฐ์ ์ ์ ์ ๋ณด๋ฅผ setUser์ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ isAuthenticated ๊ฐ์ true๋ก ๋ณ๊ฒฝํฉ๋๋ค. ํ์ง๋งcatch
๋ก return ํ ๊ฒฝ์ฐ ํ ํฐ์ด ๋ง๋ฃ๋์๋ค๊ณ ํ๋จํ๊ณ ๋ก๊ทธ์ธ ํ์ด์ง๋ก redirect ์ํต๋๋ค.
RouteGuard
์ฒซ ๋ ๋๋ง์์ authCheck ํจ์๋ฅผ ์คํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด์ง ๋ผ์ฐํ ์ด ์์ํ ๋ auth check๋ฅผ ์คํํ๋๋ก event (router.events.on(์ด๋ฒคํธ, ์ด๋ฒคํธ ์ผ์ด๋ฌ์ ๋ ๋์ํ๋ ํจ์
)๋ฅผ ๋ฑ๋กํฉ๋๋ค.nextPath
ํ๋ผ๋ฏธํฐ๋ routing์ ์๋ํ๋ path๋ฅผ ๋ํ๋ ๋๋ค.RouteGuard
์ปดํฌ๋ํธ๊ฐ return ๊ฐ์ ํํ๋null
๋๋children
์ ๋๋ค.isAuthenticated
๊ฐ false์ด๋ฉด์(๋ก๊ทธ์ธ์ด ๋ค์ ํ์ํ ์ํ)isValidPath
๊ฐ true์ด๋ฉด(ํ์ฌ ํ์ด์ง๋ก ๋์ด๊ฐ๊ธฐ ์ํด์๋ ๋ก๊ทธ์ธ์ด ํ์ํ ๊ฒฝ์ฐ) null์ ๋ฐํ์ํด์ ํ ํ์ด์ง ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ์ง ์๊ณ ๋น ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ page Component๋ฅผ ๋ฐํํฉ๋๋ค. ์๋ฅผ๋ค์ด ๋ก๊ทธ์ธ์ ํ์ง ์์๊ฑฐ๋ JWTํ ํฐ์ด ๋ง๋ฃ๋์๋๋ผ๋ ํ์ฌ ํ์ด์ง๊ฐ ๋ก๊ทธ์ธ ํ์ด์ง๋ผ๋ฉด null ๋์ ์ children์ ๋ฐํํฉ๋๋ค. ์๋ํ๋ฉด ๋ก๊ทธ์ธ ํ์ด์ง์์๋ ๋ก๊ทธ์ธ์ด ๋์ง ์์ ์ํ์์ ์ ์์ ์ผ๋ก ํ๋ฉด์ ๋ ๋๋งํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
heic ์ด๋ฏธ์ง ํ์ผ์ jpeg๋ก ๋ณํํ๊ธฐ (1) | 2021.05.19 |
---|---|
๋ฆฌ์กํธ ํด๋ฆญํ ๋ฒํผ๋ง ์คํ์ผ๋ง ์ฃผ๊ธฐ (0) | 2021.04.25 |
React (์นด์นด์ค ๋งต) ์ฃผ์ ์ ๋ ฅํ์ ๋ ํด๋น ์ฃผ์์ ๋ง์ปค ๋ํ๋ด๊ธฐ (0) | 2021.04.25 |
React (์นด์นด์ค ๋งต) ์ค ์ธ ์์ ๋ฒํผ ๋ฃ๊ธฐ (0) | 2021.04.24 |
React (์นด์นด์ค ๋งต) ๋ง์ปค ์ข ๋ฅ๋ณ๋ก ๋๋๊ธฐ (0) | 2021.04.24 |
Comments