์์
์ค ๊ถ๊ธํ ์ฌํญ์ ์ง๋ฌธ ์ฌํญ์ ์ฌ๋ ค์ฃผ์ธ์.
๋งค์ผ ํ ๋ฒ์ฉ ํ์ธํ๊ณ ๋ต๋ณ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
Courses
Reviews
- [React Part 2] Advanced Topics and Hooks
- [React Part 2] Advanced Topics and Hooks
- Master the Core of Web Development, HTTP Perfectly!
- The Beginning of the Web - An Easy Understanding of the Birth and Basics of HTTP
- [React Part 1] Learning React by Building and Comparing
Posts
Q&A
์ฌ์ ์์ฒญ ๊ด๋ จ ์ง๋ฌธ
์ข์ ์ง๋ฌธ์ ๋๋ค. ๋ ๊ฐ์ง๋ก ๋๋ ์ ๋ง์ ๋๋ ค๋ณผ๊ฒ์.1) GET๊ณผ POST ์์ฒญ๋ง ์ฌ์ฉํ๋ ๊ฒPreflight๋ฅผ ํผํ๋ ค๊ณ HTTP ๋ฉ์๋๋ฅผ ์ ํํ๋ ๊ฒ์ ๊ถ์ฅ๋๋ฆฌ์ง ์์ต๋๋ค. PUT, PATCH, DELETE๋ ๊ฐ์ ์์์ ์์ , ๋ถ๋ถ ์์ , ์ญ์ ๋ฅผ ์๋ฏธํ๋ ๋ํ ๋ฉ์๋์์. ๋ชจ๋ ์์ฒญ์ GET/PUT์ผ๋ก๋ง ๊ตฌํํ๋ฉด API ์๋ฏธ๊ฐ ๋ถ๋ถ๋ช ํด์ง๊ณ ์ ์ง๋ณด์ ๋ฉด์์ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.Preflight ์์ฒญ์ ๋ธ๋ผ์ฐ์ ธ์ ํ์ ์์ ์ฅ์น์์. ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ์๋ฒ๊ฐ ํ์ฉํ๋ ํ์ธํ๊ธฐ ์ํด OPTIONS๋ฅผ ์ฌ์ฉํ๋๋ฐ์. ์ด ๊ณผ์ ์ ๋ณด์์์ ์ด์ ๋ก ์์ฐ๋ ๊ฒ ๋ณด๋ค๋ ์ ๋ค๋ฃจ๋ ๊ฒ ์ค์ํฉ๋๋ค.2) GET/POST๋ง ์ฌ์ ์์ฒญ์ ์ํ๋ ๊ฒ์์ ํ ์์ฒญ์ผ ๊ฒฝ์ฐ์ Preflight ์์ฒญ์ ๋ณด๋ด์ง ์๋๋ค๊ณ ์ค๋ช ๋๋ ธ๋๋ฐ์. ๊ฐ์์์ ๋ค๋ค๋ ์กฐ๊ฑด ์ธ์๋ Content-Type ํค๋์ ๊ฐ๋ ๊ฒ์ฌํฉ๋๋ค.application/x-www-form-urlencoded multipart/form-data text/plainPOST ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด Content-Type: application/json ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋๋ฐ์. ์ด ๊ฒฝ์ฐ์๋ ๋จ์ ์์ฒญ์ด ์๋๊ธฐ ๋๋ฌธ์ Preflight ์์ฒญ์ ๋ณด๋ ๋๋ค.์ฐธ๊ณ : https://developer.mozilla.org/ko/docs/Web/HTTP/Guides/CORS
- 1
- 2
- 26
Q&A
rest api ์์์ csrf
์ง๋ฌธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. REST API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ ๊ฐ์ง๋ก ์๊ฐํ ์ ์์ ๊ฒ ๊ฐ์์.1) ์ฟ ํค ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฌ์ฉํ๋ API: ๋ธ๋ผ์ฐ์ ธ๊ฐ ์๋ฒ์๊ฒ ๋ฐ์ ์ฟ ํค๋ฅผ ์์ฒญ ํค๋์ ์ค์ด ๋ณด๋ด๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ CSRF ๊ณต๊ฒฉ์ ์ทจ์ฝํ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด CSRF ํ ํฐ์ผ๋ก ์๋ฐฉํฉ๋๋ค.2) ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฌ์ฉํ๋ API: ๋ธ๋ผ์ฐ์ ธ์์ ์คํ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์๋ฒ์๊ฒ ๋ฐ์ ํ ํฐ ๊ฐ์ ์์ฒญ ํค๋์ '์ง์ ' ์ค์ด ๋ณด๋ด๋ ๊ตฌ์กฐ๋ผ์ CSRF ๊ณต๊ฒฉ์ ๋ ์ทจ์ฝํฉ๋๋ค.ํ์ง๋ง ๋ธ๋ผ์ฐ์ ธ์์ ๊ด๋ จํ ๋ณด์ ์กฐ์น๋ฅผ ์ง์ํ๊ณ (์ค์ต์์๋ ๋ธ๋ผ์ฐ์ ธ ์ค์ ์ ๋ณ๊ฒฝํจ), ์๋ฒ์์ ์ฟ ํค๋ฅผ ๋ฐ๊ธํ ๋ ๋ณด์ ์ ์ฑ ์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด๋์ ๋ ๊ณต๊ฒฉ์ ์์ ํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
- 1
- 1
- 21
Q&A
ํ์ด์ญํน ๊ด๋ จ ๋ฌธ์
์ฝ๊ฒ ๋ง์๋๋ฆฌ๋ฉด, ์ง๊ธ ์น ํ์ด์ง๊ฐ "์ด ํ์ด์ง์์๋ ์ด๋ฐ ์ข ๋ฅ์ ์คํฌ๋ฆฝํธ๋ง ์คํํ ์ ์์ด!" ํ๊ณ ๋ธ๋ผ์ฐ์ ์๊ฒ ๊ท์น์ ์ ํด๋์ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ํผ์ ์ ๋ ฅํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ด ๊ท์น์ ๋ง์ง ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ฐจ๋จํ๋ ๊ฒ์ด์ฃ .์ด ๋ Content-Security-Policy (CSP) ๋ผ๋ ๊ฒ์ด ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๋ง์น ์น ํ์ด์ง์ ๋ณด์ ๊ฒฝ๋น์ ๊ฐ์ ์ญํ ์ ํด์, ์ด๋ค ์ธ๋ถ ์์(์คํฌ๋ฆฝํธ, ์คํ์ผ ์ํธ, ์ด๋ฏธ์ง ๋ฑ)์ ๋ถ๋ฌ์ฌ ์ ์๊ณ ์ด๋ค ๋์์ ํ์ฉํ ์ง ๋ฑ์ ํ์ธํ๊ณ ์๋ฐํ๋ ๊ฒ์ ์ฐจ๋จํ๋ ๊ฒ์ด์ฃ .๋ง์ํ์ Content-Security-Policy-Report-Only ๋ผ๋ ์ต์ ์ ์กฐ๊ธ ํน๋ณํฉ๋๋ค. "๋ง์ฝ ๋ณด์ ์ ์ฑ ์ ์๋ฐ๋๋ ์ฌํญ์ด ์์ผ๋ฉด ๋ํํ ์๋ ค์ฃผ๊ธฐ๋ง ํ๊ณ , ์ค์ ๋ก ๋ง์ง๋ ๋ง" ๋ผ๋ ์๋ฏธ์ ๋๋ค. ๊ทธ๋์ ์ด ์ต์ ๋๋ฌธ์ ์คํฌ๋ฆฝํธ ์คํ์ด ์ ๋์ ๊ฐ๋ฅ์ฑ์ ๋ฎ์ต๋๋ค.์๋ง ์น ์๋ฒ ์ค์ ์์ Content-Security-Policy ํค๋๊ฐ ์ค์ ๋์ด ์๊ณ , ๊ทธ ์ ์ฑ ๋๋ฌธ์ ์ ๋ ฅํ์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋์ง ์๋ ๊ฒ์ผ ์ ์์ต๋๋ค.ํน์ ์น ์๋ฒ ์ค์ ์ด๋ ๊ด๋ จ ์ฝ๋๋ฅผ ํ์ธํด ๋ณด์ค ์ ์์๊น์? ์ด๋ค CSP ์ ์ฑ ์ด ์ค์ ๋์ด ์๋์ง ์๋ฉด ๋ฌธ์ ํด๊ฒฐ์ ๋ ๋์์ด ๋ ๊ฑฐ์์! ๐
- 1
- 2
- 75
Q&A
์บ์ฑ ๊ด๋ จ ๋ฌธ์
๋ค ๋ง์ต๋๋ค. ๋ธ๋ผ์ฐ์ ธ์ ๊ฐ๋ฐ์๋๊ตฌ์์ ์ฌ์ฉํ๋ ์ต์ ์ HTTP ํค๋์ ๋ฌด๊ดํ๊ฒ ๊ฐ๋ฐ์ ๋๊ตฌ๊ฐ ์ด๋ ค์๋ ๋์ ์บ์๋ฅผ ๊ฐ์ ๋ก ๋ฌด์ํ๊ฒ ๋ง๋ญ๋๋ค. ๊ฐ๋ฐ ์ ๋๋ฒ๊น ์ฉ๋๋ก ๋ง์ด ์ฌ์ฉํ๋ ์ต์ ์ด์์.
- 1
- 1
- 65
Q&A
FormControl ์ปดํฌ๋ํธ ์ฌ์ฉ์ htmlFor prop ๊ฐ ๋๊ธธ ๋ ์ค๊ดํธ ์ด์
์๋ ํ์ธ์, ์๊ฐํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ข์ ์ง๋ฌธ์ ์ฃผ์ จ๋๋ฐ์, ํต์ฌ์ JSX ๋ฌธ๋ฒ์์์ ์ฐจ์ด์ ๋๋ค.label="์ด๋ฆ" ์ฒ๋ผ ๋ฐ์ดํ ์์ ๊ฐ์ ๋ฃ์ผ๋ฉด ๋ฌธ์์ด ๋ฆฌํฐ๋ด๋ก ์ ๋ฌ๋ฉ๋๋ค.htmlFor={"name"} ์ฒ๋ผ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฐ์ค๋ฆฝํธ ํํ์์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.ํ๋กญ ์ธ์์ ๋ฌธ์์ด๋ง ์ ๋ฌํ๋ฉด ๋ ๋ค ์ฌ์ฉํ ์ ์์ต๋๋ค.ํํธ, ํํ์์ผ๋ก ๋ฌธ์์ด์ ์ ๋ฌํ ๊ฒฝ์ฐ์๋ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ์๋ฉด ์ข์ต๋๋ค. ์: htmlFor={`${name}`}
- 1
- 1
- 84
Q&A
dispatch ํจ์๋ ๋ฆฌ๋ ๋๋ง ์ ๋ฐํ์ง ์๋์?
๋ฆฌ์กํธ์์ dispatch๋ฅผ ํธ์ถํ๋ฉด ์ํ๊ฐ ์ฆ์ ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ์๋๋ผ, ๋ค์ ๋ ๋๋ง์์ ๋ฐ์๋ฉ๋๋ค. ์ฆ, dispatch ์งํ์ ์ํ ๊ฐ์ ์ฝ์ผ๋ฉด ์ฌ์ ํ ์ด์ ์ํ๊ฐ ์ ์ง๋ฉ๋๋ค.๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์ ๋ด์ฉ ์ฐธ๊ณ : https://react.dev/reference/react/useReducer"The dispatch function only updates the state variable for the next render. If you read the state variable after calling the dispatch function, you will still get the old value that was on the screen before your call." ์ด ์ฝ๋์์ onSubmit() ํจ์๊ฐ ์คํ๋ ๋, ์ํ ๊ฐ์ด ์ฆ์ ๋ฐ์๋์ง ์์ผ๋ฏ๋ก ๊ฐฑ์ ๋ ์ํ๋ฅผ ์ง์ ๊ณ์ฐํ๊ธฐ ์ํด formReducer(state, { type: "VALIDATE", validate })๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ์ฌ ๋ ๋๋ง์์ ์ฌ์ฉํ ์ํ๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํ์ฌ onSubmit()์์ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ์ ๋ฌํ ์ ์์ต๋๋ค.์ฆ, dispatch๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํด๋ ๊ฐ ์ํ ๋ณ๊ฒฝ์ ๋ค์ ๋ ๋๋ง์์ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์, ๋์ผํ ๋ ๋๋ง ๋ด์์ ์ฆ์ ๋ณ๊ฒฝ๋ ๊ฐ์ ํ์ฉํ๋ ค๋ฉด dispatch ํ์ ์ํ๊ฐ ์๋, ์ง์ ๊ณ์ฐํ ๊ฐ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- 1
- 2
- 150
Q&A
๊ฐ์ฒด๊ฐ ํจ๊ป ๋ฐํ๋๋๋ฐ ์ ๊ทธ๋ด๊น์
์๋ ํ์ธ์? ์ง๋ฌธ์ ๋ฑ๋กํด ์ฃผ์ จ๋๋ฐ ๋ณธ๋ฌธ์ ๋ก ๋จ์์๋ค์. ํน์ ๋ฌธ์ ๋ ํด๊ฒฐํ์ จ์๊น์?
- 1
- 2
- 95
Q&A
ProductItem์์ onClick = {onClick}์ ๋ฌ์ง ์์๋ ๋๋ ์ด์
ProductItem.jsx์ onClick์ด ๋ฒํผ์ ์ฌ์ฉ๋๊ธดํฉ๋๋ค. 2-advanced/09-popstate ๋ธ๋์น์์ ํ์ธํ์ค ์ ์๊ณ ์. {onClick && ( ์ฃผ๋ฌธํ๊ธฐ )} ํน์ ์์ ์ ๋ฐ๋ผ์ค์๋ฉด์ ๋๋ฝํ์ ๊ฒ ์๋๊ฐ ์ถ๋ค์.
- 1
- 2
- 115
Q&A
replaceState๋ฅผ ์ฐ์ง ์๋ ๋์
์ฌ๋ ค์ฃผ์ ์ฝ๋์์ ์ด๋ค ๋์์ ๊ธฐ๋ํ์ จ๋์ง ์กฐ๊ธ ๋ ์ค๋ช ํด์ฃผ์ค ์ ์์๊น์?replaceState๋ฅผ ์ฌ์ฉํ์ง ์๊ณ event.currentTarget.document.location.pathname์ ํ์ฉํ๋ ๋ฐฉ์์ด ์ ์์ ์ผ๋ก ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ผ๋ถ ์ํฉ์์ ์๋์น ์์ ๋์์ด ๋ฐ์ํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.์๋ฅผ ๋ค์ด, pushState๋ก ์๋ก์ด ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ฉด ๋ธ๋ผ์ฐ์ ์ ์ฃผ์๋ ๋ณ๊ฒฝ๋์ง๋ง, popstate ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ event.state ๊ฐ์ด ๋น์ด ์์ ์ ์์ต๋๋ค. replaceState๋ฅผ ํ์ฉํ๋ฉด ์ด๊ธฐ ์ํ๋ฅผ ๋ช ํํ๊ฒ ์ค์ ํ ์ ์์ด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.ํน์ ํน์ ํ ์ด์ ๋ก replaceState ์์ด ํด๊ฒฐํ๊ณ ์ถ์ผ์ ๊ฑธ๊น์? ๊ธฐ๋ํ์ ๋์๊ณผ ํ์ฌ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์กฐ๊ธ ๋ ์ค๋ช ํด์ฃผ์๋ฉด ๋์์ด ๋ ๊ฒ ๊ฐ์์.
- 1
- 2
- 133
Q&A
์๋ฌ ํด๊ฒฐ ๊ณต์ ๋๋ฆฝ๋๋ค
์ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๊ณต์ ํด ์ฃผ์ ๋๋ถ์, ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช๋ ๋ค๋ฅธ ๋ถ๋ค๊ป ํฐ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ธ๋ ๋ฒ์ ๋ฌธ์ ์ ๋งฅ ์ค๋ฆฌ์ฝ ํ๊ฒฝ์์์ ํด๊ฒฐ ๋ฐฉ๋ฒ๊น์ง ์์ธํ ์ ๋ฆฌํด ์ฃผ์ ์ ์ ๋ง ๊ณ ๋ง์ต๋๋ค.
- 1
- 2
- 165