2024-04-25.md

๐Ÿก

DIL: ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ, 8์ฃผ์ฐจ-2

์Šคํ„ฐ๋””: ์›”๊ฐ„ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์˜ค๋Š˜ ์ง„ํ–‰: ๊ฐœ์ธ๊ณต๋ถ€


DIL-week8-2_2024-04-25

| -------- | ---------- | -------------------------------------------------------- | ----------- | | DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | 8์ฃผ์ฐจ | 14์žฅ, 15์žฅ | ์›น์‚ฌ์ดํŠธ ๋ณด์•ˆ์„ ์œ„ํ•œ ๋ฆฌ์•กํŠธ์™€ ์›นํŽ˜์ด์ง€ ๋ณด์•ˆ ์ด์Šˆ, ๋งˆ์น˜๋ฉฐ | 881~884p |

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ


  • dangerouslySetInnerHTML์€ ์™œ ์กด์žฌ?
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌ์•กํŠธ๋Š” XSS๋ฅผ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ด์Šค์ผ€์ดํ”„ ์ž‘์—…์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ
    • <div id={<span><svg/onload=alert(origin)></span>}>์€ alret์ด ์‹คํ–‰๋˜์ง€ ์•Š์Œ
  • getServerSideProps์™€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์ฃผ์˜ํ•˜๊ธฐ
    • ์„œ๋ฒ„๋ผ๋Š” ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ํ”„๋ก ํŠธ์—”๋“œ์—๊ฒŒ ์ฅ์–ด์คŒ
    • ์„ฑ๋Šฅ ์ด์  + ์ฃผ์˜์ 

์˜ˆ์ œ-a

  • getServerSideProps๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” props๊ฐ’์€?
    • ์‚ฌ์šฉ์ž์˜ HTML์— ๊ธฐ๋ก๋จ
    • ์ „์—ญ ๋ณ€์ˆ˜๋กœ ๋“ฑ๋ก๋˜์–ด ์ ‘๊ทผ ๊ฐ€๋Šฅ
export default function App({ cookie }: { cookie: string }) {
  if (!validateCookie(cookie)) {
    Router.replace(/* */); // ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋Š” ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰ํ•ด์„œ ์†ํ•ด
    return null;
  }
  ...
}
export const getServerSideProps = async (ctx: GetServerSidePropsContext) => {
  const cookie = ctx.req.headers.cookie || ""
  return {
    props: {
      cookie
    }
  }
}

์˜ˆ์ œ-b

  • ์ฟ ํ‚ค ์ž์ฒด๋ฅผ ์ œ๊ณตx, ํด๋ผ์ด์–ธํŠธ์—์„œ ํ•„์š”ํ•œ token๋งŒ ์ œํ•œ์ ์œผ๋กœ ๋ฐ˜ํ™˜
    • ๊ฐ’์ด ์—†์„ ๋•Œ ๋ฆฌ๋””๋ ‰์…˜? ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค
    • ์ฟ ํ‚ค ๋…ธ์ถœ์„ ๋ง‰๊ณ  ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๊ฐ€ ๋น ๋ฅด๋‹ค
  • ์ด๋Ÿฐ ์ ‘๊ทผ๋ฒ• > getServerSideProps๋‚˜ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ฆฌ๋•์Šค๋‚˜ ์„œ๋ฒ„์‚ฌ์ด๋“œ์—์„œ ๊ฐ€์ ธ์˜จ window.__PRELOADED_STATE__์™€ ๊ฐ™์€ ๊ฐ’์„ ๋ฐ์ดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ๋„ ์ ์šฉ
  • window.__PRELOADED_STATE__ ๊ฐ’์€ XSS์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ƒˆ๋‹ˆํƒ€์ด์ฆˆํ•˜๊ณ  ๊ผญ ํ•„์š”ํ•œ ๊ฐ’๋งŒ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค~
export default function App({ token }: { token: string }) {
  const user = JSON.parse(window.atob(token.split(".")[1]));
  const user_id = user.user_id;
  ...
}

export const getServerSideProps = async (ctx: GetServerSidePropsContext) => {
  const cookie = ctx.req.headers.cookie || ""
  const token = validateCookie(cookie);

  if(!token){
    return {
      redirect: {
       destination: '/404',
       permanent: false
     }
   }
  }

  return {
    props: {
      token
    }
  }
}