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
}
}
}