11. ๐Ÿ” ํ”„๋ก ํŠธ์—”๋“œ ๋ณด์•ˆ ์œ„ํ˜‘๊ณผ ๋ฐฉ์–ด ์ „๋žต

2026๋…„ 3์›” 5์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•  XSS, CSRF ๊ณต๊ฒฉ ๋Œ€์‘๋ฒ•๊ณผ ์•ˆ์ „ํ•œ ์ธ์ฆ ์‹œ์Šคํ…œ ๊ตฌ์ถ• ์ „๋žต์„ ๋งˆ์Šคํ„ฐํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ด ๋ฉด์ ‘ ํ•ญ๋ชฉ์˜ ๋ชฉํ‘œ

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 20๋ถ„ (ํ•ต์‹ฌ ์š”์•ฝ: 10๋ถ„)

๐Ÿ—บ๏ธ ์ด ์ฑ•ํ„ฐ์˜ ํ๋ฆ„
[๊ฐœ๋… ์‚ฌ์ „] โ†’ [์งˆ๋ฌธ 1: XSS & CSRF ๋ฐฉ์–ด] โ†’ [์งˆ๋ฌธ 2: ํ† ํฐ ๋ณด์•ˆ & SSR ์ธ์ฆ] โ†’ [์‹ค์ „ ๋ณ€ํ˜• ์งˆ๋ฌธ]

๐ŸŽฏ ์ด ์ฑ•ํ„ฐ๋ฅผ ๋‹ค ์ฝ์œผ๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  • ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ๋ณด์•ˆ ์œ„ํ˜‘์˜ ์›๋ฆฌ์™€ ๋ฐฉ์–ด ๊ธฐ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  • Content Security Policy(CSP)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณด์•ˆ ์ˆ˜์ค€์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฒ•์„ ์ตํž™๋‹ˆ๋‹ค.
  • ์™œ Access Token์„ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๋ฉด ์•ˆ ๋˜๋Š”์ง€ ๋ณด์•ˆ์  ๊ด€์ ์—์„œ ๋…ผํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“š ํ•ต์‹ฌ ๊ฐœ๋… ์‚ฌ์ „ (Concept Glossary)

1. XSS (Cross-Site Scripting)

๊ณต๊ฒฉ์ž๊ฐ€ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ฟ ํ‚ค ํƒˆ์ทจ, ์„ธ์…˜ ๊ฐ€๋กœ์ฑ„๊ธฐ ๋“ฑ์ด ๊ฐ€๋Šฅํ•ด์ง€๋ฉฐ ํ”„๋ก ํŠธ์—”๋“œ ๋ณด์•ˆ์˜ ์ตœ๋Œ€ ๊ณต๊ณต์˜ ์ ์ž…๋‹ˆ๋‹ค.

2. CSRF (Cross-Site Request Forgery)

์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์˜์ง€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ํ–‰์œ„(๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ์†ก๊ธˆ ๋“ฑ)๋ฅผ ํŠน์ • ์›น์‚ฌ์ดํŠธ์— ์š”์ฒญํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์ธ์ฆ๋œ ์„ธ์…˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ์•…์šฉํ•ฉ๋‹ˆ๋‹ค.

  • HttpOnly: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(document.cookie)๋กœ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„ XSS๋กœ๋ถ€ํ„ฐ ํ† ํฐ์„ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.
  • Secure: ์˜ค์ง HTTPS ์—ฐ๊ฒฐ์—์„œ๋งŒ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜๋„๋ก ํ•˜์—ฌ ํ†ต์‹  ๊ณผ์ •์˜ ์œ ์ถœ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

  • ๐Ÿฃ ์˜์ฒ  ( ์‹ ์ž… ): "์˜ํ˜ธ ๋‹˜! '์˜์ˆ˜๋„ค ๊ฒŒ์‹œํŒ' ๋Œ“๊ธ€์— ๋ˆ„๊ตฐ๊ฐ€ <script>alert('ํ•ดํ‚น๋จ')</script>์„ ์ž”์ž”ํ•˜๊ฒŒ ๊น”์•„๋†จ์–ด์š”! ๐Ÿ˜ฑ ๋‹คํ–‰ํžˆ ์•Œ๋ฆผ๋งŒ ๋œจ๋Š”๋ฐ, ์ง„์งœ ํ•ด์ปค๋ผ๋ฉด ์–ด์ฉŒ์ฃ ?"
  • ๐Ÿฆ ์˜ํ˜ธ ( ๋ฆฌ๋“œ ): "์˜์ฒ  ๋‹˜, ๊ทธ๊ฑด ํ•ด์ปค๊ฐ€ ๋ณด๋‚ธ '๊ฒฝ๊ณ ์žฅ'์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ alert์ด์ง€๋งŒ ๋‹ค์Œ์—” ์œ ์ €์˜ ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ํ•ด์ปค ์„œ๋ฒ„๋กœ ์ „์†ก๋˜๊ฒ ์ฃ . ํ”„๋ก ํŠธ์—”๋“œ๋Š” ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๋‹ด๋Š” '๊ธˆ๊ณ '์˜ ์ž…๊ตฌ์˜ˆ์š”. ์ž…๊ตฌ๊ฐ€ ๋šซ๋ฆฌ๋ฉด ๊ธˆ๊ณ ๋Š” ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค."

Q1. XSS์™€ CSRF ๊ณต๊ฒฉ์˜ ๊ฒฐ์ •์ ์ธ ์ฐจ์ด์ ๊ณผ, ๊ฐ๊ฐ์˜ ํ”„๋ก ํŠธ์—”๋“œ ์ธก ๋ฐฉ์–ด ์ „๋žต์„ ์„ค๋ช…ํ•ด ๋ณด์„ธ์š”.

๐ŸŽฏ ์ถœ์ œ ์˜๋„

์›น ๋ณด์•ˆ์˜ 2๋Œ€ ์‚ฐ๋งฅ์„ ์ •ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์˜ '์ฃผ์ฒด'์™€ '๋Œ€์ƒ'์„ ์ดํ•ดํ•ด์•ผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์–ด ๋กœ์ง์„ ์งค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿฃ ์˜์ฒ ์ด์˜ Naive ๊ตฌํ˜„ (Bad Case)

์˜์ฒ ์ด๋Š” ๊ฒŒ์‹œํŒ ๋ฐ์ดํ„ฐ๋ฅผ dangerouslySetInnerHTML๋กœ ์•„๋ฌด ๊ฒ€์ฆ ์—†์ด ๋ Œ๋”๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

// ๐Ÿฃ ์˜์ฒ : "์„œ๋ฒ„์—์„œ ์˜จ ๋ฐ์ดํ„ฐ๋‹ˆ๊นŒ ๋ฏฟ์–ด๋„ ๋˜๊ฒ ์ฃ ?"
function PostContent({ content }) {
  // โš ๏ธ ์œ„ํ—˜: content์— <script> ํƒœ๊ทธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋จ (XSS)
  return <div dangerouslySetInnerHTML={{ __html: content }} />;
}

๐Ÿฆ ์˜ํ˜ธ์˜ ํŒฉํญ ์กฐ์–ธ
"์˜์ฒ  ๋‹˜, 'dangerously'๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์€ ์ด์œ ๊ฐ€ ์žˆ์–ด์š”. ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ์ ˆ๋Œ€ ๋ฏฟ์ง€ ๋งˆ์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  CSRF๋Š” ์šฐ๋ฆฌ ์‚ฌ์ดํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ '๋‚จ์˜ ์‚ฌ์ดํŠธ'์—์„œ ์šฐ๋ฆฌ์—๊ฒŒ ์ด์„ ์˜๋Š” ๊ฑฐ๋ผ๋Š” ๊ฑธ ์žŠ์ง€ ๋งˆ์„ธ์š”."

๐Ÿฆ ์˜ํ˜ธ์˜ ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ (Good Case)

์˜ํ˜ธ ๋ฆฌ๋“œ๊ฐ€ ์ œ์•ˆํ•˜๋Š” 2์ค‘, 3์ค‘ ๋ณด์•ˆ ๋ ˆ์ด์–ด์ž…๋‹ˆ๋‹ค.

// ๐Ÿฆ ์˜ํ˜ธ: "๋šซ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ค‘์ฒฉ๋œ ๋ฐฉํŒจ๋ฅผ ์„ธ์šฐ์„ธ์š”."
 
// 1. XSS ๋ฐฉ์–ด (Sanitization)
import DOMPurify from 'dompurify'; // โœ… ํ—ˆ์šฉ๋œ ํƒœ๊ทธ๋งŒ ๊ณจ๋ผ๋‚ด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ
function SafePostContent({ content }) {
  const cleanContent = DOMPurify.sanitize(content);
  return <div dangerouslySetInnerHTML={{ __html: cleanContent }} />;
}
 
// 2. CSRF ๋ฐฉ์–ด
// - SameSite Cookie ์„ค์ •: ์ฟ ํ‚ค๊ฐ€ ์˜ค์ง '์šฐ๋ฆฌ ์‚ฌ์ดํŠธ'์—์„œ๋งŒ ์ „์†ก๋˜๋„๋ก ์ œํ•œ
// - CSRF Token: ์„œ๋ฒ„์—์„œ ๋ฐœ๊ธ‰ํ•œ ์ผํšŒ์šฉ ํ† ํฐ์„ ํ—ค๋”์— ๋‹ด์•„ ์ „์†ก
// - Custom Header: API ์š”์ฒญ ์‹œ X-Requested-With ๊ฐ™์€ ์ปค์Šคํ…€ ํ—ค๋” ๊ฐ•์ œ (Cross-origin ์ฐจ๋‹จ)

๐Ÿ“Š ๋ ˆ๋ฒจ๋ณ„ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ (Self-Check)

  • Level 1 (Junior): "XSS๋Š” ๊ฒŒ์‹œํŒ์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด๊ณ , CSRF๋Š” ๋‚จ์˜ ์‚ฌ์ดํŠธ์—์„œ ๋‚ด ๊ณ„์ •์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์จ์„œ ๋ง‰์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค."
  • Level 2 (Senior): "XSS ๋ฐฉ์–ด๋ฅผ ์œ„ํ•œ ์ด์Šค์ผ€์ดํ”„(Escape) ์ฒ˜๋ฆฌ์™€ DOMPurify ํ™œ์šฉ, CSP ์„ค์ •์˜ ์ค‘์š”์„ฑ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. CSRF ๋ฐฉ์–ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ฟ ํ‚ค์˜ SameSite ์†์„ฑ(Strict/Lax)์ด ์–ด๋–ป๊ฒŒ ์š”์ฒญ์„ ์ œ์–ดํ•˜๋Š”์ง€ ์›๋ฆฌ๋ฅผ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค."
  • Level 3 (Specialist): "ํ˜„๋Œ€์ ์ธ SPA ํ™˜๊ฒฝ์—์„œ JWT๋ฅผ ํ™œ์šฉํ•  ๋•Œ์˜ ๋ณด์•ˆ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๋…ผํ•ฉ๋‹ˆ๋‹ค. XSS๋Š” '์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ €์ง€'๊ฐ€ ํ•ต์‹ฌ์ด๊ณ , CSRF๋Š” '์š”์ฒญ์˜ ์ถœ์ฒ˜ ๊ฒ€์ฆ'์ด ํ•ต์‹ฌ์ž„์„ ์•„ํ‚คํ…์ฒ˜ ๊ด€์ ์—์„œ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Referrer-Policy๋‚˜ STS(Strict-Transport-Security) ๊ฐ™์€ ๊ณ ๊ธ‰ ๋ณด์•ˆ ํ—ค๋” ํ™œ์šฉ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค."

Q2. ์ธ์ฆ ํ† ํฐ(Access Token)์„ ์ €์žฅํ•  ๋•Œ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์™€ ์ฟ ํ‚ค ์ค‘ ์–ด๋А ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•œ๊ฐ€์š”? ๊ทธ ์ด์œ ์™€ ์‹ค์Šต์ ์ธ ๋ณด์•ˆ ์ „๋žต์„ ์„ค๋ช…ํ•ด ๋ณด์„ธ์š”.

๐ŸŽฏ ์ถœ์ œ ์˜๋„

๋ณด์•ˆ๊ณผ ํŽธ์˜์„ฑ ์‚ฌ์ด์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ •๋‹ต์€ ์—†์ง€๋งŒ, ๊ฐ ์„ ํƒ์ง€์— ๋”ฐ๋ฅธ '์œ„ํ˜‘ ๋ชจ๋ธ๋ง' ๋Šฅ๋ ฅ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿฃ ์˜์ฒ ์ด์˜ Naive ๊ตฌํ˜„ (Bad Case)

์˜์ฒ ์ด๋Š” ๊ตฌํ˜„์ด ํŽธํ•˜๋‹ค๋Š” ์ด์œ ๋กœ Access Token์„ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

// ๐Ÿฃ ์˜์ฒ : "์ƒˆ๋กœ๊ณ ์นจํ•ด๋„ ๋กœ๊ทธ์ธ ์•ˆ ํ’€๋ฆฌ๊ฒŒ ํ•˜๋ ค๋ฉด ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ์ œ์ผ ํŽธํ•ด์š”!"
localStorage.setItem('accessToken', token);
// โš ๏ธ ์น˜๋ช…์  ์•ฝ์ : XSS ํ•œ ๋ฐฉ์ด๋ฉด ํ•ด์ปค๊ฐ€ ๋ชจ๋“  ์œ ์ €์˜ ํ† ํฐ์„ ๋‹ค ํ„ธ์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ

๐Ÿฆ ์˜ํ˜ธ์˜ ํŒฉํญ ์กฐ์–ธ
"์˜์ฒ  ๋‹˜, ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—๊ฒŒ '๋‚˜๋ฅผ ๋งˆ์Œ๊ป ์ฝ์–ด์ค˜'๋ผ๊ณ  ๊ด‘๊ณ ํ•˜๋Š” ๊ณณ์ด์—์š”. ํ•ด์ปค์—๊ฒŒ ๋ ˆ๋“œ ์นดํŽซ์„ ๊น”์•„์ฃผ๋Š” ์…ˆ์ด์ฃ . ๋ณด์•ˆ์€ ์กฐ๊ธˆ ๋ถˆํŽธํ•˜๋”๋ผ๋„ '์•ˆ์ „ํ•œ ๊ธธ'๋กœ ๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค."

๐Ÿฆ ์˜ํ˜ธ์˜ ์•„ํ‚คํ…์ฒ˜ ๊ฐ€์ด๋“œ (Good Case)

์˜ํ˜ธ ๋ฆฌ๋“œ๊ฐ€ ์ œ์•ˆํ•˜๋Š” 'ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ณด์•ˆ ์ „๋žต'์ž…๋‹ˆ๋‹ค.

// ๐Ÿฆ ์˜ํ˜ธ: "์ค‘์š”ํ•œ ์—ด์‡ ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋งŒ์งˆ ์ˆ˜ ์—†๋Š” ๊ณณ์— ๋‘์„ธ์š”."
 
/* 
  1. Refresh Token: HttpOnly & Secure ์ฟ ํ‚ค์— ์ €์žฅ
     - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ ‘๊ทผ ๋ถˆ๊ฐ€ (XSS ๋ฐฉ์–ด)
     - CSRF ๋ฐฉ์–ด๋ฅผ ์œ„ํ•ด SameSite ์„ค์ • ํ•„์ˆ˜
     
  2. Access Token: 
     - ๋ฐฉ๋ฒ• A: ๋ฉ”๋ชจ๋ฆฌ(React State)์— ์ €์žฅ (๊ฐ€์žฅ ์•ˆ์ „ํ•˜์ง€๋งŒ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ๋‚ ์•„๊ฐ)
     - ๋ฐฉ๋ฒ• B: ์งง์€ ์œ ํšจ๊ธฐ๊ฐ„์„ ๊ฐ€์ง„ ํ† ํฐ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , 
               Silent Refresh ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ์ฟ ํ‚ค์˜ Refresh Token์œผ๋กœ ์žฌ๋ฐœ๊ธ‰
*/

๐Ÿ“Š ๋ ˆ๋ฒจ๋ณ„ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ (Self-Check)

  • Level 1 (Junior): "์ฟ ํ‚ค๊ฐ€ ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. HttpOnly ์„ค์ •์„ ํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ชป ์ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค."
  • Level 2 (Senior): "๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋Š” XSS์— ์ทจ์•ฝํ•˜๊ณ , ์ฟ ํ‚ค๋Š” CSRF์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ์ ์„ ๋น„๊ต ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฟ ํ‚ค ์‚ฌ์šฉ ์‹œ SameSite: Lax/Strict ์„ค์ •๊ณผ CSRF Token ๋ฐฉ์‹์„ ๋ณ‘ํ–‰ํ•ด์•ผ ํ•จ์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค."
  • Level 3 (Specialist): "'์„ธ์…˜ ํ•˜์ด์žฌํ‚น' ๋ฐฉ์–ด๋ฅผ ์œ„ํ•œ ํฌ๊ด„์ ์ธ ์ „๋žต์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ† ํฐ์˜ ์œ ํœด ์‹œ๊ฐ„(Idle time) ๊ด€๋ฆฌ, ์ค‘๋ณต ๋กœ๊ทธ์ธ ๊ฐ์ง€, ๊ทธ๋ฆฌ๊ณ  ํ”„๋ก ํŠธ์—”๋“œ BFF(Backend For Frontend) ํŒจํ„ด์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์— ํ† ํฐ์„ ์•„์˜ˆ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š” ๋ณด์•ˆ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค."

Q212. CSP(Content Security Policy)๋ž€ ๋ฌด์—‡์ด๋ฉฐ, ์™œ ์„ค์ •ํ•ด์•ผ ํ•˜๋‚˜์š”?

  • ๐ŸŽฏ ์ถœ์ œ ์˜๋„: ๋ธŒ๋ผ์šฐ์ € ๋ ˆ๋ฒจ์—์„œ ๋ณด์•ˆ ์ •์ฑ…์„ ๊ฐ•์ œํ•˜๋Š” '์ตœํ›„์˜ ๋ฐฉ์–ด์„ '์— ๋Œ€ํ•ด ์•„๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ’ก ํ•ต์‹ฌ ์›๋ฆฌ & ๋‹ต๋ณ€: CSP๋Š” HTTP ํ—ค๋”๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž์›์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ํ•œ ์ถœ์ฒ˜(Origin)๋ฅผ ๋ช…์‹œํ•˜๋Š” ๋ณด์•ˆ ๋ ˆ์ด์–ด์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "์Šคํฌ๋ฆฝํŠธ๋Š” ์˜ค์ง ์šฐ๋ฆฌ ์„œ๋ฒ„์™€ Google Analytics์—์„œ๋งŒ ๋ฐ›์•„์™€!"๋ผ๊ณ  ์„ ์–ธํ•˜๋ฉด, ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•ด๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹คํ–‰์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ๊ธˆ์ง€, Eval ์‚ฌ์šฉ ๊ธˆ์ง€ ๋“ฑ์„ ํ†ตํ•ด XSS ์œ„ํ—˜์„ ํš๊ธฐ์ ์œผ๋กœ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Q225. HTTPS์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ์™œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋„ ์ด๋ฅผ ์ •ํ™•ํžˆ ์•Œ์•„์•ผ ํ•˜๋‚˜์š”?

  • ๐ŸŽฏ ์ถœ์ œ ์˜๋„: ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”์™€ ์ธ์ฆ์„œ ์ฒด๊ณ„์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์†Œ์–‘์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ’ก ํ•ต์‹ฌ ์›๋ฆฌ & ๋‹ต๋ณ€: HTTPS๋Š” ๊ณต๊ฐœํ‚ค์™€ ๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹์„ ํ˜ผํ•ฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์˜ ํ†ต์‹ ์„ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋Š” ๋‹จ์ˆœํžˆ '์ฃผ์†Œ์ฐฝ์— ์ž๋ฌผ์‡ '๋งŒ ๋ณด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, Secure ์ฟ ํ‚ค ์„ค์ •์ด HTTPS ํ™˜๊ฒฝ์—์„œ๋งŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ , ๊ทธ๋ฆฌ๊ณ  ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ(MITM) ์‹œ ๋ณด์•ˆ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•˜์—ฌ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Q230. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ ๋ณด์•ˆ(Supply Chain Attack)์„ ๋ฐฉ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์€?

  • ๐ŸŽฏ ์ถœ์ œ ์˜๋„: ๋‚ด๊ฐ€ ์ง  ์ฝ”๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‚จ์ด ๋งŒ๋“  ์ฝ”๋“œ(node_modules)์˜ ์œ„ํ—˜์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๐Ÿ’ก ํ•ต์‹ฌ ์›๋ฆฌ & ๋‹ต๋ณ€: npm audit์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ ์„ ์ฒดํฌํ•˜๊ณ , lock ํŒŒ์ผ์„ ํ†ตํ•ด ๋ชจ๋“  ํŒ€์›์ด ๋™์ผํ•˜๊ณ  ์•ˆ์ „ํ•œ ๋ฒ„์ „์˜ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ค‘์š” ํ”„๋กœ์ ํŠธ๋ผ๋ฉด Snyk ๊ฐ™์€ ๋ณด์•ˆ ๋„๊ตฌ๋ฅผ CI/CD์— ์—ฐ๋™ํ•˜์—ฌ ์ทจ์•ฝ์ ์ด ํฌํ•จ๋œ ์ฝ”๋“œ์˜ ๋ฐฐํฌ๋ฅผ ์ž๋™ ์ฐจ๋‹จํ•˜๋Š” ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๐Ÿฃ ์˜์ฒ ์ด์˜ ๋ณต๊ธฐ ์ผ๊ธฐ

์˜ค๋Š˜ ๋ณด์•ˆ์„ ๋ฐฐ์šฐ๋ฉด์„œ ๊ทธ๋™์•ˆ ์–ผ๋งˆ๋‚˜ ์œ„ํ—˜์ฒœ๋งŒํ•˜๊ฒŒ ์ฝ”๋”ฉํ–ˆ๋Š”์ง€ ๊นจ๋‹ซ๊ณ  ๋“ฑ์— ์‹์€๋•€์ด ๋‚ฌ๋‹ค. "๊ธฐ๋Šฅ๋งŒ ์ž˜ ๋Œ๋ฉด ๋˜์ง€"๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ localStorage์— ๋‹ค ๋•Œ๋ ค ๋ฐ•์•˜๋˜ ๊ฑด ์ •๋ง ํ•ด์ปค์—๊ฒŒ ์ง‘ ์—ด์‡ ๋ฅผ ๋˜์ ธ์ค€ ๊ผด์ด์—ˆ๋‹ค. ๋ณด์•ˆ์€ 100๋ฒˆ ์ž˜ํ•ด๋„ 1๋ฒˆ ๋šซ๋ฆฌ๋ฉด ๋์ด๋ผ๋Š” ์˜ํ˜ธ ๋‹˜์˜ ๋ง์”€์„ ํ‰์ƒ ๋ช…์‹ฌํ•ด์•ผ๊ฒ ๋‹ค.

๐Ÿ’ก "๊ฐœ๋ฐœ์ž์˜ ํŽธ์˜๋Š” ๊ณง ํ•ด์ปค์˜ ๊ธฐํšŒ๋‹ค. ๋ถˆํŽธํ•จ์„ ์„ ํƒํ•  ๋•Œ ์‚ฌ์šฉ์ž๋Š” ์•ˆ์ „ํ•ด์ง„๋‹ค."

๋‚ด์ผ์€ ๋“œ๋””์–ด ๋Œ€๋ฏธ๋ฅผ ์žฅ์‹ํ•˜๋Š” ๋งˆ์ง€๋ง‰ ์ฑ•ํ„ฐ, '์—”์ง€๋‹ˆ์–ด๋ง ๋ฆฌ๋”์‹ญ & ์ฝ”๋“œ ํ’ˆ์งˆ'์„ ๋ฐฐ์šด๋‹ค. ๋‹จ์ˆœํžˆ ์ฝ”๋”ฉํ•˜๋Š” ๊ธฐ๊ณ„๋ฅผ ๋„˜์–ด, ํ•จ๊ป˜ ์ผํ•˜๊ณ  ์‹ถ์€ ๋™๋ฃŒ๋กœ ๋‚จ๋Š” ๋ฒ•์„ ๊ณ ๋ฏผํ•ด ๋ณด์ž! ๐Ÿค๐Ÿ