โ๏ธ๐ฐJavaScript ๋ณด์๐ก๏ธโ๏ธ
5746 ๋จ์ด javascriptwebdevsecurity
์ฝ๋์ ๋ณด์ ์ธ๋ถ ์ ๋ณด
๋๊ตฐ๊ฐ๊ฐ ๋น์ ์ ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ ๋, ๋น์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ๊ทธ๋ค์ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ฉฐ, ํ๋ฃจ๊ฐ ๋๋ ๋, ๊ทธ๋ค์ ๋น์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.๋ฐ๋ผ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด, ์ฝ๋๋ ๋๊ตฌ๋ ๋ณผ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ณต๊ฐํ ๊ฒ์ ๋๋ค.
์:
์ฝ๋์ ๊ด๋ฆฌ์ ๋น๋ฐ๋ฒํธ๋ฅผ ํฌํจํ๋ ๊ฒ์ ์ ๋ ํ์ฉํ์ง ์์ต๋๋ค...๋๋ JS ์ฝ๋์ ์ํธ์ ๋๋ค.
๋ง์ฝ ๋๊ตฐ๊ฐ๊ฐ ๋น์ ์ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ถ๋ค๋ฉด, ๊ทธ๋ค์ด ํด์ผ ํ ์ผ์ ๋ธ๋ผ์ฐ์ ์์ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ์ด๊ณ ์๋ณธ ์ฝ๋๋ฅผ ํด๋ฆญํ ๋ค์ JS ํ์ผ์ ํด๋ฆญํ๋ ๊ฒ์ด๋ค.๋๋๋ก, ๋ง์ฝ ๊ทธ๋ค์ด ์นํฉ์ด๋ ์ ์ฌํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์นํฉ์ด ์์ฑํ ์ฝ๋๋ ๋งจ ์์ ์๊ณ , ์ธ๋ฅ๊ฐ ์ฝ์ ์ ์๋ ์ฝ๋๋ ๋ฐ์ ์์ ๊ฒ์ด๋ค.
์ด๋ค ๊ฒฝ์ฐ, ๊ทธ๋ค์'ํ ์ค'์ฝ๋๋ฅผ ๋ณผ ์ ์์ง๋ง, ๊ทธ๊ฒ์ ๋์ฑ ์ฝ๊ฒ ์ฝ์ ์ ์๋๋ก ํ๊ธฐ ์ํด์, ์ฌ๋๋ค์ด ์ ์ผํ๊ฒ ํด์ผ ํ ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ ํฌ๋งท ๋๊ตฌ๋ฅผ ์จ๋ผ์ธ์ผ๋ก ๋ถ์ฌ์ ํ์ ํ๋ ๊ฒ์ด๋ค.์ฝ๊ธฐ ์ฝ์ต๋๋ค!
๋ค๋ฅธ ํํธ, ์ผ๋ถ API๋ API ํค๊ฐ ๋ ธ์ถ๋์ง ์๋๋ก ๋์์ค๋๋ค.์ด ์ค ์ผ๋ถ API๋ IP, ๋๋ฉ์ธ ์ด๋ฆ ๋ฑ์ ๊ธฐ๋ฐ์ผ๋ก API ํค ์ฌ์ฉ์ ์ ํํ ์ ์์ต๋๋ค.๋ ๋ค๋ฅธ ๋ณด์ ์ธ์ฆ์ ๊ณต์ ๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ์ environment variables ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๋ง์ฝ ์ด๋ค ์ด์ ๋ก๋ ์ฝ๋์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ค๋ฉด NodeJS์ ๊ฐ์ ์๋ฒ ์ธก ์ฝ๋์ ์ ์ฅํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
๐จ ์ฌ์ดํธ ๊ฐ ์คํฌ๋ฆฝํธ ๊ณต๊ฒฉ ์ผ๋ช XSS๐ฑ
๋๋ ๋์ ์ํฉ์ ๋ชจ๋ฅด๊ฒ ๋ค. ๋จ์ง XSS ๊ณต๊ฒฉ์ ๋ค์์ ๋ฟ์ด๋ค!๋๋ ์ด๋ฏธ ๋ชน์ ๋๋๋ค.
์ด๋ฐ ๊ณต๊ฒฉ์ ์ ๋จ์๋ง ์ ์ฉ๋๋ค.๋ฐฑ์๋๊ฐ ์ฝ๊ฒ ๊ณต๊ฒฉ๋ฐ์ง ์์ ์ ์๋ค๋ ๊ฒ์ ์๋์ง๋ง XSS ๊ณต๊ฒฉ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฒ ์ต๊ฒฉ์๐น ์ ์์ ์ธ JavaScript๋ฅผ ์ฃผ์ ํ๊ณ ์คํํฉ๋๋ค.
๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก, ์ฝ๋๋ฅผ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฃผ์ ํ ์ ์๋ ์ฌ๋์ด ์๋ค๋ฉด, ๋ง์ ์ผ์ ํ ์ ์๋ ์์ ๋ฐฉ์์ด๋ค.๊ตฌ๊ธ์ด๋ ํญ๊ณต์ฌ ํ์ด์ง์ ๋ค์ด๊ฐ๋ฉด ๋ก์ปฌ ์ ์ฅ์ ๋ฐฉ๋ฌธ ๋ฑ์ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋๋์ ์ ๋ณด๋ฅผ ์์งํ๋ค๊ณ ์์ํด ๋ณด์ธ์.
๋ณด์ ์ ๋ฌธ๊ฐ ๋๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ๋ innerHTML์์ ์คํ๋๋ ํ๊ทธ๋ฅผ ๋ง์์ ์ด ์ ์ ์คํํ๋ ๋ฐ ๋์์ ์ค๋๋ค.๊ทธ๋, ๋๋ ์ฌ์ ํ ์ฃผ์ฌ๋ฅผ ๋์ ์ ์์ง๋ง, ์ดํํ์ง๋ ์์ ๊ฑฐ์ผ.
ํ์ง๋ง!!ํ๋์ฏค์ ์๊ฒ ์ง๋งinnerHTML ์ฃผ์ ์ ํตํด ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
<img src="" onerror="alert('xss')/>
๋ฐ๋ผ์ ์ฝ๋๊ฐ ์คํ๋ ๋ ์ด๋ฏธ์ง ์๋ณธ์ ์ฐพ์ต๋๋ค.๊ฒฝ๊ณ ๊ฐ ์์ผ๋ฏ๋ก alert () ๋ฅผ ํ์ํฉ๋๋ค.innerHTML์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ํฉ์ ํผํ ์ ์์ต๋๋ค.ํ ์คํธ ๋ด์ฉ์ ์ฌ์ฉํฉ๋๋ค.ํ์ง๋ง ๋๋๋ก innerHTML์ด ํ์ํ ์๋ ์์ต๋๋ค.์ด๋ฐ ์ํฉ์ด๋ผ๋ฉด ์ฝ๋๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ ์ ์ ๋ฆฌํด์ผ ํ๋ค.sanitize-html๋ผ๋ ์์ฃผ ๋ฉ์ง NPM ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.์ด ํจํค์ง๋ ํ ์คํธ๋ฅผ ์ ๋ฆฌํ๊ณ ํ์ํ์ง ์์ ํ๊ทธ๋ฅผ ์ญ์ ํ์ฌ ์ ์ฑ์ฝ๋๋ฅผ ์คํํ์ง ์์ต๋๋ค.์๋ฒ ์ชฝ์์ ์ฒญ์๋ ํด์ผ ํฉ๋๋ค.ํผ์ ์ ๋ณด๋ฅผ ์ ๋ ฅํ ๋, ๋๋ ์ ์ฑ ์ฝ๋๋ฅผ ์ณ๋ค๋ณผ ์ ์์ผ๋ฉฐ, ์ด ์ฝ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๊ฒ์ด๋ค.์ผ๋จ ๊ทธ๊ฒ์ด ๋ ๋๋ง๋๋ฉด, ๊ทธ๊ฒ์ ์คํ๋ ์ ์๋ค.์๋ฒ์์ ์ด NPM ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฃ์ด์ผ ํฉ๋๋ค.
ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ 3์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋, ๋น์ ์ ๋ฐ๋์ ๊ทธ๊ฒ๋ค์ด ์์ ํ๋ค๋ ๊ฒ์ ํ๋ณดํด์ผ ํฉ๋๋ค.๋๋๋กgithub์ ๋ค์ด๋ก๋ ์๋ ์คํ ์๋ ์์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ผ๋ ๊ฒ์ ์๋ฏธํ์ง ์๋๋ค.
this ์์ฃผ ์ฌ๋ฏธ์๋ ์ด์ผ๊ธฐ์ ๊ดํ ๊ธ์ ๋ณด์ญ์์ค. ์ด ์ด์ผ๊ธฐ๋ ๋๊ตฐ๊ฐ๊ฐ NPM ๊ฐ๋ฐฉ์ ์ฌ์ฉํ์ฌ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์น๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
NPM์ ์ํํธ์จ์ด ํจํค์ง๋ฅผ ์ค์นํ ๋ ๋นํ ์ค์บ์ ์คํํจ์ผ๋ก์จ ๋์์ด ๋ฉ๋๋ค.์ฃผ์: ๋ชจ๋ ๋นํ์ด ๋์ ๊ฒ์ ์๋๋ค!๋ฏธ์น๊ธฐ ์ ์ ์ฐ๊ตฌ๋ฅผ ์ข ํด๋ผ.
์ฌ์ดํธ ๊ฐ CSRF ์์ฒญ
์ด๋ฐ ๊ณต๊ฒฉ์ ์ฌ๋๋ค์ด ๋น์ ์ ์์ฌ์ ๋งํฌ๋ฅผ ํด๋ฆญํ๋ ๊ฒ์ ๊ฐ๋ฆฌํจ๋ค. ์ด ๋งํฌ๋ ์ค๋น๋ ํ์ด์ง๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๊ทธ๋ค์ ๋น์ ์ ๋ก์ปฌ ์ฟ ํค๋ฅผ ๋จ์ฉํ๊ณ ํต์์ ์ผ๋ก ๋ํ๋ฅผ ๋๋๋ ํ์ด์ง์ ์์ฒญ์ ๋ณด๋ธ๋ค.
์ด๊ฒ์ ์๋น์ค ๋ฐฉ๋ฉด์ ๋ฌธ์ ๊ฐ์ง๋ง, ์ธ๊ธํ ๋งํ๋ค.์์:
์๋ฅผ ๋ค์ด, ๋น์ ์ "x"์ฌ์ดํธ์ ๊ฐ ์ ์์ต๋๋ค. ๊ทธ๋ค์ ๋น์ ์ ๋ก์ปฌ ์ ์ฅ์์์ ๋น์ ์ ์ ๋ณด๋ฅผ ํ์น ๊ฒ์ ๋๋ค.๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ๋๋ฅผ ํ์ ์ฌ์ดํธ๋ก ์ธ๋ํ ๊ฒ์ด๋ค.์๋ฅผ ๋ค์ดpaypal์ฒ๋ผ ๋ณด์ด๋ ์ฌ์ดํธ๋ฅผ ๊ฐ์ ํ๋ค.๊ทธ๋ค์ ๋น์ ์ ๋ก์ปฌ ์ ์ฅ์์์ ์ป์ ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ๋ณด๋ด๊ณ ์ถ์ง ์์ ์ฌ๋์๊ฒ ๋์ ๋ณด๋ผ ์ ์๋ค.์ด๊ฒ์ ํด์ปค์๊ฒ ๊ธด ๊ณผ์ ์ผ ์๋ ์์ง๋ง, ๊ทธ๊ฒ์ ํ ์ ์๋ค.
์ด๋ฌํ ๊ณต๊ฒฉ์ NodeJS๋ JavaScript ๊ธฐ์ ๋ฟ๋ง ์๋๋ผ ์น ๊ฐ๋ฐ์๋ ๋ณดํธ์ ์ผ๋ก ์ ์ฉ๋๋ค.
CSRF๋ ์๋ฐฉํ ์ ์์ต๋๊น?๋ง๋ค
CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ 3๊ฐ์ง ๊ธฐ์ ์ด ์์ต๋๋ค.
- ์ํธ ๋๋ ๊ฐ์ธ ์ ๋ณด ํ์ธ ์์ฒญ
- ์ผํ์ฉ ํ ํฐ ๋ฐํ
์ฃผ์: ๋์ ์์ ์ฑ์ด ํ์ํ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ํจ์ ์ง๋ฌธ ์๋ต์ ์ฌ์ฉํ์ฌ ์์ ์ฑ์ ํ๋ณดํด์ผ ํ๋ค.
3. ๋ฐCSRF ์ํจ: ์ฌ์ฉ์๊ฐ ์ ๋ณด๋ฅผ ์ ์ถํ๊ณ ์ฌ์ดํธ์ ์ํธ์์ฉ์ ํ๊ฑฐ๋ ๋ค๋ฅธ ์ฟ ํค๋ฅผ ์์ฑํ๋ ์์ ์ ์ํํ ๋ ๋ฐCSRF ์ํจ๋ ์ฟ ํค ์์ฒญ์ ํฌํจ๋์ด์ผ ํ๋ค.๊ทธ๋ฆฌ๊ณ ์ด ์์ฒญ์ ๊ฒ์ฆ ๊ณผ์ ์ ํตํด ์คํ๋๋ฉฐ, ๊ทธ ์ค์์ ์ด ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ์ด ์ํจ์ ์ง์ค์ฑ, ์ฌ์ง์ด ์กด์ฌ์ฑ์ ๊ฒ์ฆํ๋ค.์ํจ๊ฐ ๋ถ์กฑํ๊ฑฐ๋ ์ ํํ์ง ์์ผ๋ฉด ์์ฒญ์ ๊ฑฐ์ ํ ์ ์์ต๋๋ค.
์์ค ๊ฐ ๊ณต์ ๋ฅผ ํตํ ๋ฒ๊ฑฐ๋ก์ด CORS๐
๋ธ๋ผ์ฐ์ ์ธก ์์ฉ ํ๋ก๊ทธ๋จ์์ ์จ ์์ฒญ์ ๊ฐ์ ์๋ฒ์์ ์คํ๋๋ ๋ฐฑ์๋์๋ง ๋ณด๋ผ ์ ์๋ค๋ ๊ฐ๋ ์ด๋ค.
์ด๋ค ์ด์ ๋ก๋ ํ๋ฐํธ์๋์ ๋ฐฑ์๋๋ฅผ ๋ค๋ฅธ ์๋ฒ์ ํธ์คํ ํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ง ์๋ต์ ํค๋๋ฅผ ์ง์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.์ด ๊ฐ๋ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ๋ ๋ค๋ฅธ ์๋ฒ์'๋ํ'๋ฅผ ํ์ฉํ์ง ์์ง๋ง, ์ ํํ ์๋ฒ ๋์ ์ฌ์ฉํ๋ฉด ๋ฎ์ด์ธ ์ ์์ต๋๋ค.Cors NPM ํจํค์ง๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์๋์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
๋ ธ๋JS ์ฝ๋
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.json({data: [1,2,3,4]})
});
์ฐธ๊ณ : CORS ๊ฐ๋
์ ํ๋ฐํธ์๋์ ๋ฐฑ์๋์ ์ํธ์์ฉ์ ์๋ํ๋ ์ฝ๋๊ฐ ์๋ ๋ชจ๋ ์น ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ์ฉ๋ฉ๋๋ค.nodejs, php๋ ๋ญ๋
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(โ๏ธ๐ฐJavaScript ๋ณด์๐ก๏ธโ๏ธ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/devpato/javascript-security-1mocํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค