• [6/13 ~ 6/19] ์ฝ”๋“œ์Šค์ฟผ๋“œ ๋งˆ์Šคํ„ฐ์ฆˆ 23์ฃผ์ฐจ ํšŒ๊ณ 

    2022. 6. 26.

    by. ์ฉธ

    ๐Ÿฅฒ  ๋งˆ์ง€๋ง‰ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘

    ๋ฒŒ์จ ๋งˆ์ง€๋ง‰ ํ”„๋กœ์ ํŠธ๋ผ๋‹ˆ ์ง„์งœ ๋ง๋„ ์•ˆ ๋œ๋‹ค...ใ…  ์ˆ˜๋ฃŒ๊นŒ์ง€ 3์ฃผ๋ฐ–์— ์•ˆ ๋‚จ์•˜๋‹ค๋‹ˆ..

    ์ฒด๋ ฅ์ ์œผ๋กœ ํž˜๋“ค์–ด์„œ ๋นจ๋ฆฌ ๋๋‚ฌ์œผ๋ฉด ์‹ถ๋‹ค๊ฐ€๋„ ๋๋‚˜๊ณ  ๋‚˜๋ฉด ๋ฏธ์…˜๋„ ์—†๊ณ  ์ค‘๊ฐ„์ค‘๊ฐ„ํ•˜๋˜ ์ˆ˜์—…๋„ ์—†๊ณ ,, ํ˜ผ์ž ๋ฉ๊ทธ๋Ÿฌ๋‹ˆ ๋‚จ๊ฒจ์ง€๋Š” ๊ธฐ๋ถ„์ผ ๊ฒƒ ๊ฐ™์•„์„œ ์•ˆ ๋๋‚ฌ์œผ๋ฉด ์‹ถ๊ธฐ๋„ ํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜๋„ ์ผ๋‹จ์€ ๋‚จ์€ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ง‘์ค‘ํ•ด์„œ ์ž˜ ๋งˆ๋ฌด๋ฆฌํ•ด๋ณด๊ณ  ์‹ถ๋‹ค..!

    ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ์นธ๊ณผ ํ•จ๊ป˜ํ•˜๊ฒŒ ๋๋‹ค. ํ•ญ์ƒ ๋žœ๋ค์œผ๋กœ ํŽ˜์–ด๊ฐ€ ์ •ํ•ด์ง€๋‹ค๊ฐ€ ์ด๋ฒˆ์—” ํŒ€ ํฌ๋ง ์กฐ์‚ฌ๋ฅผ ๋ฐ›์•˜๋Š”๋ฐ, ๊ฐ™์ด ํ•˜๋ฉด ์žฌ๋ฐŒ์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์–˜๊ธฐ๊ฐ€ ๋‚˜์™€์„œ ์‹ ์ฒญํ•˜๊ฒŒ ๋๋‹ค. ์ด์ „๊นŒ์ง€๋Š” ํ‰์†Œ์— ์ž˜ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆŒ ์ผ์ด ์—†๋˜ ์ƒˆ๋กœ์šด ๋ถ„๋“ค๊ณผ ๋งค์นญ์ด ๋์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์—” ๋˜ ์ƒ‰๋‹ค๋ฅผ ๊ฒƒ ๊ฐ™์•„์„œ ๊ธฐ๋Œ€๋„ ๋˜๊ณ  ์นธ์˜ ์†๋„๋‚˜ ์—ด์ •์„ ๋ชป ๋”ฐ๋ผ๊ฐˆ ๊ฒƒ ๊ฐ™์•„์„œ ์†”์งํžˆ ๊ฑฑ์ •๋„ ์ข€ ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค..ใ…Žใ…Ž ๋น„๋ฃจํ•œ ์ฒด๋ ฅ์ด์ง€๋งŒ ๊ทธ๋ž˜๋„ ์—ด์‹ฌํžˆ ์ซ“์•„๊ฐ€ ๋ด์•ผ๊ฒ ๋‹ค ^_ใ… 

     

     

    โš™๏ธ  ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ค์ •

    ์ด์ฏค ๋˜๋‹ˆ๊นŒ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ์— ์–ด๋–ค ์–˜๊ธฐ๋ฅผ ํ•ด์„œ ์–ด๋–ค ๊ฑธ ์ •ํ•ด์•ผ ํ• ์ง€ ๋‹ค๋“ค ์ž˜ ์•Œ์•„์„œ ๊ธˆ๋ฐฉ๊ธˆ๋ฐฉ ์ง„ํ–‰์ด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ใ…‹ใ…‹ใ…‹ใ…‹ ์œ„ํ‚ค์— ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ๋‚˜ ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜, ๋ธŒ๋žœ์น˜ ์ „๋žต ๋“ฑ์„ ์ ์–ด๋‘๋Š”๋ฐ ์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฑธ ์กฐ๊ธˆ์”ฉ๋งŒ ๋ณ€๊ฒฝํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์„œ ๊ธˆ๋ฐฉ ๋๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ž ๋กœ๊ทธ์ธ, ์ด์Šˆ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€์—์„œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์œผ๋ฉด ์ข‹์„์ง€ ์ •๋ฆฌํ•ด์„œ ์ด์•ผ๊ธฐํ•ด๋ณด๋Š” ์‹œ๊ฐ„๋„ ๊ฐ€์กŒ๋‹ค. ์ „๋‚  ์นธ๊ณผ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ˜•์‹์œผ๋กœ ์ •๋ฆฌํ•ด์„œ ๊ฐ”๋Š”๋ฐ, ์ž๋ฐ”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฑ์—”๋“œ๊ฐ€ ๋ณด๊ธฐ์— ์ข€ ๋” ์ข‹์ง€ ์•Š์„๊นŒ ์‹ถ์€ ๊ฒƒ๋„ ์žˆ์—ˆ๊ณ  ๊ทธ๋ ‡๊ฒŒ ์ •๋ฆฌํ•˜๋‹ˆ๊นŒ ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

    ๋Œ€๊ฐ• ์ด๋Ÿฐ ์‹์œผ๋กœ ์ •๋ฆฌํ•ด๊ฐ”๋‹ค!

    ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ์—๋Š” ์ „์ฒด ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ๋กœ๊ทธ์ธ, ์ด์Šˆ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€ ๋ถ€๋ถ„๋งŒ ๋จผ์ € ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •๋ฆฌํ–ˆ๋‹ค. ์ด ๋ถ€๋ถ„๋งŒ ํ•ด๋„ ์นธ๊ณผ ๊ณ„์† ์ด์•ผ๊ธฐํ•˜๋‹ค๋ณด๋‹ˆ ์ ์  ์ƒ์„ธํ•ด์ง€๊ณ  ๋งŽ์•„์ ธ์„œ ๋‚˜๋ˆ ์„œ ์ž‘์„ฑํ•˜๊ธธ ์ž˜ํ–ˆ๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค. ์ ์  ๋Š˜์–ด๋‚˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ณด๋ฉด์„œ ์ง€๋‚œ ์žํŒ๊ธฐ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ์˜ ๋ชจ์Šต๊ณผ ์•ฝ๊ฐ„ ๋ฐ์ž๋ทฐ๊ฐ€ ๋Š๊ปด์ง€๊ธฐ๋„ ํ–ˆ๋‹ค..ใ…‹ใ…‹ใ…‹

    ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ค์ •์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ํ•œ๋ฒˆ ํ•ด๋ด์„œ ๊ทธ๋Ÿฐ์ง€ ํฐ ์—๋Ÿฌ ์—†์ด ๋น ๋ฅด๊ฒŒ ๋๋‚˜์„œ ๊ทธ๋ž˜๋„ ์ด์ „์— ํ–ˆ๋˜ ์‚ฝ์งˆ์ด ํ—›๋œ ๊ฑด ์•„๋‹ˆ์—ˆ๊ตฌ๋‚˜ ์‹ถ์—ˆ๋‹ค..ใ…Žใ…Ž ๊ณ„์† CRA๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด์ „๊นŒ์ง€๋Š” ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด craco๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ, ๋ฒ„์ „์ด ์—…๋ฐ์ดํŠธ๋œ ๋ฆฌ์•กํŠธ์™€ ์ž˜ ํ˜ธํ™˜์ด ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. peer dependency๊ฐ€ ๋งž์ง€ ์•Š์•„์„œ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ๋งˆ๋‹ค --force ๋˜๋Š” --legacy-peer-deps ์˜ต์…˜์„ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—๋Š” react-app-rewired๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ ์šฉํ•ด๋ดค๋Š”๋ฐ, ์ ์šฉํ•˜๊ธฐ ํฌ๊ฒŒ ์–ด๋ ต์ง€๋„ ์•Š๊ณ  craco์ฒ˜๋Ÿผ ๋ฒ„์ „์— ๋Œ€ํ•œ ์ด์Šˆ๋„ ์—†์–ด์„œ ์ž˜ ๋ณ€๊ฒฝํ•œ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

     

     

    ๐Ÿšง  ๋กœ๊ทธ์ธ ๊ด€๋ จ ๋ผ์šฐํ„ฐ ์„ค์ •

    ์ด๋ฒˆ์—๋Š” Github OAuth ๊ธฐ๋Šฅ์„ ๊ฐ€์žฅ ๋จผ์ € ๊ตฌํ˜„ํ•˜๊ฒŒ ๋๋‹ค. ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋ณด์—ฌ์ง€๊ธฐ๋„ ํ•˜๊ณ , ์นธ๋„ ๋‚˜๋„ ์ด์ „ ํ”„๋กœ์ ํŠธ๋“ค์—์„œ๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋“ค์— ๋ฐ€๋ ค ๋กœ๊ทธ์ธ์„ ํ•œ๋ฒˆ๋„ ๊ตฌํ˜„ํ•ด๋ณธ ์ ์ด ์—†์–ด์„œ ๋จผ์ € ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ชฝ์œผ๋กœ ์˜๊ฒฌ์„ ๋ชจ์•˜๋‹ค. ๋‹คํ–‰ํžˆ ๋ฐฑ์—”๋“œ ํŒ€์›์ธ ๋ฃจ์‹œ๋“œ๋„ ๊ดœ์ฐฎ๋‹ค๊ณ  ๋ง์”€ํ•ด์ฃผ์…”์„œ ๋จผ์ € ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค!

    ์šฐ์„  OAuth ๊ธฐ๋Šฅ์„ ์ œ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ๋ผ์šฐํ„ฐ ์„ค์ •์„ ๋จผ์ € ํ•ด์ฃผ์—ˆ๋‹ค.

    // router/index.tsx
    
    export const routes = [
      { path: '/', element: <RedirectRoute /> },
     ...
    ];
    // router/RedirectRoute.tsx
    
    const RedirectRoute = () => {
      const [accessToken] = useLocalStorage('accessToken', '');
    
      return accessToken ? <Navigate to={'issue-list'} replace /> : <Navigate to={'login'} replace />;
    };

    ๋จผ์ € redirect๋ฅผ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜ ๊ตฌํ˜„ํ–ˆ๋‹ค. ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ๊ฑฐ์ณ ์ด์Šˆ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€๋กœ ๊ฐ€๋Š” ํ˜•์‹์ด๋‹ค๋ณด๋‹ˆ / ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์• ๋งคํ•ด์„œ / ๊ฒฝ๋กœ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋˜๋Š” ์ด์Šˆ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œ์ผœ์ฃผ๋„๋ก ํ–ˆ๋‹ค. replace ์˜ต์…˜์€ true๋กœ ์„ค์ •ํ•˜๋ฉด ํžˆ์Šคํ† ๋ฆฌ ์Šคํƒ์— ์ƒˆ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ํ˜„์žฌ ํ•ญ๋ชฉ์„ ๋Œ€์ฒดํ•ด์ค€๋‹ค๊ณ  ํ•œ๋‹ค. ์œ„์˜ ๊ฒฝ์šฐ์—๋Š” ์ด์Šˆ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด / ์œ„์— /issue-list๋ฅผ ์Œ“๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋Œ€์ฒดํ•ด๋ฒ„๋ ค์„œ ์•„๋งˆ ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ํ–ˆ์„ ๋•Œ / ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ / ๊ฒฝ๋กœ ์ด์ „์˜ ํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ€๋„๋ก ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋“ฏํ•˜๋‹ค. ์•„์ง ํŽ˜์ด์ง€๊ฐ€ ๋งŽ์ง€ ์•Š์•„์„œ ๋” ๊ตฌํ˜„ํ•ด๋ด์•ผ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

     

    // router/index.tsx
    
    export const routes = [
      ...
      {
        element: <ProtectedRoute />,
        children: [{ path: '/issue-list', element: <IssueList /> }],
      },
    ];
    // router/ProtectedRoute.tsx
    
    const ProtectedRoute = () => {
      const [accessToken] = useLocalStorage('accessToken', '');
    
      return accessToken ? <Outlet /> : <Navigate to={'login'} replace />;
    };

    ๊ทธ๋ฆฌ๊ณ  ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€์˜ ๊ฒฝ์šฐ ๋”ฐ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๋กœ๊ทธ์ธ ๋˜์–ด์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•ด์ค˜์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๊ธ€์„ ์ฐธ๊ณ ํ•ด์„œ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ element์— ProtectedRoute ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€์ •ํ•˜๊ณ , ๋กœ๊ทธ์ธ ๊ฒ€์ฆ์ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋“ค์„ children์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ProtectedRoute๋ฅผ ์œ„์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•˜๋ฉด ๋กœ๊ทธ์ธ๋˜์–ด์žˆ์„ ๋•Œ๋Š” ํ•ด๋‹น ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜๋Š” ๋ผ์šฐํŠธ์— ์ง€์ •๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œํ‚ค๊ฒŒ ๋œ๋‹ค. Outlet์ด ๋ถ€๋ชจ ์—˜๋ฆฌ๋จผํŠธ์—์„œ ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์ค‘์ฒฉ๋œ ๋ผ์šฐํŠธ์—์„œ ๋ถ€๋ชจ ๋ผ์šฐํŠธ๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๊ฒŒ ๋œ๋‹ค. ์œ„์˜ ๊ฒฝ์šฐ path๊ฐ€ ๋”ฐ๋กœ ์ง€์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ถ€๋ชจ ๋ผ์šฐํŠธ๊ฐ€ ํ•ญ์ƒ ์ผ์น˜ํ•œ๋‹ค๊ณ  ๋ด์„œ, ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋ผ์šฐํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ Œ๋”๋งํ•ด์ฃผ๋Š” ๊ตฌ์กฐ์ธ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ดํ•ดํ–ˆ๋‹ค.

     

     

    ๐Ÿ’ก  Github OAuth ๊ตฌํ˜„

    ์ถœ์ฒ˜ : ๋ฃจ์‹œ๋“œ ๐Ÿ‘๐Ÿ‘

    ์ฃผ์–ด์ง„ ํŽ˜์ด์ง€์—๋Š” ๊นƒํ—ˆ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋กœ๊ทธ์ธํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ง์ ‘ ํšŒ์›๊ฐ€์ž…์„ ํ•œ ํ›„ ์ƒ์„ฑํ•œ ์•„์ด๋””์™€ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ์ธํ•˜๋Š” ๋ฐฉ๋ฒ• ๋‘ ๊ฐ€์ง€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋˜์–ด์žˆ์—ˆ๋Š”๋ฐ, ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๊ฐ€ ๋”ฐ๋กœ ๋””์ž์ธ์ด ์—†์–ด์„œ ์ผ๋‹จ์€ ๊นƒํ—ˆ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•œ ๋กœ๊ทธ์ธ๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

    ์šฐ๋ฆฌ๋Š” OAuth ๊ตฌํ˜„์ด ์ฒ˜์Œ์ด๊ณ  ๋ฃจ์‹œ๋“œ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ํ•ด๋ณธ ๊ฒฝํ—˜์ด ์žˆ์œผ์…”์„œ, ์ฒ˜์Œ์— ๋Œ€๋žต์ ์œผ๋กœ ์„ค๋ช…ํ•ด์ฃผ์‹œ๊ณ  ์ƒํ™œ์ฝ”๋”ฉ ๊ฐ•์˜๋„ ์ถ”์ฒœํ•ด์ฃผ์…จ๋‹ค. ๐Ÿ‘

    Github OAuth ๊ด€๋ จํ•ด์„œ๋Š” ๋‚˜์ค‘์— ๋”ฐ๋กœ ์ •๋ฆฌํ•ด๋ณผ๊นŒ ์‹ถ๋‹ค. ๋Œ€๋žต์ ์ธ ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

     

    1. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊นƒํ—ˆ๋ธŒ ๋กœ๊ทธ์ธ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

    2. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ–ˆ์„ ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” Authorization Code๋ฅผ ์ง€์ •๋œ ์ฝœ๋ฐฑ URL์— ๋งค์นญ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ›๋Š”๋‹ค.

    3. Code๋ฅผ ํฌํ•จํ•ด์„œ ํ† ํฐ์„ ์š”์ฒญํ•˜๋Š” request๋ฅผ ๋ณด๋‚ธ๋‹ค.

    4. ์‘๋‹ต๋ฐ›์€ access ํ† ํฐ๊ณผ refresh ํ† ํฐ์„ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•œ๋‹ค.

     

    ๊ตฌํ˜„ ์ค‘๊ฐ„์— code๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ์ฝœ๋ฐฑ URL๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ, ์ฝ”๋“œ๋ฅผ ๋ณด๋‚ด์ง€ ์•Š์•„๋„ ํ† ํฐ์ด ๋ฐ”๋กœ ์‘๋‹ต๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. ์•Œ๊ณ  ๋ณด๋‹ˆ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋“ฑ๋กํ•  ๋•Œ ์ง€์ •ํ–ˆ๋˜ ์ฝœ๋ฐฑ URL๊ณผ ํ† ํฐ์„ ์š”์ฒญํ•˜๋Š” API๊ฐ€ ๋™์ผํ•ด์„œ ๋ฐœ์ƒํ•œ ์ผ์ด์—ˆ๋‹ค. ๋ฃจ์‹œ๋“œ์—๊ฒŒ ๋‘˜์„ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ•ด๋‹ฌ๋ผ๊ณ  ๋ง์”€๋“œ๋ ค์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

    ์˜ˆ์ „์— ํ˜ธ๋ˆ…์Šค ์ˆ˜์—…์—์„œ OAuth ์„ค๋ช…์„ ๋“ค์„ ๋•Œ๋Š” ์–ด๋ ค์›Œ์„œ ์ดํ•ดํ•˜๋Š” ๋ฐ์—๋„ ์˜ค๋ž˜ ๊ฑธ๋ ธ์—ˆ๋Š”๋ฐ, ์ฝ”๋“œ๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด๋‹ˆ ๋” ์ž˜ ์™€๋‹ฟ์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

     

     

    ๐Ÿ“š  ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์Šคํ„ฐ๋”” - ์ œ๋„ค๋ฆญ

    ์ด๋ฒˆ์ฃผ์—๋Š” ์ด 2๋ฒˆ์˜ ์Šคํ„ฐ๋””๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. ์›๋ž˜๋Š” ์ผ์š”์ผ๋งˆ๋‹ค ํ•˜๋Š”๋ฐ ๋‹ค๋ฅธ ๋ถ„๋“ค์ด ์ด๋ฒˆ ์ฃผ์ œ์ธ ์ œ๋„ค๋ฆญ์ด ์–ด๋ ค์šฐ๋‹ˆ ์ข€ ๋” ๊ณต๋ถ€ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜์…”์„œ ์ง€๋‚œ์ฃผ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋ฃจ ๋Šฆ์ถ”๊ฒŒ ๋๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ์ฃผ๋ถ€ํ„ฐ๋Š” ์ฅฌ๋„ ์ฐธ์—ฌํ•˜๊ฒŒ ๋ผ์„œ ๋ฌธ์ œ ์ˆ˜๊ฐ€ ๊ฝค ๋งŽ์•„์ง€๋Š” ๋ฐ”๋žŒ์— 2์ฃผ์— ๊ฑธ์ณ์„œ ๋ฌธ์ œํ’€์ด๋ฅผ ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

    ๋‚˜๋Š” ์ด๋ฒˆ์— ์ด 3๋ฌธ์ œ๋ฅผ ๋ƒˆ๋Š”๋ฐ, ์ œ๋„ค๋ฆญ ๋‚ด์šฉ ์ž์ฒด๊ฐ€ ๋งŽ์ง€๋Š” ์•Š์•„์„œ ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ๋ฅผ ๋‚ผ์ง€ ๊ณ ๋ฏผ์ด ๋งŽ์ด ๋๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ๋ป”ํ•œ ๋ฌธ์ œ๋ฅผ ๋‚ด๊ณ  ์‹ถ์ง€๋Š” ์•Š์•„์„œ ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ ํƒ€์ž…์„ ์ง€์ •ํ•˜๋Š” ์‘์šฉ ๋ฌธ์ œ๋‚˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ๊ฒช์—ˆ๋˜ ์ œ๋„ค๋ฆญ ๊ด€๋ จ ๋ฌธ์ œ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ œ ๋“ฑ์„ ๋ƒˆ๋‹ค. ์ดํ„ฐ๋Ÿฌ๋ธ” ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๋‚˜๋„ ํƒ€์ž… ์ง€์ •์„ ๋ชปํ•ด์„œ ๋ฌธ์ œ๋‚ด๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์ข€ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋Š”๋ฐ, ๊ทธ๋ž˜๋„ ๊ทธ ๊ณผ์ •์—์„œ ๋” ๋ฐฐ์šฐ๊ธฐ๋„ ํ–ˆ๋‹ค. ๋‹ค๋ฅธ ๋ถ„๋“ค๋„ ๊ฐˆ์ˆ˜๋ก ์—ด์‹ฌํžˆ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“œ์…”์„œ ์ด๋ฒˆ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋ฉด์„œ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•ด ๋” ์ต์ˆ™ํ•ด์งˆ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜, ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์— ์ œ๋„ค๋ฆญ์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ฒˆ์— ์ œ๋„ค๋ฆญ์„ ๊ณต๋ถ€ํ•œ ํ›„ ์‚ฌ์šฉํ•˜๋‹ˆ ํ›จ์”ฌ ์ˆ˜์›”ํ–ˆ๊ณ , ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ด์ „๋ณด๋‹ค ๋นจ๋ฆฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™์•˜๋‹ค. ์•ž์œผ๋กœ๋„ ์Šคํ„ฐ๋”” ์—ด์‹ฌํžˆ ํ•ด์•ผ๊ฒ ๋‹ค! (เน‘•ฬ€ใ…‚•ฬ)ูˆโœง

    ๋Œ“๊ธ€