STUDY - Network

์ˆ˜ํ˜„ยท2023๋…„ 7์›” 31์ผ
0

IT (CS)

๋ชฉ๋ก ๋ณด๊ธฐ
7/12
post-thumbnail

๐Ÿ“’ ๋„คํŠธ์›Œํฌ

๐Ÿ“• ๋„คํŠธ์›Œํฌ์˜ ๊ธฐ์ดˆ

1. ๋„คํŠธ์›Œํฌ ๊ฐœ๋…

  • ๋…ธ๋“œ(node)์™€ ๋งํฌ(link)๊ฐ€ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ , ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ง‘ํ•ฉ
    • ๋…ธ๋“œ : ์„œ๋ฒ„, ๋ผ์šฐํ„ฐ, ์Šค์œ„์น˜ ๋“ฑ ๋„คํŠธ์›Œํฌ ์žฅ์น˜
    • ๋งํฌ(edge) : ์œ ์„ /๋ฌด์„ ๊ณผ ๊ฐ™์€ ์—ฐ๊ฒฐ๋งค์ฒด (ex. ์™€์ดํŒŒ์ด, LAN)

2. ํŠธ๋ž˜ํ”ฝ (traffic)

  • ํŠน์ • ์‹œ์ ์— ๋งํฌ ๋‚ด์— ํ๋ฅด๋Š” ๋ฐ์ดํ„ฐ ์–‘
  • ๋‹จ์œ„ : bps(bits per second)
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์„œ๋ฒ„์— ์ €์žฅ๋œ ํŒŒ์ผ(๋ฌธ์„œ, ์ด๋ฏธ์ง€)์„ ํด๋ผ์ด์–ธํŠธ(์‚ฌ์šฉ์ž)๊ฐ€ ๋‹ค์šด๋กœ๋“œ ์‹œ ๋ฐœ์ƒ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ˆ„์ ๋Ÿ‰(ํŠธ๋ž˜ํ”ฝ ๋ฐœ์ƒ)
    • Q : 100KB ์ด๋ฏธ์ง€๋ฅผ 1,000๋ช…์ด ๋‹ค์šด๋กœ๋“œ ์‹œ ๋ˆ„์  ํŠธ๋ž˜ํ”ฝ์€?
      • A : 100KB X 1,000 = 100,000KB(100MB)
    • Q : 10MB ๋™์˜์ƒ์„ 10๋ช…์ด ๋‹ค์šด๋กœ๋“œ ์‹œ ๋ˆ„์  ํŠธ๋ž˜ํ”ฝ์€?
      - A : 10MB X 10 = 100MB

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ํŠธ๋ž˜ํ”ฝ vs ์ฒ˜๋ฆฌ๋Ÿ‰

  • โœ๏ธ ํŠธ๋ž˜ํ”ฝ : ํ๋ฅด๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘
  • โœ๏ธ ์ฒ˜๋ฆฌ๋Ÿ‰ : ์ฒ˜๋ฆฌ๋˜๋Š” ํŠธ๋ž˜ํ”ฝ์˜ ์–‘

3. ์ฒ˜๋ฆฌ๋Ÿ‰ (throughput)

  • ๋งํฌ ๋‚ด์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ์˜ ์–‘ (ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌํ•œ ์ •๋„)
  • ๋‹จ์œ„ : bps ์ดˆ๋‹น ์ „์†ก ๋˜๋Š” ์ˆ˜์‹ ๋˜๋Š” ๋น„ํŠธ ์ˆ˜
  • ์ฒ˜๋ฆฌ๋Ÿ‰์— ์˜ํ–ฅ ์กฐ๊ฑด
    • ์‚ฌ์šฉ์ž๋“ค์ด ์ ‘์†ํ•  ๋•Œ๋งˆ๋‹ค ์ปค์ง€๋Š” ํŠธ๋ž˜ํ”ฝ
    • ๋„คํŠธ์›Œํฌ ์žฅ์น˜ ๊ฐ„์˜ ๋Œ€์—ญํญ
    • ๋„คํŠธ์›Œํฌ ์ฆ๊ฐ„์— ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ
    • ์žฅ์น˜์˜ ํ•˜๋“œ์›จ์–ด ์ŠคํŽ™

4. ๋Œ€์—ญํญ (bandwidth)

  • ์ฃผ์–ด์ง„ ์‹œ๊ฐ„ ๋™์•ˆ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ํ๋ฅผ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋น„ํŠธ ์ˆ˜ (์ตœ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํŠธ๋ž˜ํ”ฝ)
  • ๋‹จ์œ„ : bps ์ดˆ๋‹น ์ „์†ก ๋˜๋Š” ์ˆ˜์‹ ๋˜๋Š” ๋น„ํŠธ ์ˆ˜
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ๊ณ ์†๋„๋กœ ์ฐจ์„ ์ด 2์ฐจ์„ ๋ณด๋‹ค 8์ฐจ์„ ์ผ ๊ฒฝ์šฐ
    • ๋Œ€์—ญํญ์ด ๋†’์„์ˆ˜๋ก ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น ๋ฅธ ์„œ๋น„์Šค ์ œ๊ณต ๊ฐ€๋Šฅ
    • Q : 100Mbps๋ผ๋Š” ๋Œ€์—ญํญ์„ ๊ฐ€์ง„ ์„œ๋ฒ„๊ฐ€ ์žˆ๊ณ  ํ•œ ์‚ฌ์šฉ์ž๋‹น 100kbps๋กœ ๋™์˜์ƒ ํŒŒ์ผ์„ ์š”์ฒญํ•˜๋ฉด, ์ตœ๋Œ€ ๋™์‹œ์ ‘์†์ž์ˆ˜๋Š”?
      • A : 100Mbps / 100kbps = ์•ฝ 1000๋ช…

5. RTT (์™•๋ณต ์ง€์—ฐ์‹œ๊ฐ„, Round Trip Time)

  • ์‹ ํ˜ธ๋ฅผ ์ „์†กํ•˜๊ณ  ํ•ด๋‹น ์‹ ํ˜ธ์˜ ์ˆ˜์‹ ํ™•์ธ์— ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ๋”ํ•œ ๊ฐ’

  • ์–ด๋–ค ๋ฉ”์‹œ์ง€๊ฐ€ ๋‘ ์žฅ์น˜ ์‚ฌ์ด๋ฅผ ์™•๋ณตํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„

  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : google์— ping ๋ณด๋‚ด๊ธฐ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ping (Packet InterNet Groper)

  • ์ปดํ“จํ„ฐ์˜ ๋„คํŠธ์›Œํฌ ์ƒํƒœ๋ฅผ ์ ๊ฒ€, ์ง„๋‹จํ•˜๋Š” ๋ช…๋ น
  • ๋Œ€์ƒ ์ปดํ“จํ„ฐ๋ฅผ ํ–ฅํ•ด ์ผ์ • ํฌ๊ธฐ์˜ packet ๋ณด๋‚ด๊ณ (ICMP echo request), ๋Œ€์ƒ ์ปดํ“จํ„ฐ๊ฐ€ ์‘๋‹ต ๋ฉ”์‹œ์ง€(ICMP echo reply) ๋ณด๋‚ด๋ฉด ๋ถ„์„ํ•˜์—ฌ ์žฅ๋™ ์—ฌ๋ถ€ ๋ฐ ๋„คํŠธ์›Œํฌ ์ƒํƒœ ํŒŒ์•…
  • TCP/IP ํ”„๋กœํ† ์ฝœ ์ค‘ ICMP ํ†ตํ•ด ๋™์ž‘ํ•˜๋ฏ€๋กœ, ํ•ด๋‹น ํ”„๋กœํ† ์ฝœ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๊ธฐ๋Š” ping ์ˆ˜ํ–‰ ๋ถˆ๊ฐ€

6. ๋„คํŠธ์›Œํฌ ํ† ํด๋กœ์ง€

  • ๊ฐœ๋… : ๋…ธ๋“œ์™€ ๋งํฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€
  • ์ข…๋ฅ˜
    • (1) ๋ฒ„์Šค ํ† ํด๋กœ์ง€

    • ํŠน์ง•

      • ํ•˜๋‚˜์˜ ํšŒ์„ ์— ์—ฌ๋Ÿฌ๊ฐœ ๋…ธ๋“œ
      • ๋…ธ๋“œ ์ถ”๊ฐ€ ์‚ญ์ œ ์‰ฌ์›€
      • ์„ค์น˜๋น„์šฉโฌ‡๏ธ
    • ์žฅ์ 

      • ์†Œ๊ทœ๋ชจ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์‰ฌ์›€
      • ํ•œ ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์˜ํ–ฅX (์ค‘์•™๋…ธ๋“œ ๋ฐฉํ™”๋ฒฝโฌ†๏ธ)
    • ๋‹จ์ 

      • ๋ฉ”์ธ ๋งํฌ์— ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์ด ์ƒ๊ธธ ๊ฒฝ์šฐ ์ •์ฒดํ˜„์ƒ ๋ฐœ์ƒ (ํŒจํ‚ท ์†์‹ค์œจโฌ†๏ธ)
      • ๋ฉ”์ธ ๋งํฌ ๋ง๊ฐ€์ง€๋ฉด ๋ฌธ์ œ
    • (2) ์Šคํƒ€ ํ† ํด๋กœ์ง€

    • ํŠน์ง•

      • ์ค‘์•™์— ์žˆ๋Š” ๋…ธ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฐ๊ฒฐ๋œ ํ˜•ํƒœ
      • ๋…ธ๋“œ ์ถ”๊ฐ€, ์‚ญ์ œ ์‰ฌ์›€
    • ์žฅ์ 

      • ์ค‘์•™๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ํ•œ ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์˜ํ–ฅX
      • ์•ˆ์ •์„ฑ ๋†’์Œ (์ค‘์•™๋…ธ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด ํ•œ ๋…ธ๋“œ์— ์นจํ•ด ๋ฐœ์ƒ์‹œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ํ™•์žฅX)
    • ๋‹จ์ 

      • ์ค‘์•™๋…ธ๋“œ ์—๋Ÿฌ์‹œ ๋ฌธ์ œ
    • (3) ํŠธ๋ฆฌ ํ† ํด๋กœ์ง€

    • ํŠน์ง•

      • ๊ณ„์ธต์  ํ† ํด๋กœ์ง€
      • ๋ฆฌํ”„๋…ธ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™•์žฅ ์‰ฝ์ง€๋งŒ, ๋‹ค๋ฅธ ๋…ธ๋“œ๋Š” ์–ด๋ ค์›€
      • ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํ˜•ํƒœ (๋ฒ„์Šค + ์Šคํƒ€)
    • ์žฅ์ 

      • ๋…ธ๋“œ ํ™•์žฅ์ด ์‰ฌ์›€ (๋ฆฌํ”„๋…ธ๋“œ๋กœ ํ™•์žฅ)
      • ๋ฆฌํ”„๋…ธ๋“œ ์—๋Ÿฌ๋Š” ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์— ์˜ํ–ฅ ๋ฏธ์น˜์ง€X
    • ๋‹จ์ 

      • ํŠน์ • ๋…ธ๋“œ ํŠธ๋ž˜ํ”ฝ ์ง‘์ค‘์‹œ ํ•˜์œ„๋…ธ๋“œ์— ์˜ํ–ฅ
      • ๋ฃจํŠธ๋…ธ๋“œ์— ๋ฌธ์ œ ๋ฐœ์ƒ์‹œ ์ „์ฒด ๋„คํŠธ์›Œํฌ์— ๋ฌธ์ œ

      ๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ๋ฐฑ๋ณธ์ผ€์ด๋ธ”

      • ์—ฌ๋Ÿฌ ์†Œํ˜• ๋„คํŠธ์›Œํฌ๋ฅผ ๋ฌถ์–ด ๋Œ€๊ทœ๋ชจ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ๋†’์€ ๋Œ€์—ญํญ์œผ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ๋“ค์˜ ์ง‘ํ•ฉ๊ณผ ์—ฐ๊ฒฐ๋˜๋Š” ๋„คํŠธ์›Œํฌ (๋Œ€๊ทœ๋ชจ ํŒจํ‚ท ํ†ต์‹ ๋ง)
    • (4) ๋งํ˜• ํ† ํด๋กœ์ง€

    • ํŠน์ง•

      • ๊ณ ๋ฆฌ ํ˜•ํƒœ
      • ๋…ธ๋“œ ์ถ”๊ฐ€, ์‚ญ์ œ ์‰ฌ์›€
    • ์žฅ์ 

      • ๋…ธ๋“œ ์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ๋„ ๋ฐ์ดํ„ฐ ์†์‹ค ์—†์Œ
      • ํ† ํฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฐ์†์ ์œผ๋กœ ๋…ธ๋“œ ๊ฑฐ์นจ
      • ํ† ํฐ์„ ํ†ตํ•ด ํ†ต์‹ ๊ถŒํ•œ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜์—ฌ ํ•ด๋‹น ๊ถŒํ•œ์ด ์—†๋Š” ๋…ธ๋“œ๋Š” ๋ฐ์ดํ„ฐ ์ „๋‹ฌ๋ฐ›์ง€X
    • ๋‹จ์ 

      • ๋งํฌ/๋…ธ๋“œ ์—๋Ÿฌ ๋ฐœ์ƒ์‹œ ์ „์ฒด ๋„คํŠธ์›Œํฌ์— ์˜ํ–ฅ
      • ํ† ํฐ์ด ์—†๋Š” ๋…ธ๋“œ๋Š” ํ†ต์‹ ์— ์ฐธ์—ฌ๋ฅผ ๋ชปํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๊ณต์œ  ๋ถˆ๊ฐ€
    • (5) ๋ฉ”์‹œ ํ† ํด๋กœ์ง€

    • ์ข…๋ฅ˜

      • full mesh
      • partionalliy mesh
    • ํŠน์ง•

      • ๊ทธ๋ฌผ๋ง ํ˜•ํƒœ
      • ๋…ธ๋“œ ์ถ”๊ฐ€, ์‚ญ์ œ ์–ด๋ ค์›€
      • full mesh ํ† ํด๋กœ์ง€์˜ ๊ฒฝ์šฐ : n * (n - 1) / 2 ํšŒ์„  ํ•„์š”
    • ์žฅ์ 

      • ์•ˆ์ •์„ฑโฌ†๏ธ
      • ํ•œ ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์˜ํ–ฅX
      • ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ ๊ฐ€๋Šฅ
    • ๋‹จ์ 

      • ํšŒ์„ ์ด ๋น„ํšจ์œจ์ ์œผ๋กœ ๋งŽ์•„ ๊ตฌ์ถ•๋น„์šฉโฌ†๏ธ

7. ๋„คํŠธ์›Œํฌ ๋ณ‘๋ชฉํ˜„์ƒ (bottleneck)

  • ๊ฐœ๋… : ํŠธ๋ž˜ํ”ฝ์— ์˜ํ•ด ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ์ œํ•œ๋˜๋Š” ์ƒํ™ฉ (ํ•ซ์ŠคํŒŸ)
  • ํ•ด๊ฒฐ : ๊ตฌ์ถ•๋œ ์‹œ์Šคํ…œ์˜ ํ† ํด๋กœ์ง€๋ฅผ ํŒŒ์•…ํ•˜๊ณ , ์–ด๋–ค ํšŒ์„ /์„œ๋ฒ„์˜ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ํ•˜๋Š”์ง€ ํ™•์ธ

8. ๋„คํŠธ์›Œํฌ ํ†ต์‹ 

  • (1) ์œ ๋‹ˆ์บ์ŠคํŠธ (1:1 ํ†ต์‹ )

    • HTTP ํ†ต์‹ 
    • ์ผ๋ฐ˜์ ์ธ ๋„คํŠธ์›Œํฌ ์ „์†ก ํ˜•ํƒœ
  • (2) ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ (1:N ํ†ต์‹ )

    • ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์—๊ฒŒ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ , ํŠน์ • ๊ทธ๋ฃน์—๊ฒŒ๋งŒ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
  • (3) ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ (1:N ํ†ต์‹ )

    • ๊ทธ๋ฃน์ด ์•„๋‹Œ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๋…ธ๋“œ์—๊ฒŒ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ
      - ๋…ธ๋“œ ์„ค์น˜
    • server.js
      const app = require('express')(); // express ๊ธฐ๋ฐ˜ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™์‹œํ‚ค๋Š”๋ฐ ํ•„์š”ํ•œ ๋…ธ๋“œ ๊ตฌ์„ฑ
      const http = require('http').Server(app); const io = require('socket.io')(http); // web socket ๊ธฐ๋ฐ˜์œผ๋กœ broadcast ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“ˆ
      const port = process.env.PORT || 3000;
      app.get('/', (req, res) => {
      res.sendFile(__dirname + '/index.html'); // index.html ์ „๋‹ฌ
      });
      io.on('connection', (socket) => { // ์—ฐ๊ฒฐ๋œ user ๋“ค์—๊ฒŒ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ
      socket.on('chat message', msg => {
        io.emit('chat message', msg);
      });
      });
      http.listen(port, () => {
      console.log(`Socket.IO server running at
      http://localhost:${port}/`);
      });
    • node a.js ๋ช…๋ น์–ด ์‹คํ–‰
    • 127.0.0.01:3000 ์ ‘์†
    • index.html
      <!DOCTYPE html>
      <html>
      <head>
        <title>Socket.IO chat</title>
        <style>
      body { margin: 0; padding-bottom: 3rem; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; }
      #form { background: rgba(0, 0, 0, 0.15); padding: 0.25rem; position: fixed; bottom: 0; left: 0; right: 0; display: flex; height: 3rem; box-sizing: border-box; backdrop-filter: blur(10px); }
      #input { border: none; padding: 0 1rem; flex-grow: 1; border-radius: 2rem; margin: 0.25rem; }
      #input:focus { outline: none; }
      #form > button { background: #333; border: none; padding: 0 1rem; margin: 0.25rem; border-radius: 3px; outline: none; color: #fff; }
      #messages { list-style-type: none; margin: 0; padding: 0; } #messages > li { padding: 0.5rem 1rem; }
      #messages > li:nth-child(odd) { background: #efefef; }
        </style>
      </head>
      <body>
        <ul id="messages"></ul>
        <form id="form" action="">
          <input id="input" autocomplete="off" /><button>Send</button>
        </form>
        <script src="/socket.io/socket.io.js"></script>
        <script>
      var socket = io();
      var messages = document.getElementById('messages'); var form = document.getElementById('form');
      var input = document.getElementById('input');
          form.addEventListener('submit', function(e) { e.preventDefault();
      if (input.value) {
              socket.emit('chat message', input.value);
              input.value = '';
            }
      });
      socket.on('chat message', function(msg) {
      var item = document.createElement('li'); item.textContent = msg; messages.appendChild(item);
      window.scrollTo(0, document.body.scrollHeight);
      });
        </script>
      </body>
      </html>

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– socket

  • ๋‘ ํ˜ธ์ŠคํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ตฌ์กฐ์ฒด
  • ๊ตฌ์„ฑ : ํ”„๋กœํ† ์ฝœ, IP ์ฃผ์†Œ, ํฌํŠธ ๋„˜๋ฒ„

9. ๋„คํŠธ์›Œํฌ ๋ถ„๋ฅ˜

  • (1) LAN (๊ทผ๊ฑฐ๋ฆฌ ํ†ต์‹ ๋ง, local area network)

    • ์•ˆ์ •์„ฑโฌ†๏ธ, ์†๋„โฌ†๏ธ
    • ๋ณดํ†ต ํ—ˆ๋ธŒ, ์Šค์œ„์น˜๋กœ ์—ฐ๊ฒฐ๋œ ๋„คํŠธ์›Œํฌ (์†Œ๊ทœ๋ชจ ๋„คํŠธ์›Œํฌ)
    • 1๊ฐœ์˜ ๋…ผ๋ฆฌ์ ์ธ ์ฃผ์†Œ(IP) ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฌผ๋ฆฌ์  ์ฃผ์†Œ(MAC)์„ ๊ตฌ๋ณ„ํ•˜๋Š” ๋„คํŠธ์›Œํฌ
  • (2) MAN (๋Œ€๋„์‹œ ํ†ต์‹ ๋ง, metropolitan area network)

    • ๋„์‹œ-๋„์‹œ์˜ ํ†ต์‹ ๋ง
    • 2๊ฐœ ์ด์ƒ์˜ LAN์ด ์—ฐ๊ฒฐ๋˜์–ด ๊ตฌ์„ฑ
    • ๋ผ์šฐํ„ฐ, ๋ธŒ๋ฆฌ์ง€ ๋“ฑ์œผ๋กœ ์—ฐ๊ฒฐ
  • (3) WAN (๊ด‘์—ญ ํ†ต์‹ ๋ง, wide area network)

    • ๊ตญ๊ฐ€-๊ตญ๊ฐ€ ํ†ต์‹ ๋ง
    • ์ˆ˜๋งŽ์€ ๋ผ์šฐํ„ฐ๋ฅผ ๊ฑฐ์ณ ๋””๋ฅธ ๊ตญ๊ฐ€์™€ ์—ฐ๊ฒฐ๋˜๋Š” ๋ฒ”์œ„ (์ธํ„ฐ๋„ท)

๐Ÿ“• TCP/IP 4๊ณ„์ธต

1. TCP(Transmission Control Protocol) / IP (Internet Protocol)

  • 1) TCP/IP 4๊ณ„์ธต ๊ฐœ๋…
    • ์žฅ์น˜๊ฐ„ ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ ์— ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํ† ์ฝœ
    • IP๋กœ ํŒจํ‚ท ์ „์†ก์‹œ TCP๋ฅผ ํ™œ์šฉํ•ด ํŒจํ‚ท์„ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜์‹  ๋ฐ›์Œ
    • ๊ณ„์ธต๋ณ„ ์ฒ˜๋ฆฌ ์—ญํ• ์ด ๋‹ฌ๋ผ์„œ ๊ณ„์ธต๋ณ„ ๊ฐ„์„ญโฌ‡๏ธ, ์œ ์ง€๋ณด์ˆ˜โฌ†๏ธ
    • ๋‹ค๋ฅธ ๊ณ„์ธต๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ณผ์ •์„ ์•Œ ํ•„์š”๊ฐ€ ์—†์–ด ๋ฐ์ดํ„ฐ ์บก์Šํ™” ๊ฐ€๋Šฅ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– TCP / IP ๊ณผ์ •

  • 1) ์›น ๋ธŒ๋ผ์šฐ์ €์— www.google.com ์ž…๋ ฅ
    • ๊ตฌ๊ธ€ ์›น ์„œ๋ฒ„์— 80๋ฒˆ ํฌํŠธ๋กœ HTTP Request ๋ณด๋‚ด๋Š” ๊ฒƒ๊ณผ ๋™์ผ
  • 2) HTTP Request ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ๊ฐ ๊ณ„์ธต์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ํŒจํ‚ท์— ๋‹ด์•„ ์ „์†ก

  • 3) Application ๊ณ„์ธต : HTTP Request ํ—ค๋” ์ถ”๊ฐ€
  • 4) TCP ๊ณ„์ธต : TCP ํ—ค๋”
    • SP (์ถœ๋ฐœ์ง€ ํฌํŠธ ๋ฒˆํ˜ธ) : ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ๋งŒ๋“  ์†Œ์ผ“์˜ ํฌํŠธ ๋ฒˆํ˜ธ
    • DP (๋ชฉ์ ์ง€ ํฌํŠธ ๋ฒˆํ˜ธ) : 80ํฌํŠธ๋กœ ์š”์ฒญ
  • 5) Internet ๊ณ„์ธต : IP ํ—ค๋”
    • SA (์ถœ๋ฐœ์ง€ IP ์ฃผ์†Œ) : ๋‚ด IP ์ฃผ์†Œ
    • DA (๋ชฉ์ ์ง€ IP ์ฃผ์†Œ) : ๋„๋ฉ”์ธ ์ •๋ณด๋กœ IP์ฃผ์†Œ ์•Œ๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ ์„œ๋ฒ„์— DNS ์ฟผ๋ฆฌ ๋ณด๋‚ด๊ณ , IP ์ฃผ์†Œ ์‘๋‹ต ๋ฐ›์Œ
  • 6) Network Access ๊ณ„์ธต : Ethernet ํ—ค๋”
    • SA (์ถœ๋ฐœ์ง€ MAC ์ฃผ์†Œ) : ๋‚ด MAC ์ฃผ์†Œ
    • DA (๋ชฉ์ ์ง€ MAC ์ฃผ์†Œ) : ๊ตฌ๊ธ€ MAC ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ, ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ํŒจํ‚ท ์ „๋‹ฌ๋œ ๋ผ์šฐํ„ฐ/๊ฒŒ์ดํŠธ์›จ์ด์˜ MAC ์ฃผ์†Œ (ARP ํ”„๋กœํ† ์ฝœ ์‚ฌ์šฉ)
  • 7) ํŒจํ‚ท ์ „์†ก ์ „, 3-way handshaking์œผ๋กœ ์—ฐ๊ฒฐ ์„ค์ •
    • ์ปจํŠธ๋กค ๋น„ํŠธ(ACK, SYN ํ”Œ๋ž˜๊ทธ) ์‚ฌ์šฉ
  • 8) ๋ผ์šฐํŒ… ํ†ตํ•ด ์™„์„ฑ๋œ ํŒจํ‚ท์„ ๋ชฉ์ ์ง€ ์„œ๋ฒ„์— ์ „์†ก
    • www.google.com์— ํŒจํ‚ท ์ „์†ก ํ›„ HTML ์‘๋‹ต ๋ฐ›์Œ
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์‘๋‹ต ๋ฐ›์€ HTML์„ ๋ธŒ๋ผ์šฐ์ €์— ๋„์›€
  • 9) HTTP ์‘๋‹ต ๋๋‚˜๋ฉด, 4-way handshaking์œผ๋กœ ์—ฐ๊ฒฐ ์ข…๋ฃŒ
    • ์ปจํŠธ๋กค ๋น„ํŠธ (ACK, FIN ํ”Œ๋ž˜๊ทธ) ์‚ฌ์šฉ
  • 2) ์บก์Šํ™”/๋น„์บก์Šํ™”
    • ์บก์Šํ™” : ์†ก์‹ ์ž๊ฐ€ ์ˆ˜์‹ ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ ๋ณด๋‚ผ ๋•Œ ๊ณ„์ธต์„ ์ง€๋‚˜๋ฉด์„œ ํ—ค๋” ์ถ”๊ฐ€๋˜๋Š” ๊ณผ์ •
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์ „์†ก๊ณ„์ธต โžก๏ธ TCP ํ—ค๋” ์ถ”๊ฐ€, ๋„คํŠธ์›Œํฌ ๊ณ„์ธต โžก๏ธ IP ์ฃผ์†Œ ํ—ค๋” ์ถ”๊ฐ€
    • ๋น„์บก์Šํ™” : ์ˆ˜์‹ ์ž์ธก์—์„œ ์บก์Šํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ญ์ˆœ์œผ๋กœ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– PDU (Protocol Data Unit)

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต : ๋ฉ”์‹œ์ง€
  • ์ „์†ก ๊ณ„์ธต : ์„ธ๊ทธ๋จผํŠธ(TCP), ๋ฐ์ดํ„ฐ๊ทธ๋žจ(UDP)
    • ์„ธ๊ทธ๋จผํŠธ : ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ์ชผ๊ฐ  ์กฐ๊ฐ (์„ธ๊ทธ๋จผํŠธ = ๋ฐ์ดํ„ฐ๊ทธ๋žจ)
  • ์ธํ„ฐ๋„ท ๊ณ„์ธต : ํŒจํ‚ท
    • ํŒจํ‚ท : ์„ธ๊ทธ๋จผํŠธ SP์™€ DP๊ฐ€ ํฌํ•จ๋œ IP ํ—ค๋”๊ฐ€ ๋ถ™์€ ํ˜•ํƒœ์˜ ์กฐ๊ฐ
  • ๋งํฌ ๊ณ„์ธต : ํ”„๋ ˆ์ž„(๋ฐ์ดํ„ฐ ๋งํฌ ๊ณ„์ธต), ๋น„ํŠธ(๋ฌผ๋ฆฌ ๊ณ„์ธต)
    • ํ”„๋ ˆ์ž„ : MAC ์ฃผ์†Œ ํ—ค๋”์™€ CRC/์ฒดํฌ์„ฌ ํŠธ๋ ˆ์ผ๋Ÿฌ๊ฐ€ ๋ถ™์€ ์กฐ๊ฐ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– CRC/์ฒดํฌ์„ฌ ํŠธ๋ ˆ์ผ๋Ÿฌ

  • ๋ฐ์ดํ„ฐ ์˜ค๋ฅ˜ ๊ฐ์ง€๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜๊ฐ€ ์ ์šฉ๋œ ๊ฐ’
  • ๋งํฌ์˜ ์˜ค๋ฅ˜(๊ณผ๋„ํ•œ ํŠธ๋ž˜ํ”ฝ)๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ ์†์ƒ์„ ๊ฐ์ง€ํ•˜๋Š” ์—ญํ• 

2. MTU, MSS, PMTUD

  • MTU (Maximum Transmission Unit)

    • ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ํฐ PDU์˜ ํฌ๊ธฐ
    • IP ํ—ค๋”์™€ TCP ํ—ค๋” ํฌ๊ธฐ ํฌํ•จ
    • MTU ํ™•์ธ : ping www.google.com -f -l 1500
      • 1500๋ฐ”์ดํŠธ๋ฅผ ๋ณด๋ƒ„
      • DF, ํŒจํ‚ท๋ถ„ํ• ์ด ์•ˆ๋˜์„œ ์†์‹ค๋ฅ  100%
      • ping์˜ ๊ฒฝ์šฐ IP ํ—ค๋”(20๋ฐ”์ดํŠธ) + ICMP ํ—ค๋”(8๋ฐ”์ดํŠธ)๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ (MSS = 1472(1500 - 28)๊นŒ์ง€ ๊ฐ€๋Šฅ)
    • ๋‚ด ์žฅ์น˜ MTU ํ™•์ธ : (mac) ifconfig en0 (windows)netsh interface ipv4 show interfaces

  • MSS (Maximum Segment Size)

    • TCP์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ
    • IP ํ—ค๋”์™€ TCP ํ—ค๋” ํฌ๊ธฐ ํฌํ•จX
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : MTU 1500๋ฐ”์ดํŠธ์—ฌ๋„ ๋ฐ์ดํ„ฐ๋Š” 1460๋ฐ”์ดํŠธ ์ดํ•˜ ํฌ๊ธฐ ๋ณด๋‚ด์•ผ ์ „๋‹ฌ ๊ฐ€๋Šฅ
    • ์ด๋”๋„ท ํ”„๋ ˆ์ž„ : ์ด๋”๋„ท ํ—ค๋” 14๋ฐ”์ดํŠธ + FCS 4๋ฐ”์ดํŠธ๊ฐ€ ํฌํ•จํ•œ ๊ฒƒ
    • FCS (Frame Check Sequence) : ๋ฐ์ดํ„ฐ ์—๋Ÿฌ๊ฒ€์ถœ์„ ์œ„ํ•ด ์‚ฝ์ž…๋˜๋Š” ํ•„๋“œ (CRC์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฒƒ ํฌํ•จ)
    • ์ด ์ด๋”๋„ท ํ”„๋ ˆ์ž„ ํฌ๊ธฐ = 1518 ๋ฐ”์ดํŠธ
  • PMTUD (Path MTU Discovery)

    • ์ˆ˜์‹ ์ž์™€ ์†ก์‹ ์ž์˜ ๊ฒฝ๋กœ ์ƒ์—์„œ ์žฅ์น˜๊ฐ€ ํŒจํ‚ท์„ ๋ˆ„๋ฝํ•œ ๊ฒฝ์šฐ ํŒจํ‚ท์˜ ํฌ๊ธฐ๋ฅผ ๋‚ฎ์ถ”๋ฉด์„œ MTU์— ๋งž๊ฒŒ๋” ๋ฐ˜๋ณตํ•ด์„œ ๋ณด๋‚ด๋Š” ๊ณผ์ •
  • ํŒจํ‚ท์ด ๋ถ„ํ• ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

    • ํŒจํ‚ท์„ ๋ถ„ํ• ํ•  ์ˆ˜ ์—†์–ด ๋„คํŠธ์›Œํฌ ๊ฒฝ๋กœ ์ƒ์— ์žˆ๋Š” ์–ด๋–ค ๋ผ์šฐํ„ฐ๋‚˜ ์žฅ์น˜์˜ MTU ์ดˆ๊ณผํ•˜๋ฉด, ์•„์˜ˆ ์ „๋‹ฌํ•˜์ง€ ์•Š์Œ
    • IPv6 : ๋ถ„ํ• X
    • IPv4 : flags ํ•„๋“œ์—์„œ bit=1์ด๋ฉด, "Don't Fragment(ํ”Œ๋ž˜๊ทธ ํ™œ์„ฑํ™”ํ•จ)" ๋ถ„ํ•  ๋ถˆ๊ฐ€๋Šฅ

3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต

  • 1) application layer ๊ฐœ๋…

    • ์›น ์„œ๋น„์Šค, ์ด๋ฉ”์ผ ๋“ฑ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์งˆ์ ์œผ๋กœ ์ œ๊ณต
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : HTTP, SMTP, SSH, FTP
  • 2) HTTP (HyperText Transfer Protocol)

    • ์„œ๋ฒ„-๋ธŒ๋ผ์šฐ์ €๊ฐ„ (์„œ๋ฒ„-์„œ๋ฒ„๊ฐ„) ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ
    • ํ—ค๋”๋ฅผ ํ†ตํ•œ ํ™•์žฅ ์‰ฌ์›€ (ํ—ค๋”๊ฐ’์— ํŠน์ •๊ฐ’ ๋„ฃ์–ด HTTP ์š”์ฒญ์‹œ ์‰ฝ๊ฒŒ ๋‹ค๋ฅธ ๊ฐ’ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ)
    • stateless (์—ฐ์†์ ์ธ ์ƒํƒœ๊ฐ’ ์—†์Œ)
  • 3) SSH (Secure SHell)

    • ๋ณด์•ˆ๋˜์ง€ ์•Š๋Š” ๋„คํŠธ์›Œํฌ๊ฐ„ ์„œ๋น„์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์šด์˜ํ•˜๊ธฐ ์œ„ํ•œ ์•”ํ˜ธํ™” ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ
    • ssh <pem> <user>@<serverIP>
    • scp ์ด์šฉํ•ด์„œ SSH๋กœ ํŒŒ์ผ ์ „์†ก ๊ฐ€๋Šฅ
    • scp <source> <destinatino>
  • 4) FTP (File Transfer Protocol)

    • ๋…ธ๋“œ๊ฐ„ ํŒŒ์ผ ์ „์†ก์‹œ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํ† ์ฝœ
    • ํ˜„์žฌ๋Š” ํŒŒ์ผ ์•”ํ˜ธํ™” ์ „์†ก์„ ์œ„ํ•ด FTPS / SFTP ์‚ฌ์šฉ
    • FTP ์†Œํ”„ํŠธ์›จ์–ด : FileZilla
  • 5) SMTP (Simple Mail Transfer Protocol)

    • ์ธํ„ฐ๋„ท์„ ํ†ตํ•œ ๋ฉ”์ผ ์ „์†ก ํ”„๋กœํ† ์ฝœ
    • ์„œ๋น„์Šค ์šด์˜์‹œ node.js๋ฅผ ํ†ตํ•ด ๋ฉ”์ผ ๋ณด๋‚ผ ๊ฒฝ์šฐ ์‚ฌ์šฉ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Nodemailer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด์šฉํ•˜์—ฌ JS ๊ธฐ๋ฐ˜์œผ๋กœ SMTP ํ†ตํ•ด ๋ฉ”์ผ
      // create reusable transporter object using the default SMTP
      transport
      let transporter = nodemailer.createTransport({
      host: "smtp.ethereal.email",
      port: 587,
      secure: false, // true for 465, false for other ports auth: {
      user: testAccount.user, // generated ethereal user
      pass: testAccount.pass, // generated ethereal password },
      });

4. ์ „์†ก ๊ณ„์ธต

  • 1) transport layer ๊ฐœ๋…

    • ๋ฉ”์‹œ์ง€๋ฅผ ์„ธ๊ทธ๋จผํŠธ(TCP)/๋ฐ์ดํ„ฐ๊ทธ๋žจ(UDP)์œผ๋กœ ๋‚˜๋ˆ  ๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ฅ˜ ์—†์ด ์ˆœ์„œ๋Œ€๋กœ ์ „๋‹ฌ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ :TCP, UDP
  • 2) TCP (Transmission Control Protocol)

    • ๊ฐ€์ƒํšŒ์„  ํŒจํ‚ท ๊ตํ™˜ ๋ฐฉ์‹ (์ˆœ์„œ ๋ณด์žฅ)
    • ์ „์ด์ค‘, ์ ๋Œ€์  ๋ฐฉ์‹ (๋ฉ€ํ‹ฐ์บ์ŠคํŒ…X, ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…X)
    • ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ : ์žฌ์ „์†ก, ์ฒดํฌ์„ฌ
    • ํ—ค๋” : 20 ~ 60๋ฐ”์ดํŠธ๋กœ ๊ฐ€๋ณ€์ 
  • 3) UDP (User Datagram Protocol)

    • ๋ฐ์ดํ„ฐ๊ทธ๋žจ ํŒจํ‚ท ๊ตํ™˜ ๋ฐฉ์‹
    • ํ๋ฆ„์ œ์–ดX, ์˜ค๋ฅ˜์ œ์–ดX, ์žฌ์ „์†กX
    • ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ : ์ฒดํฌ์„ฌ๋งŒ ์ง€์›
    • ํ—ค๋” : 8๋ฐ”์ดํŠธ ๊ณ ์ • ๊ธธ์ด
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : DNS

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜

  • โœ๏ธ ์žฌ์ „์†ก
    • ์‹œ๊ฐ„ ์ดˆ๊ณผ ๊ธฐ๊ฐ„ ์ง€๋‚˜๋ฉด ์„œ๋ฒ„๋Š” ์ „๋‹ฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์žฌ์ „์†ก ์‹œ๋„
  • โœ๏ธ ์ฒดํฌ์„ฌ
    • ์†ก์‹ ๋œ ๋ฐ์ดํ„ฐ ์ฒดํฌ์„ฌ๊ณผ ์ˆ˜์‹ ๋œ ์ฒดํฌ์„ฌ ๊ฐ’์„ ๋น„๊ตํ•ด์„œ ๋™์ผํ•œ์ง€ ํ™•์ธ (๋ฌด๊ฒฐ์„ฑ ํ‰๊ฐ€)

5. ์ธํ„ฐ๋„ท ๊ณ„์ธต

  • 1) Internet layer ๊ฐœ๋…
    • ์„ธ๊ทธ๋จผํŠธ/๋ฐ์ดํ„ฐ๊ทธ๋žจ์„ ํŒจํ‚ทํ™”ํ•˜์—ฌ ํ•œ ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ(๋ชฉ์ ์ง€)๋กœ ์ „์†ก
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : IP, ICMP, ARP, RARP
  • 2) ICMP (Internet Control Message Protocol)
    • ๋…ธ๋“œ๊ฐ„ ํ†ต์‹  ํ™•์ธ ํ”„๋กœํ† ์ฝœ
    • ๋ฐ์ดํ„ฐ ๊ตํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉX (ํ…Œ์ŠคํŒ…์— ์‚ฌ์šฉ)
    • ๋…๋ฆฝ์ ์ธ ๋น„์—ฐ๊ฒฐ ํ”„๋กœํ† ์ฝœ
  • 3) ARP
    • IP ์ฃผ์†Œ โžก๏ธ MAC ์ฃผ์†Œ ๋ณ€ํ™˜
    • ํ•ด๋‹น ์ฃผ์†Œ์— ๋งž๋Š” MAC ์ฃผ์†Œ ์ฐพ๊ธฐ ์œ„ํ•ด Brodcasting ํ†ตํ•ด ์—ฐ๊ฒฐ๋œ ๋„คํŠธ์›Œํฌ ์žฅ์น˜์— ๋ฐ์ดํ„ฐ ์ „์†ก
    • ๋งž๋Š” ์žฅ์น˜ ์žˆ์œผ๋ฉด ํ•ด๋‹น ์žฅ์น˜๊ฐ€ Unicast๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•ด์„œ ์ฃผ์†Œ ์ฐพ์Œ
  • 4) RARP
    • MAC ์ฃผ์†Œ โžก๏ธ IP ์ฃผ์†Œ ๋ณ€ํ™˜

6. ๋งํฌ ๊ณ„์ธต (๋„คํŠธ์›Œํฌ ์ ‘์† ๊ณ„์ธต)

  • Link layer ๊ฐœ๋…
    • ๋ฐ์ดํ„ฐ๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ „์†ก
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์ „์„ , ๊ด‘์„ฌ์œ , ๋ฌด์„ 

7. 3-way handshake (์—ฐ๊ฒฐ ์„ฑ๋ฆฝ)

  • (1) SYN ๋‹จ๊ณ„ ๐Ÿคตโ€โ™€๏ธ โžก๏ธ ๐Ÿ–ฅ๏ธ

    • ํด๋ผ์ด์–ธํŠธ๐Ÿคตโ€โ™€๏ธ : ์„œ๋ฒ„์— ํด๋ผ์ด์–ธํŠธ์˜ ISN์„ ๋‹ด์•„ SYN ํŒจํ‚ท ๋ณด๋ƒ„
    • SYN (synchronization) : ์—ฐ๊ฒฐ ์š”์ฒญ ํ”Œ๋ž˜๊ทธ
  • (2) SYN + ACK ๋‹จ๊ณ„ ๐Ÿ–ฅ๏ธ โžก๏ธ ๐Ÿคตโ€โ™€๏ธ

    • ์„œ๋ฒ„๐Ÿ–ฅ๏ธ : ํด๋ผ์ด์–ธํŠธ์˜ SYN ์ˆ˜์‹ ํ•˜๊ณ , ์„œ๋ฒ„์˜ ISN์„ ๋ณด๋‚ด๋ฉฐ ์Šน์ธ๋ฒˆํ˜ธ๋กœ ISN + 1 ๋ณด๋ƒ„
  • (3) ACK ๋‹จ๊ณ„ ๐Ÿคตโ€โ™€๏ธ โžก๏ธ ๐Ÿ–ฅ๏ธ

    • ํด๋ผ์ด์–ธํŠธ๐Ÿคตโ€โ™€๏ธ : ์„œ๋ฒ„์˜ ISN + 1ํ•œ ๊ฐ’์ธ ์Šน์ธ๋ฒˆํ˜ธ๋ฅผ ๋‹ด์•„ ACK๋ฅผ ์„œ๋ฒ„์— ๋ณด๋ƒ„
    • ACK (acknowledgement) : ์‘๋‹ต ํ”Œ๋ž˜๊ทธ
  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์ƒํƒœ

    • ํด๋ผ์ด์–ธํŠธ๐Ÿคตโ€โ™€๏ธ : closed, syn_sent, establised
    • ์„œ๋ฒ„๐Ÿ–ฅ๏ธ : closed, listen, syn_received, established

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– listen

  • ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์—ฐ๋ฝ ๋Œ€๊ธฐ ์ƒํƒœ
  • ํ•ด๋‹น ์ƒํƒœ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ฒ„ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๊ฒฐ์ •
const express = require('express') const app = express()
const port = 3000
app.get('/', (req, res) => {
  res.send('Hello World!')
})
app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ISN

  • TCP ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ํ†ต์‹ ์—์„œ ๊ฐ ์ƒˆ ์—ฐ๊ฒฐ์— ํ• ๋‹น๋œ ๊ณ ์œ ํ•œ 32๋น„ํŠธ ์‹œํ€€์Šค ๋ฒˆํ˜ธ
  • TCP ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์ „์†ก๋˜๋Š” ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์™€ ์ถฉ๋Œ๋˜์ง€ ์•Š๋„๋ก ์‹œํ€€์Šค ๋ฒˆํ˜ธ ํ• ๋‹น
  • wireshark(ํŒจํ‚ท ๋ถ„์„ tool)๋กœ TCP ์—ฐ๊ฒฐ ํ™•์ธ

8. 4-way handshake (์—ฐ๊ฑธ ํ•ด์ œ)

  • (1) FIN ๐Ÿคตโ€โ™€๏ธ โžก๏ธ ๐Ÿ–ฅ๏ธ
    • ํด๋ผ์ด์–ธํŠธ๐Ÿคตโ€โ™€๏ธ : ์„œ๋ฒ„์— FIN ์„ค์ • ์„ธ๊ทธ๋จผํŠธ ์ „์†ก ํ›„ FIN_WAIT_1 ์ƒํƒœ
    • ์„œ๋ฒ„ ์‘๋‹ต ๋Œ€๊ธฐ
  • (2) ACK ๐Ÿ–ฅ๏ธ โžก๏ธ ๐Ÿคตโ€โ™€๏ธ
    • ์„œ๋ฒ„๐Ÿ–ฅ๏ธ : ACK๋ผ๋Š” ์Šน์ธ ์„ธ๊ทธ๋จผํŠธ ์ „์†ก ํ›„ CLOSE_WAIT ์ƒํƒœ
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์„ธ๊ทธ๋จผํŠธ ๋ฐ›์œผ๋ฉด FIN_WAIT_2 ์ƒํƒœ
  • (3) FIN ๐Ÿ–ฅ๏ธ โžก๏ธ ๐Ÿคตโ€โ™€๏ธ
    • ์„œ๋ฒ„๐Ÿ–ฅ๏ธ : LAST_ACK ์ƒํƒœ๊ฐ€ ๋˜๊ณ , ์ผ์ • ์‹œ๊ฐ„ ์ดํ›„ ํด๋ผ์ด์–ธํŠธ์— FIN ์„ธ๊ทธ๋จผํŠธ ์ „์†ก
  • (4) ACK ๐Ÿคตโ€โ™€๏ธ โžก๏ธ ๐Ÿ–ฅ๏ธ
    • ํด๋ผ์ด์–ธํŠธ๐Ÿคตโ€โ™€๏ธ : TIME_WAIT ์ƒํƒœ๊ฐ€ ๋˜๊ณ , ์„œ๋ฒ„๋กœ ACK ์ „์†ก
    • ์„œ๋ฒ„๋Š” ACK ๋ฐ›๊ณ  CLOSED ์ƒํƒœ
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์ผ์ • ์‹œ๊ฐ„(TIME_WAIT ์„ค์ • ์‹œ๊ฐ„) ๋Œ€๊ธฐ ํ›„ ์—ฐ๊ฒฐ ๋‹ซํž˜

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– TIME_WAIT

  • ์ง€์—ฐ ํŒจํ‚ท ๋“ฑ ๋ฐœ์ƒ์‹œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ‚ท ๋Œ€๊ธฐ ์‹œ๊ฐ„
    • (FIN ํ”Œ๋ž˜๊ทธ๊ฐ€ ACK ๋ณด๋‹ค ๋จผ์ € ๋„์ฐฉํ•œ ๊ฒฝ์šฐ)์•„์ง ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์ง€ ๋ชปํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒƒ์„ ๋Œ€๋น„ํ•ด ํŒจํ‚ท ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ณผ์ •
    • 2 * MSL ๋™์•ˆ ๋Œ€๊ธฐ
    • MSL (Maximum Segment Lifetime) : ์ตœ๋Œ€ ํŒจํ‚ท ์ˆ˜๋ช… (๋ณดํ†ต 2๋ถ„)
  • ์—ฐ๊ฒฐ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‹ซํžŒ ์ƒํƒœ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์กด์žฌ
    • CLOSED๊ฐ€ ์•ˆ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ๋ฐœ์ƒํ•˜์—ฌ, ์ผ์ • ์‹œ๊ฐ„๋งŒ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ์„ค์ •
    • CentOS/Ubuntu : 60์ดˆ, Window :4๋ถ„
    • Ubuntu ์„ค์ • ํŒŒ์ผ
  include/net/tcp.h
#define TCP_TIMEWAIT_LEN (60*HZ) //TIME-WAIT

๐Ÿ“• ๋ผ์šฐํŒ…

1. router / routing

  • 1) router ๊ฐœ๋…
    • ๋„คํŠธ์›Œํฌ ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ์žฅ์น˜
    • ๋ฐ์ดํ„ฐ(ํŒจํ‚ท)๋ฅผ ๋ชฉ์ ์ง€๋กœ ๋ณด๋‚ผ ๋•Œ ์ตœ์ ์˜ ๊ฒฝ๋กœ ๊ฒฐ์ •ํ•˜๊ณ , ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ์ผ(๋ผ์šฐํŒ…) ์ˆ˜ํ–‰
    • ๋ผ์šฐํ„ฐ๋Š” ๋ผ์šฐํŒ…ํ…Œ์ด๋ธ” ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์Œ ๋ชฉ์ ์ง€์— ์ „๋‹ฌ
  • 2) routing ๊ฐœ๋…
    • ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐ์ดํ„ฐ(ํŒจํ‚ท) ์ „์†ก์‹œ ์ตœ์  ๊ฒฝ๋กœ ์„ ํƒ
    • routing ํ•„์š” ์ •๋ณด
      • ์ถœ๋ฐœ์ง€/๋ชฉ์ ์ง€ ๋„คํŠธ์›Œํฌ ์ •๋ณด
      • ๋ชฉ์ ์ง€๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ
      • ์ตœ์  ๊ฒฝ๋กœ
      • ์ง€์†์ ์ธ ๋„คํŠธ์›Œํฌ ์ƒํƒœ ํ™•์ธ
  • 3) routing ๊ธฐ๋ฒ•
    • ์ •์  ๋ผ์šฐํŒ… : ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์— ์ •๋ณด๋ฅผ ๊ด€๋ฆฌ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์ž…๋ ฅ ๋ฐ ์—…๋ฐ์ดํŠธ ํ•„์š”
    • ๋™์  ๋ผ์šฐํŒ… : ์ธ์ ‘ ๋ผ์šฐํ„ฐ์™€ ๋ผ์šฐํŒ… ์ •๋ณด๋ฅผ ์ž๋™ ๊ตํ™˜ํ•˜์—ฌ ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ” ์ž๋™ ์ž‘์„ฑ (ํฐ ๋„คํŠธ์›Œํฌ ์‚ฌ์šฉ)
    • ๋””ํดํŠธ ๋ผ์šฐํŒ… : ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์— ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ ํŒจํ‚ท์ด ๊ฒฝ์šฐ ์ง€์ • ๊ฒฝ๋กœ๋กœ ์ „์†ก

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– routing protocol

EGP (Exterior Gateway Protocol)
: ๋‹ค๋ฅธ ๊ทธ๋ฃน๊ณผ ๋ผ์šฐํŒ… ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ (๋„๋ฉ”์ธ๊ฐ„ ๋ผ์šฐํŒ…)

  • 1) EGP (๊ฒŒ์ดํŠธ์›จ์ด ์—ญ์™ธ ํ”„๋กœํ† ์ฝœ)
  • 2) BGP (๊ฒฝ๊ณ„ ๊ฒŒ์ดํŠธ์›จ์ด ํ”„๋กœํ† ์ฝœ)


    IGP (Internal Gateway Protocol)
    : ๋™์ผ ๊ทธ๋ฃน ๋‚ด์—์„œ ๋ผ์šฐํŒ… ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ (๊ธฐ์—… ๋‚ด๋ถ€)

  • Distance Vector Protocol
    • ๊ฒฝ๋กœ ์„ค์ •์„ ์œ„ํ•œ ์š”์†Œ๋ฅผ ๊ฑฐ๋ฆฌ์™€ ๋ฐฉํ–ฅ์— ์ค‘์ 
    • ํ™‰ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ ์ฐพ์Œ
    • 1) RIP (๋ผ์šฐํŒ… ์ •๋ณด ํ”„๋กœํ† ์ฝœ)
    • 2) IGRP (๋‚ด๋ถ€ ๊ฒฝ๊ณ„ ๋ผ์šฐํŒ… ํ”„๋กœํ† ์ฝœ)
  • Link State Protocol
    • ์ „์ฒด ๋„คํŠธ์›Œํฌ topology, path ๋“ฑ ์ •๋ณด๋ฅผ DB๋กœ ์ €์žฅ
    • DB ๊ทผ๊ฑฐ๋กœ SPF ์•Œ๊ณ ๋ฆฌ์ฆ˜(Shortest Path First) ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝ๋กœ ์ฐพ์Œ
    • 3) OSPF (์ตœ๋‹จ ๊ฒฝ๋กœ ์šฐ์„  ํ”„๋กœํ† ์ฝœ)

2. routing table

  • 1) ๊ฐœ๋…

    • IP ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ผ์šฐํ„ฐ ์œ„์น˜๋ฅผ ์ €์žฅํ•œ ํ…Œ์ด๋ธ”
    • ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•œ ์ •๋ณด ๋ฐ ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ• ํฌํ•จ
  • 2) ๊ตฌ์„ฑ์š”์†Œ

    • ๋„คํŠธ์›Œํฌ ๋Œ€์ƒ (Network Destination) : ๋ชฉ์ ์ง€ ๋„คํŠธ์›Œํฌ์˜ IP ์ฃผ์†Œ
    • ์„œ๋ธŒ๋„ท ๋งˆ์Šคํฌ (Netmask) : ๋Œ€์ƒ ์ฃผ์†Œ๋ฅผ ์„ค๋ช…์‹œ ์‚ฌ์šฉ
    • ๊ฒŒ์ดํŠธ์›จ์ด (Gateway)
    • ์ธํ„ฐํŽ˜์ด์Šค (Interface)
    • ๋ฉ”ํŠธ๋ฆญ (Metric)
  • 3) ์‹ค์Šต

    netstat -r 

3. ๊ฒŒ์ดํŠธ์›จ์ด

  • 1) gateway ๊ฐœ๋…

    • ์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ์ƒ์˜ ํ†ต์‹  ํ”„๋กœํ† ์ฝœ์„ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• 
    • ์žฅ์น˜์™€ ์—ฐ๊ฒฐ๋œ ํ™‰, ํŒจํ‚ท์ด ์ „๋‹ฌ๋˜๋Š” ๋‹ค์Œ IP ์ฃผ์†Œ ์ •๋ณด (์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ์™€ ์—ฐ๊ฒฐ๋œ ์žฅ์น˜)
    • ๋ผ์šฐํ„ฐ์™€ ๊ธฐ๋Šฅ ์œ ์‚ฌ
  • 2) gateway ๋ฐฉ์‹

    • ๋ชฉ์ ์ง€๊ฐ€ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ๋ผ๋ฉด "์—ฐ๊ฒฐ๋จ(connected)"
    • ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ๋ผ๋ฉด "ํ•ด๋‹น ๋„คํŠธ์›Œํฌ์˜ ๊ฒŒ์ดํŠธ์›จ์ด ๊ฐ€๋ฆฌํ‚ด"
  • 3) ํ™‰

    • ๋„คํŠธ์›Œํฌ์—์„œ ์ถœ๋ฐœ์ง€์™€ ๋ชฉ์ ์ง€ ์‚ฌ์ด์— ์œ„์น˜ํ•œ ์žฅ์น˜
    • ํ™‰ ์นด์šดํŠธ : ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ฐœ์ง€์™€ ๋ชฉ์ ์ง€๊ฐ„ ํ†ต๊ณผํ•ด์•ผ ํ•˜๋Š” ํ™‰์˜ ๊ฐœ์ˆ˜
    • Routing = hop by hop ํ†ต์‹ 

4. ์ธํ„ฐํŽ˜์ด์Šค

  • ๊ฒŒ์ดํŠธ์›จ์ด๋กœ ๊ฐ€๊ธฐ์œ„ํ•ด ๊ฑฐ์น˜๋Š” ์žฅ์น˜ (10.0.0.2๋Š” eth3์„ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅ)

5. ๋ฉ”ํŠธ๋ฆญ

  • ํŒจํ‚ท ์ „์†ก์„ ์œ„ํ•ด ์ตœ์  ๊ฒฝ๋กœ ์„ ํƒ์‹œ ์ฐธ๊ณ ๋˜๋Š” ๊ฐ’(์šฐ์„ ์ˆœ์œ„)
  • ๋™์ผํ•œ ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ” ์š”์†Œ๊ฐ€ 2๊ฐœ ์žˆ์„ ๋•Œ ๋ฉ”ํŠธ๋ฆญ ๊ฐ’ ๋‚ฎ์œผ๋ฉด ์„ ํƒ
  • ํ™‰ ์ˆ˜ + ์ง€์—ฐ์‹œ๊ฐ„ + ์ฒ˜๋ฆฌ๋Ÿ‰ ๋“ฑ

๐Ÿ“• IP ์ฃผ์†Œ์ฒด๊ณ„

1. IP ์ฃผ์†Œ vs MAC ์ฃผ์†Œ

  • 1) IP ์ฃผ์†Œ (Internet Protocol Address)

    • ๋…ผ๋ฆฌ ์ฃผ์†Œ
    • ๋„คํŠธ์›Œํฌ์—์„œ ์žฅ์น˜๊ฐ„ ์ธ์‹ํ•˜๊ณ  ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • 2) MAC ์ฃผ์†Œ (Media Access Control Address)

    • ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์— ํ• ๋‹น๋œ ๊ณ ์œ  ์‹๋ณ„์ž
    • ์œ ์ผํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ (์‹ค์ˆ˜/์˜๋„์ ์œผ๋กœ UAA์ค‘๋ณต๋˜๊ฒŒ ๋งŒ๋“ฆ)
    • ์žฅ์น˜์˜ NIC(Network Interface Card)์— ํ• ๋‹น๋จ
    • 48๋น„ํŠธ๋กœ ๊ตฌ์„ฑ (24๋น„ํŠธ OUI + 24๋น„ํŠธ UAA)
    • MAC ์ฃผ์†Œ ํ™•์ธ : (mac) ipconfig en0์˜ ethernet, (windows)ipconfig/all

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– OUI์™€ UAA

  • OUI : IEEE์—์„œ ํ• ๋‹นํ•œ ์ œ์กฐ์‚ฌ ์ฝ”๋“œ
  • UAA : ์ œ์กฐ์‚ฌ์—์„œ ๊ตฌ๋ณ„๋˜๋Š” ์ฝ”๋“œ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– IEEE (Institute of Electrical and Electronics Engineers)

  • ์ „๊ธฐ/์ „์ž/์ „์‚ฐ ๋ถ„์•ผ์˜ ๊ตญ์ œ ๊ธฐ๊ตฌ ๋ฐ ํ•™ํšŒ
  • ๊ด€๋ จ ์ „๋ฌธ๊ฐ€๋“ค์ด ํ•ฉ๋ณ‘ํ•ด์„œ ์ฐฝ์„คํ•œ ๊ตญ์ œ ์กฐ์ง
  • ๊ด€๋ จ ๊ธฐ์ˆ  ๊ณต์œ ์™€ ํ‘œ์ค€ ์ •์˜๋“ฑ ํ™œ๋™

2. IPv4์™€ IPv6

  • 1) IPv4 ๊ฐœ๋…

    • 32๋น„ํŠธ๋กœ ํ‘œํ˜„๋˜๋Š” ์ฃผ์†Œ ์ฒด๊ณ„
    • 2^32๊ฐœ์˜ ์ฃผ์†Œ(41์–ต 9์ฒœ๋งŒ) ํ‘œํ˜„ ๊ฐ€๋Šฅ
    • 8๋น„ํŠธ์”ฉ 4๊ฐœ, .(์ )์œผ๋กœ ๊ตฌ๋ถ„, 10์ง„์ˆ˜
    • ๋‹จ์  : ์ฃผ์†Œ ๋ถ€์กฑ์œผ๋กœ NAT, ์„œ๋ธŒ๋„คํŒ… ์ƒ๊น€
  • 2) IPv6 ๊ฐœ๋…

    • 128๋น„ํŠธ๋กœ ํ‘œํ˜„๋˜๋Š” ์ฃผ์†Œ ์ฒด๊ณ„
    • 2^128๊ฐœ์˜ ์ฃผ์†Œ ํ‘œํ˜„ ๊ฐ€๋Šฅ
    • 16๋น„ํŠธ์”ฉ 8๊ฐœ, :(์ฝœ๋ก )์œผ๋กœ ๊ตฌ๋ถ„, 16์ง„์ˆ˜
    • ์•ž์˜ 0 ์—ฐ์†๋˜๋ฉด ์ƒ๋žต ๊ฐ€๋Šฅ
    • ๊ตฌ์„ฑ : 64๋น„ํŠธ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ + 64๋น„ํŠธ ์ธํ„ฐํŽ˜์ด์Šค ์ฃผ์†Œ
    • IPSec ๋‚ด์žฅ๋จ (๋ฐ์ดํ„ฐ ํŒจํ‚ท์„ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ณด์•ˆ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ)
    • ๋‹จ์ˆœํ•ด์ง„ ํ—ค๋” ํฌ๋งท (IPv4์˜ ๋ถˆํ•„์š”ํ•œ ํ•„๋“œ ์ œ๊ฑฐ)

  • 3) IPv4 ํ—ค๋”
    • checksum ํ•„๋“œ : CRC๋ฅผ ํ†ตํ•œ ์†์ƒ๋œ ํŒจํ‚ท์„ ํ™•์ธํ•˜๊ณ  ํ๊ธฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
    • ํ—ค๋” : ๊ฐ€๋ณ€๊ธธ์ด
    • ์†๋„ : ๋Š๋ฆผ
  • 4) IPv6 ํ—ค๋”
    • checksum ํ•„๋“œ : ์—†์Œ (์ƒ์œ„ ํ”„๋กœํ† ์ฝœ(TCP/UDP)์— ์ฒดํฌ์„ฌ ํ•„๋“œ ์ค‘๋ณต๋จ)
    • ํ—ค๋” : ๊ณ ์ •๊ธธ์ด(40๋ฐ”์ดํŠธ)๋ผ์„œ ์ธํ„ฐ๋„ท ํ—ค๋”๊ธธ์ด ์ •๋ณด ์—†์Œ
    • ์†๋„ : ๋น ๋ฆ„
    • TTL โžก๏ธ HOP limit (์ด๋ฆ„ ๋ณ€๊ฒฝ)

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– TTL

  • ํŒจํ‚ท์ด ๋„คํŠธ์›Œํฌ์—์„œ ๋ฌดํ•œ์ˆœํ™˜ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ณ€์ˆ˜
  • ํŒจํ‚ท์ด ๋„คํŠธ์›Œํฌ์—์„œ ๋ผ์šฐํ„ฐ ๊ฑฐ์น  ๋•Œ๋งˆ๋‹ค TTL๊ฐ’ 1์”ฉ ๊ฐ์†Œ
  • ๊ฐ’์ด 0์ด ๋˜๋ฉด ํŒจํ‚ท ํ๊ธฐ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– CRC

  • ์ˆœํ™˜ ์ค‘๋ณต ๊ฒ€์‚ฌ
  • ๋„คํŠธ์›Œํฌ์ƒ์—์„œ ๋ฐ์ดํ„ฐ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์ฒดํฌ๊ฐ’ ๊ฒฐ์ • ๋ฐฉ์‹
    • ๋ฐ์ดํ„ฐ ์ „์†กํ•˜๊ธฐ ์ „์— ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์— ๋”ฐ๋ผ CRC๊ฐ’ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ถ™์—ฌ ์ „์†ก
    • ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๋๋‚œ ํ›„ ๋ฐ›์€ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์œผ๋กœ ๋‹ค์‹œ CRC๊ฐ’ ๊ณ„์‚ฐ
    • ๋‘ ๊ฐ’ ๋น„๊ตํ•ด์„œ ๋‹ค๋ฅผ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ์ „์†ก ๊ณผ์ • ์ค‘ ์˜ค๋ฅ˜(์žก์Œ ๋“ฑ)๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์ „์†ก๋œ ๊ฒƒ
  • ์„ค์น˜
npm install crc
  • ์‚ฌ์šฉ
import crc32 from 'crc/crc32':
crc32('hello').toString(16):
// "3610a686"

3. Classful IP Addressing

  • classful ๊ฐœ๋…

    • ์ธํ„ฐ๋„ท ์ƒ์˜ IP ์ฃผ์†Œ๋ฅผ ํฌ๊ธฐ๋ณ„(ํด๋ž˜์Šค๋ณ„)๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ์‹
    • ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ๋ฅผ ๋งค๊ธฐ๊ณ  ํฌ๊ธฐ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๊ตฌ๋ถ„ํ•˜์—ฌ ํด๋ž˜์Šค ํ• ๋‹นํ•˜๋Š” ์ฃผ์†Œ ์ฒด๊ณ„
  • IP ์ฃผ์†Œ ๊ตฌ์„ฑ: ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ + ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ

    • ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ : ํ˜ธ์ŠคํŠธ๋ฅผ ๋ชจ์€ ๋„คํŠธ์›Œํฌ (๋™์ผ์‹œ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ)
    • ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ : ํ˜ธ์ŠคํŠธ ๊ตฌ๋ถ„
    • ๋„คํŠธ์›Œํฌ ํ˜ธ์ŠคํŠธ : ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ ๋ฐ ๊ธฐํƒ€ ์žฅ์น˜
  • 1) ํด๋ž˜์Šค A

    • ํ•œ ๋„คํŠธ์›Œํฌ ๋‹น 1600๋งŒ๊ฐœ ํ˜ธ์ŠคํŠธ ID / 0 (2^24 -2)
    • ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ ๋ฒ”์œ„ : 1 ~ 126 ์‹œ์ž‘
    • 127.x.x.x ๋ฃจํ”„๋ฐฑ ์ฃผ์†Œ๋กœ ์ œ์™ธ (๋ณธ์ธ IP ์ง€์นญํ•˜๋Š” ์ฃผ์†Œ)
    • 0.0.0.0 ํŠน์ˆ˜ ์ฃผ์†Œ๋กœ ์ œ์™ธ (์•Œ ์ˆ˜ ์—†๋Š” ๋Œ€์ƒ์„ ์œ„ํ•œ ์ž„์‹œ ์ฃผ์†Œ)
  • 2) ํด๋ž˜์Šค B

    • ํ•œ ๋„คํŠธ์›Œํฌ๋‹น 6๋งŒ 5์ฒœ๊ฐœ ํ˜ธ์ŠคํŠธ ID / 10 (2^16 - 2)
    • ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ ๋ฒ”์œ„ : 128 ~ 191 ์‹œ์ž‘
  • 3) ํด๋ž˜์Šค C

    • ํ•œ ๋„คํŠธ์›Œํฌ๋‹น 254 ํ˜ธ์ŠคํŠธ ID / 110 (2^8 - 2)
    • ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ ๋ฒ”์œ„ : 192 ~ 223 ์‹œ์ž‘

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ํด๋ž˜์Šคํ’€ IP ์ฃผ์†Œ ๊ทœ์น™

  • ์ฒซ ์ฃผ์†Œ : ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ (X.0.0.0)
  • ๋งˆ์ง€๋ง‰ ์ฃผ์†Œ : ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ… ์ฃผ์†Œ (X.255.255.255)
  • ํ•ญ์ƒ 2๊ฐœ ์ œ์™ธํ•˜๊ณ  ์‚ฌ์šฉ

4. Classless, Subnetmask, Subneting

  • Classful ๋‹จ์ 
    • ๋„คํŠธ์›Œํฌ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๊ฒฝ์šฐ ํฐ ๋„คํŠธ์›Œํฌ ํ•„์š”ํ•œ ์กฐ์ง์€ ์—ฌ๋Ÿฌ๊ฐœ ํ™•๋ณด
    • ๋„คํŠธ์›Œํฌ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ๋„คํŠธ์›Œํฌ ํ•„์š”ํ•œ ์กฐ์ง์€ IP ๋‚ญ๋น„
  • Classless ๊ฐœ๋…
    • ํด๋ž˜์Šค๋กœ ๋‚˜๋ˆ„์ง€ ์•Š๊ณ  ์„œ๋ธŒ๋„ท๋งˆ์Šคํฌ ๊ธฐ์ค€์œผ๋กœ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ์™€ ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ ๊ตฌ๋ถ„ (ํ˜„์žฌ ์ฃผ์†Œ์ฒด๊ณ„ ์‚ฌ์šฉ)
    • ์„œ๋ธŒ๋„ทํŒ… : ๋„คํŠธ์›Œํฌ ๋‚˜๋ˆ”
    • ์„œ๋ธŒ๋„ท : ์„œ๋ธŒ ๋„คํŠธ์›Œํฌ (์ชผ๊ฐœ์ง„ ๋„คํŠธ์›Œํฌ)
    • ์„œ๋ธŒ๋„ท๋งˆ์Šคํฌ : ์„œ๋ธŒ ๋„คํŠธ์›Œํฌ๋ฅผ ์œ„ํ•œ ๋น„ํŠธ๋งˆ์Šคํฌ
  • ์„œ๋ธŒ๋„ท๋งˆ์Šคํฌ
    • ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ ๋ถ€๋ถ„ : 1 ์„ค์ •
    • ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ ๋ถ€๋ถ„ : 0 ์„ค์ •
    • ํ™•์ธ : ipconfig

5. Public IP์™€ Private IP, NET

  • IP ์ฃผ์†Œ ๋ถ€์กฑ์„ ๊ณต์ธIP์™€ ์‚ฌ์„ค IP๋กœ ๋‚˜๋ˆ„๊ณ  NAT์œผ๋กœ ํ•ด๊ฒฐ
  • NAT (Network Address Translation)
    • ํŒจํ‚ท์ด ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ์žฅ์น˜๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜๋Š” ๋™์•ˆ ํŒจํ‚ท์˜ IP์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝ
    • IP ์ฃผ์†Œ๋ฅผ ๋‹ค๋ฅธ IP ์ฃผ์†Œ๋กœ ๋งคํ•„ํ•˜๋Š” ๋ฐฉ๋ฒ•
    • NAT์„ ํ†ตํ•ด ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ IP๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ

๐Ÿ“• HTTP

1. HTTP ํ—ค๋”

์‚ฌ์šฉ์ž๊ฐ€ HTTP ์š”์ฒญ์‹œ ํ—ค๋”์™€ ๋ฐ”๋”” ์ฃผ๊ณ  ๋ฐ›์Œ

  • 1) HTTP Header ๊ฐœ๋…

    • ํ—ค๋”์— ๋ฐ”๋””(html, xml, json ๋“ฑ ๋ณธ๋ฌธ) ์ •๋ณด ํฌํ•จ
    • ์ฝœ๋ก (:)์œผ๋กœ ์„œ๋กœ ๊ตฌ๋ถ„๋˜๋Š” key-value ํ˜•ํƒœ
    • HTTP ์š”์ฒญ์‹œ ์ผ๋ฐ˜ํ—ค๋”/์š”์ฒญํ—ค๋”/์‘๋‹ตํ—ค๋” ์ž๋™ ์ƒ์„ฑ

      ๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– HTTP ํ™•์ธ

      • 1) www.naver.com โžก๏ธ chrome ๊ฐœ๋ฐœ์ž ๋„๊ตฌ
      • 2) Network โžก๏ธ Fetch/XHR
      • 3) (API ์š”์ฒญ์‹œ ๋ฐ›๋Š” ๋ฆฌ์†Œ์Šค ์ค‘) count.nhn ํ™•์ธ
      • 4) Preview (Body)
  • 2) ์ผ๋ฐ˜ํ—ค๋”

    • Referrer Policy : ๋ณด์•ˆ์ •๋„ ์„ค์ • (์š”์ฒญํ•œ URL/์š”์ฒญ ๋ฉ”์„œ๋“œ/ํ•ด๋‹น ์ž์› ์ถœ์ฒ˜ URL์˜ ๋…ธ์ถœ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •)
  • 3) ์š”์ฒญํ—ค๋”

    • ํด๋ผ์ด์–ธํŠธ์—์„œ ์„ค์ •ํ•˜๋Š” ํ—ค๋”
    • ๋ฉ”์„œ๋“œ, ํด๋ผ์ด์–ธํŠธ์˜ OS, ๋ธŒ๋ผ์šฐ์ € ์ •๋ณด ํฌํ•จ
  • 4) ์‘๋‹ตํ—ค๋”

    • ์„œ๋ฒ„์—์„œ ์„ค์ •ํ•˜๋Š” ํ—ค๋”

    • ์„œ๋ฒ„์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ •๋ณด ํฌํ•จ (๋ณด์•ˆ์„ ์œ„ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ํ‘œ์‹œ)

    • NWS (Naver Web Server)

    • ์ƒ์„ฑ

// node.js
  const http = require('http');  // http ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ด
  const hostname = '127.0.0.1'; 
  const port = 3000;
  
  const server = http.createServer((req, res) => { // server ๊ฐ์ฒด์— server ์ธ์Šคํ„ด์Šค ๋‹ด๊ธฐ
  	res.setHeader('Content-Type', 'text/plain; charset=utf-8'); // key-value ํ˜•ํƒœ
    res.setHeader('kundol', "i love you, but you don't love me"); // ํ—ค๋” ์ปค์Šคํ…€ ๊ฐ€๋Šฅ 
    res.end('ํฐ๋Œ, ๊ทธ๋Š” ์‹ ์ธ๊ฐ€?!\n');
});

  server.listen(port, hostname, () => { // ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด server ๊ตฌ๋™
  	console.log(`Server running at http://${hostname}:${port}/`);
});

// ์‹คํ–‰ : node [์‹คํ–‰ํŒŒ์ผ๋ช…]

2. HTTP/1.0

  • HTTP/1.0 ํŠน์ง•
    • ์ˆ˜๋ช… ์งง์€ ์—ฐ๊ฒฐ
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋‹น ํ•˜๋‚˜์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„ โžก๏ธ RTT ์ฆ๊ฐ€
    • ๊ฐ HTTP ์š”์ฒญ๋‹น TCP ํ•ธ๋“œ์…ฐ์ดํฌ ๋ฐœ์ƒ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– RTT (Round Trip Time, ์™•๋ณต ์ง€์—ฐ ์‹œ๊ฐ„)

  • ์‹ ํ˜ธ๋ฅผ ์ „์†ก + ์‹ ํ˜ธ์˜ ์ˆ˜์‹ ํ™•์ธ์— ๊ฑธ๋ฆฐ ์‹œ๊ฐ„
  • ์–ด๋–ค ๋ฉ”์‹œ์ง€๊ฐ€ ๋‘ ์žฅ์น˜ ์‚ฌ์ด๋ฅผ ์™•๋ณตํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„

3. HTTP/1.1

  • ์žฅ์ 1๏ธโƒฃ) keep-alive
    - default (๊ธฐ๋ณธ ์˜ต์…˜) : ๋งค๋ฒˆ ๋ฐ์ดํ„ฐ ์š”์ฒญ์‹œ๋งˆ๋‹ค TCP ์—ฐ๊ฒฐ ์ƒˆ๋กœ ํ•˜์ง€ ์•Š๊ณ , 1๋ฒˆ ์—ฐ๊ฒฐ๋งŒ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ ํŒŒ์ผ ์†ก์ˆ˜์‹  ๊ฐ€๋Šฅ
    - header : timeout(์—ฐ๊ฒฐ์œ ์ง€์‹œ๊ฐ„) ๋ฐ max(์ตœ๋Œ€ ์š”์ฒญ ์ˆ˜) ์ง€์ •

    const express = require('express') // express ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ฒ„ ๊ฐ€๋™
    const app = express() 
    app.get('/',(req, res) =>{ // path(/)์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด, ํ•˜๋‹จ json ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋ฒ„ 
      res.json({"a" : 1})
    })
    const server = app.listen(12010)
    server.keepAliveTimeout = 30 * 1000 // KeepAliveTimeout(TCP ์—ฐ๊ฒฐ์„ ์–ธ์ œ๊นŒ์ง€ ์œ ์ง€ํ• ์ง€ ์„ค์ •ํ•˜๋Š” ํ—ค๋”) 30์ดˆ๋กœ ์„ค์ • (default 5์ดˆ)
  • ์žฅ์ 2๏ธโƒฃ) ํ˜ธ์ŠคํŠธ ํ—ค๋”

    • HTTP/1.0 : ํ•˜๋‚˜์˜ IP์— ํ•˜๋‚˜์˜ ํ˜ธ์ŠคํŠธ๋งŒ ๊ฐ€์ง
    • HTTP/1.1 : ํ—ค๋”์— ํŠน์ • ํ˜ธ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ ์š”์ฒญํ•˜๋„๋ก ๋ณ€๊ฒฝ
  • ์žฅ์ 3๏ธโƒฃ) ๋Œ€์—ญํญ ์ตœ์ ํ™”

    • HTTP/1.0 : ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋‹ค๊ฐ€ ์—ฐ๊ฒฐ ๋Š๊ธฐ๋ฉด ๋‹ค์‹œ ๋ฐ›๊ธฐ ๋ถˆ๊ฐ€๋Šฅ
    • HTTP/1.1 : Range:bytes=5000- ํ—ค๋” ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œ ์žฌ๊ฐœ ์š”์ฒญ ๊ฐ€๋Šฅ
  • ๋‹จ์ 1๏ธโƒฃ) HOL (Head Of Line blocking) ๋ฌธ์ œ

    • ๋„คํŠธ์›Œํฌ์—์„œ ๊ฐ™์€ ํ์— ์žˆ๋Š” ์ฒซ๋ฒˆ์งธ ํŒจํ‚ท์— ์˜ํ•ด ์ง€์—ฐ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜ ํ˜„์ƒ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : image.jpg ๋‹ค์šด ์ง€์—ฐ์‹œ ์ „์ฒด ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์ง€์—ฐ๋จ
  • ์š”์ฒญ ์ค„์ด๊ธฐ

    • ํ•ด๊ฒฐ1๏ธโƒฃ) ์ด๋ฏธ์ง€ ์Šคํ”„๋ผ์ดํŠธ : ์—ฌ๋Ÿฌ๊ฐœ ์ด๋ฏธ์ง€๋ฅผ 1๊ฐœ์˜ ์ด๋ฏธ์ง€๋กœ ํ•ฉ์ณ์„œ ๋‹ค์šด๋ฐ›์Œ (background-position์œผ๋กœ ํŠน์ • ์ด๋ฏธ์ง€ ํ‘œ๊ธฐ)
    • ํ•ด๊ฒฐ2๏ธโƒฃ) ์ฝ”๋“œ ์••์ถ• : ์ฝ”๋“œ์—์„œ ๋“ค์—ฌ์“ฐ๊ธฐ/๊ฐœํ–‰๋ฌธ์ž/๋นˆ์นธ ๋“ฑ ํ•„์š”์—†๋Š” ๋ถ€๋ถ„ ์ œ๊ฑฐ (์šฉ๋Ÿ‰โฌ‡๏ธ)
    • ํ•ด๊ฒฐ3๏ธโƒฃ) Base64 ์ธ์ฝ”๋”ฉ ๊ธฐ์ˆ  : ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ 64์ง„๋ฒ• ๋ฌธ์ž์—ด๋กœ ์ธ์ฝ”๋”ฉ (์ด๋ฏธ์ง€ ์„œ๋ฒ„์— ๋Œ€ํ•œ HTTP ์š”์ฒญํ•  ํ•„์š” ์—†์Œ, ์šฉ๋Ÿ‰โฌ†๏ธ)

4. HTTP/2

  • HTTP/2 ๊ฐœ๋…

    • ๊ตฌ๊ธ€์—์„œ HTTP/1.1 ํ•œ๊ณ„ ๊ทน๋ณต ์œ„ํ•ด SPDY ํ”„๋กœํ† ์ฝœ (speedy) ๊ฐœ๋ฐœ
    • ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋งท ๊ณ„์ธต
      • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต๊ณผ ์ „์†ก ๊ณ„์ธต ์‚ฌ์ด์— ์ถ”๊ฐ€
      • 0๊ณผ 1๋กœ ์ด๋ค„์ง„ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋” ์ž‘์€ ๋ฉ”์‹œ์ง€๊ฐ€ ํ”„๋ ˆ์ž„์œผ๋กœ ์บก์Šํ™”๋˜์–ด ์ „์†ก
  • ์žฅ์ 1๏ธโƒฃ) HOL Blocking ํ•ด๊ฒฐ

  • ์žฅ์ 2๏ธโƒฃ) ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ

    • ํ•˜๋‚˜์˜ TCP ์—ฐ๊ฒฐ์— ์—ฌ๋Ÿฌ ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉํ•ด์„œ ์—ฌ๋Ÿฌ HTTP ์š”์ฒญ/์‘๋‹ต์„ ๋™์‹œ์— ๋ณ‘๋ ฌ๋กœ ์†ก์ˆ˜์‹ 
    • ๋ฆฌ์†Œ์Šค๋ฅผ ์ž‘์€ ํ”„๋ ˆ์ž„์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ „๋‹ฌ
    • ๊ฐ ํ”„๋ ˆ์ž„์€ ์ŠคํŠธ๋ฆผID, ํ•ด๋‹น ์ฒญํฌ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ”„๋ ˆ์ž„ ์ถ”๊ฐ€ โžก๏ธ ์‘๋‹ต๋ฐ์ดํ„ฐ์—์„œ ์ˆœ์„œ ๋ณด์žฅ
  • ์žฅ์ 3๏ธโƒฃ) ์„œ๋ฒ„ํ‘ธ์‹œ

    • ํ–ฅํ›„ ์š”์ฒญ์—์„œ ์˜ˆ์ƒ๋˜๋Š” ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๋ฏธ๋ฆฌ ํด๋ผ์ด์–ธํŠธ์— ํ‘ธ์‹œํ•จ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : html ์ฝ์œผ๋ฉด์„œ ๊ทธ ์•ˆ์— ์ฐธ์กฐ๋œ css, jsํŒŒ์ผ์„ ํ‘ธ์‹œํ•˜์—ฌ ๋ฏธ๋ฆฌ ๋ณด๋ƒ„
  • ์žฅ์ 4๏ธโƒฃ) ํ—ค๋”์••์ถ•

    • HTTP/1.x์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ํ—ค๋”์˜ ๋ฌธ์ œ ํ•ด๊ฒฐ
    • ๋˜‘๊ฐ™์€ ์„œ๋ฒ„์—์„œ 2๊ฐœ์˜ ์ด๋ฏธ์ง€ ์ „๋‹ฌํ•  ๊ฒฝ์šฐ ์ค‘๋ณต๋˜๋Š” ํ—ค๋”๋Š” ์ œ์™ธ ํ›„ ๊ณตํ†ต ํ•„๋“œ๋กœ ํ—ค๋” ์žฌ๊ตฌ์„ฑ
    • ์ค‘๋ณต๋˜์ง€ ์•Š์€ ํ—ค๋”๋ฅผ ํ—ˆํ”„๋งŒ ์ธ์ฝ”๋”ฉ ์••์ถ• ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์••์ถ• ํ›„ ์ „์†ก
  • ์žฅ์ 5๏ธโƒฃ) ์ŠคํŠธ๋ฆผ ์šฐ์„ ์ˆœ์œ„ ์„ค์ •

    • ์„œ๋ฒ„์—์„œ ์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•ด ๋ฆฌ์†Œ์Šค ์ „๋‹ฌ
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์‘๋‹ต ์ˆ˜์‹  ๋ฐฉ์‹์„ ์ง€์ •ํ•ด์„œ ์‘๋‹ต ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : html ๋ฌธ์„œ ๋‚ด์— css ํŒŒ์ผ 1๊ฐœ + ์ด๋ฏธ์ง€ ํŒŒ์ผ 2๊ฐœ ์š”์ฒญํ•  ๊ฒฝ์šฐ
      • css ํŒŒ์ผ ์ˆ˜์‹ ์ด ์ด๋ฏธ์ง€ ํŒŒ์ผ๋ณด๋‹ค ๋Šฆ์–ด์ง€๋ฉด, ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์— ๋ฌธ์ œ ๋ฐœ์ƒ
      • ๋ฆฌ์†Œ์Šค ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„์— ๋”ฐ๋ฅธ ์šฐ์„ ์ˆœ์œ„ ์„ค์ • ๊ฐ€๋Šฅ

    ๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ํ—ˆํ”„๋งŒ ์ธ์ฝ”๋”ฉ

    • ๋ฌธ์ž์—ด์„ ๋ฌธ์ž ๋‹จ์œ„๋กœ ์ชผ๊ฐœ ๋นˆ๋„์ˆ˜๋ฅผ ์„ธ์–ด ๋นˆ๋„๊ฐ€ ๋†’์€ ์ •๋ณด๋Š” ์ ์€ ๋น„ํŠธ์ˆ˜๋กœ ํ‘œํ˜„
    • ๋นˆ๋„์ˆ˜ ๋‚ฎ์€ ์ •๋ณด๋Š” ๋งŽ์€ ๋น„ํŠธ์ˆ˜๋กœ ํ‘œํ˜„ํ•ด ํ•„์š”ํ•œ ๋น„ํŠธ์–‘์„ ์ค„์ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

5. HTTP/3

  • HTTP/3 ๊ฐœ๋…

    • UDP ๊ธฐ๋ฐ˜์˜ QUIC (Quick UDP Internet Connections) ํ”„๋กœํ† ์ฝœ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹ 
  • ์žฅ์ 1๏ธโƒฃ) ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ, ์ดˆ๊ธฐ ์—ฐ๊ฒฐ ์„ค์ •์‹œ ์ง€์—ฐ์‹œ๊ฐ„ ๊ฐ์†Œ

  • ์žฅ์ 2๏ธโƒฃ) ์ดˆ๊ธฐ ์—ฐ๊ฒฐ ์„ค์ •์‹œ ์ง€์—ฐ์‹œ๊ฐ„ ๊ฐ์†Œ

    • QUIC์€ UDP ๊ธฐ๋ฐ˜์ด๋ผ 3-way handshaking ๊ณผ์ •X
    • ์ฒซ ์—ฐ๊ฒฐ ์„ค์ •์— 1-RTT ์†Œ์š”
  • ์žฅ์ 3๏ธโƒฃ) FEC (Forward Error Correction, ์ˆœ๋ฐฉํ–ฅ ์˜ค๋ฅ˜ ์ˆ˜์ • ๋ฉ”์ปค๋‹ˆ์ฆ˜)

    • ์ „์†ก๋œ ํŒจํ‚ท ์†์‹ค์‹œ ์ˆ˜์‹ ์ธก์—์„œ ์—๋Ÿฌ ๊ฒ€์ถœ + ์ˆ˜์ •
    • ์—ด์•…ํ•œ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ๋„ ๋‚ฎ์€ ํŒจํ‚ท ์†์‹ค๋ฅ 

6. ์•”ํ˜ธํ™”

  • 1) ์•”ํ˜ธํ™” ๊ฐœ๋…
    • ์Šน์ธ๋œ ๋‹น์‚ฌ์ž๋งŒ ์ •๋ณด๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ ์Šคํฌ๋žจ๋ธ”
    • ciphertext(์•”ํ˜ธ๋ฌธ) = plaintext(ํ‰๋ฌธ) + key
    • ํ†ต์‹ ์„ ํ•˜์ด์žฌํ‚นํ•˜์—ฌ ์ฝ์„ ์ˆ˜ ์—†๋„๋ก ๋ฐ์ดํ„ฐ ์œ ์ถœ ๋ฐฉ์ง€, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ
  • 2) ์Šคํฌ๋žจ๋ธ”
    • ๊ฐ ๋‹จ์–ด๋‚˜ ๋ฌธ์ž๋ฅผ ํŒจํ„ด์— ๋”ฐ๋ผ ์•”ํ˜ธํ™”X, ๋ฌด์ž‘์œ„ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ณ„ ๋ฐ์ดํ„ฐ ๋น„ํŠธ๋ฅผ ์„ž์Œ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : AES (๊ณตํ†ต 128๋น„ํŠธ ๊ณ ๊ธ‰ ์•”ํ˜ธํ™” ํ‘œ์ค€)์˜ ์•”ํ˜ธํ™” ํŒŒ์ผ์˜ ๊ฒฝ์šฐ
      • 10ํšŒ ์Šคํฌ๋žจ๋ธ”๋˜๊ณ , ํ‚ค์—†์ด ํ•ด๋…ํ•  ๊ฒฝ์šฐ ์˜ค๋žœ ์‹œ๊ฐ„ ๊ฑธ๋ฆผ
  • 3) ๋Œ€์นญ ์•”ํ˜ธํ™”
    • ํ‚ค๋ฅผ 1๊ฐœ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธํ™” ๋ฐฉ๋ฒ•
    • ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”์— ๋™์ผํ•œ ํ‚ค ์‚ฌ์šฉ
    • ํ‚ค ๊ตํ™˜ ์‹œ Diffie-Hellman ๋ฐฉ์‹ ์‚ฌ์šฉ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : DES, AES
  • 4) ๋น„๋Œ€์นญ ์•”ํ˜ธํ™” (๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™”)
    • 2๊ฐœ์˜ ๋‹ค๋ฅธ ํ‚ค(๊ณต๊ฐœํ‚ค, ๊ฐœ์ธํ‚ค)๋กœ ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”/์„œ๋ช…
    • ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ๋Š” ๊ฐœ์ธํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™” ๊ฐ€๋Šฅ
    • HTTPS์—์„œ ์‚ฌ์šฉ๋˜๋Š” TLS ํ”„๋กœํ† ์ฝœ์—์„œ ๋ถ€๋ถ„์ ์œผ๋กœ ๋น„๋Œ€์นญ ์•”ํ˜ธํ™” ์‚ฌ์šฉ (TLS 1.3)
      • TLS Handshake ๊ณผ์ •์—์„œ ์ฒซ ์ธ์ฆ ๋•Œ DH ๊ฐ™์€ ํ‚ค ๊ตํ™˜ ๋ฐฉ์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„๊ฐ„ ์„ธ์…˜ํ‚ค ๊ตํ™˜
      • ์„ธ์…˜ํ‚ค ์ด์šฉํ•œ ๋Œ€์นญ ์•”ํ˜ธํ™” ๊ธฐ๋ฐ˜์œผ๋กœ ์•”ํ˜ธํ™”๋œ ํ†ต์‹ 
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : RSA, DH(Diffie-Hellman)

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– RSA ์ทจ์•ฝ์ 

  • RSA์˜ ๊ฒฝ์šฐ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒ์„ฑํ•œ ์„ธ์…˜ํ‚ค(์ž„์‹œ ์•”ํ˜ธ๊ฐ’)์„ ์„œ๋ฒ„๋กœ ์ „์†ก
    โžก๏ธ ์ œ3์ž๊ฐ€ ์„œ๋ฒ„์˜ ๊ฐœ์ธํ‚ค ํƒˆ์ทจํ•  ๊ฒฝ์šฐ SSL Handshake ๊ณผ์ • ๋ณตํ˜ธํ™” ํ•˜์—ฌ ๋ณผ ์ˆ˜ ์žˆ์Œ (PFS ์ง€์›X)
  • DH์˜ ๊ฒฝ์šฐ : ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„๊ฐ€ ์„œ๋กœ ๊ตํ™˜ํ•œ DH ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•ด ๊ฐœ์ธํ‚ค ๋งŒ๋“ฆ
    โžก๏ธ DH ํƒˆ์ทจ๋‹นํ•ด๋„ ๊ณตํ†ต ์•”ํ˜ธํ‚ค ๋งŒ๋“ค์ง€ ๋ชปํ•ด ์œ„ํ—˜ ์ ์Œ
  • RSA ํ‚ค ๊ตํ™˜ ๊ณผ์ •
    • ์„œ๋ฒ„์—์„œ ๊ณต๊ฐœํ‚ค+๊ฐœ์ธํ‚ค ์ƒ์„ฑํ•˜๊ณ  SSL ์ธ์ฆ์„œ๋ฅผ ํ†ตํ•ด ๊ณต๊ฐœํ‚ค๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „์†ก
    • ํด๋ผ์ด์–ธํŠธ๋Š” ๊ณต๊ฐœํ‚ค๋กœ ์„ธ์…˜ํ‚ค๋ฅผ ์•”ํ˜ธํ™” ํ•˜์—ฌ ์„œ๋ฒ„์— ์ „์†ก
    • ์„œ๋ฒ„๋Š” ์„ธ์…˜ํ‚ค๋ฅผ ๋ณตํ˜ธํ™” ํ•˜์—ฌ ํ†ต์‹ ์— ์‚ฌ์šฉ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– PFS (Perfect Forward Secrecy)

  • ๋น„๋ฐ€ํ‚ค๊ฐ€ ๋…ธ์ถœ๋˜์—ˆ์„ ๊ฒฝ์šฐ์—๋„ ๊ธฐ์กด ์•”ํ˜ธ๋ฌธ์„ ๋…ธ์ถœ๋œ ๋น„๋ฐ€ํ‚ค๋กœ ํ•ด๋…X
  • ECDHE ๋ฐฉ์‹์ด PFS ์ง€์›
    • DH ๋ฐฉ์‹์€ ์„ธ์…˜ํ‚ค๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ์„ฑ ๊ฐ€๋Šฅ โžก๏ธ ์ฃผ๊ธฐ์ ์œผ๋กœ ์„ธ์…˜ํ‚ค ๋ณ€๊ฒฝํ•˜์—ฌ ์ผ์ • ์ฃผ๊ธฐ๋งˆ๋‹ค ๋‹ค๋ฅธ ์„ธ์…˜ํ‚ค ๊ฐ€์ง
    • ๊ณต๊ฒฉ์ž๊ฐ€ ํŠน์ • ์‹œ์ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณตํ˜ธํ™”ํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ ํŠน์ • ์‹œ์ ์˜ ์„ธ์…˜ํ‚ค ํ•„์š”

7. TLS ํ•ธ๋“œ์…ฐ์ดํฌ

  • 1) TLS ๊ฐœ๋…

    • ์ „์†ก ๊ณ„์ธต์—์„œ ๋ณด์•ˆ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ
    • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ํ†ต์‹ ํ•  ๋•Œ TLS ํ†ตํ•ด ์ œ3์ž๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋„์ฒญ/๋ณ€์กฐ๋ฅผ ๋ง‰์Œ
    • SSL(Secure Socket Layer)์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œ ๋˜๋ฉฐ TLS(Transport Layer Security Protocol) ๋ช…์นญ ๋ณ€๊ฒฝ
    • ๋น„๋Œ€์นญ ์•”ํ˜ธํ™”๋กœ ์ธ์ฆ โžก๏ธ ๋Œ€์นญ ์•”ํ˜ธํ™”๋กœ ๋ณด์•ˆ์  ํ†ต์‹ 
    • HTTPS = HTTP + TLS
  • 2) TLS Handshake (TLS 1.3)

    • ์‚ฌ์šฉํ•  TLS ๋ฒ„์ „ ์ •ํ•˜๊ธฐ โžก๏ธ ์‚ฌ์ดํผ์ŠˆํŠธ, ์„œ๋ฒ„ ๊ณต๊ฐœํ‚ค, SSL ์ธ์ฆ์„œ ๊ธฐ๋ฐ˜ ์ธ์ฆ์ž‘์—… ์ˆ˜ํ–‰ โžก๏ธ ๋Œ€์นญ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•ด ์„ธ์…˜ํ‚ค ์ƒ์„ฑ
    • (1) Client Hello
      • ํด๋ผ์ด์–ธํŠธ : TLS๋ฒ„์ „, ์‚ฌ์ดํผ์ŠˆํŠธ, ํด๋ผ์ด์–ธํŠธ ๋žœ๋ค๊ฐ’(๋ฌด์ž‘์œ„ ๋ฌธ์ž์—ด), ์ž„์‹œ DH ๋งค๊ฐœ๋ณ€์ˆ˜ ์„œ๋ฒ„์— ๋ณด๋ƒ„
    • (2) Server HEllo, EncryptedExtensions, Certificate, CertificateVerify
      • ์„œ๋ฒ„ : ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์˜ต์…˜ ํ™•์ธ (์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๋†’์€ TLS ๋ฒ„์ „ ์‹๋ณ„ํ•˜์—ฌ ๊ฒฐ์ •, ์‚ฌ์ดํผ์ŠˆํŠธ ์ง€์› ์—ฌ๋ถ€ ํ™•์ธ)
      • ์„œ๋ฒ„ : ๊ณต๊ฐœํ‚ค๊ฐ€ ํฌํ•จ๋œ SSL ์ธ์ฆ์„œ, ์„œ๋ฒ„ ๋žœ๋ค๊ฐ’, ์ž„์‹œ DH ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณด๋ƒ„
      • ํด๋ผ์ด์–ธํŠธ/์„œ๋ฒ„ : ์„œ๋กœ ๊ตํ™˜ํ•œ DH ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ์…˜ํ‚ค(์ž„์‹œ ์•”ํ˜ธ ํ‚ค) ์ƒ์„ฑ
    • (3) Finished
      • ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„๊ฐ€ ์„ธ์…˜ํ‚ค ๊ธฐ๋ฐ˜์œผ๋กœ ๋Œ€์นญ ์•”ํ˜ธํ™” ํ†ต์‹  ์‹œ์ž‘ (๋ณด์•ˆ ์„ธ์…˜)
      • ํ‚ค ๊ตํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : RSA, DH(ํƒ€์›๊ณก์„  DH)
  • 3) TLS ํŒจํ‚ท๋ถ„์„

    • SSL : ssllabs ์ด์šฉ
    • TLS : wireshark ์ด์šฉ
    • client๊ฐ€ ์‚ฌ์ดํผ์ŠˆํŠธ ์ „์†ก
    • EC ๋””ํ”ผํ—ฌ๋งŒ (ํƒ€์›๊ณก์„  + ๋””ํ”ผํ—ฌ๋งŒ) ์ด์šฉ
    • ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ
  • 4) DH ๋งค๊ฐœ๋ณ€์ˆ˜ (Diffie-Hellman)

    • ๊ณตํ†ต ์•”ํ˜ธํ‚ค ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • a. b : Alice & Bob๋งŒ์ด ์•Œ๊ณ  ์žˆ๋Š” ๋น„๋ฐ€๊ฐ’
    • g, p : ๊ณต๊ฐœ๊ฐ’
    • Alice๊ฐ€ A, g, p Bob์—๊ฒŒ ์ „์†ก
      โžก๏ธ Bob์ด B๋ฅผ Alice์—๊ฒŒ ์ „์†ก
      โžก๏ธ Alice์™€ Bob์€ ์„œ๋กœ ๋ฐ›์€ ๋งค๊ฐœ๋ณ€์ˆ˜(A, B)๋กœ ๊ณตํ†ต ํ‚ค ๊ฐ’์ธ K ์ƒ์„ฑ ๊ฐ€๋Šฅ
    • ์ข…๋ฅ˜
      • DHE : ์ผ๋ฐ˜ ๋””ํ”ผํ—ฌ๋งŒ
      • ECDHE : ํƒ€์›๊ณก์„ ์•”ํ˜ธํ™” ๋ฐฉ๋ฒ• + DH

    ๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ํƒ€์›๊ณก์„  ์•”ํ˜ธํ™” ๋ฐฉ๋ฒ•

    • ๊ณก์„ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ธ ํ‚ค ๋ณด์œ ์ž๋งŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ํƒ€์›๊ณก์„  ๊ทธ๋ฆผ
    • ํƒ€์›๊ณก์„ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ต์ฐจ์  ์ƒ์„ฑ
    • ๊ต์ฐจ์ ์˜ ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์•”ํ˜ธ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • 5) ์‚ฌ์ดํผ์ŠˆํŠธ

    • ํ”„๋กœํ† ์ฝœ, AEAD ์‚ฌ์ดํผ ๋ชจ๋“œ, ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‚˜์—ด๋œ ๊ทœ์•… (์•”ํ˜ธ์ œํ’ˆ๊ตฐ)
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : TLS 1.3 ๋ฒ„์ „
      • TLS_AES_128_GCM_SHA256
      • TLS_AES_256_GCM_SHA384
      • TLS_CHACHA20_POLY1305_SHA256
      • TLS_AES_128_CCM_SHA_256
      • TLS_AES_128_CCM_8_SHA256
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : TLS_AES_128_GCM_SHA256์€ 3๊ฐ€์ง€ ๊ทœ์•ฝ ๋“ค์–ด ์žˆ์Œ์„ ์˜๋ฏธ
      • TLS : ํ”„๋กœํ† ์ฝœ
      • AES_128_GCM : AEAD ์‚ฌ์ดํผ ๋ชจ๋“œ
      • SHA256 : ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– AEAD (Authenticated Encryption with Associated Data) ์‚ฌ์ดํผ ๋ชจ๋“œ

  • ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : AES_128_GCM
    • 128๋น„ํŠธ์˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” AES ์•Œ๊ณ ๋ฆฌ์ฆ˜ + ๋ณ‘๋ ฌ ๊ณ„์‚ฐ์— ์šฉ์ดํ•œ GCM ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ฒฐํ•ฉ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • 6) ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘๊ณ  ์„ž์ธ ์กฐ๊ฐ์œผ๋กœ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • SSL/TLS์—์„œ ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ SHA-256, SHA-384 ์‚ฌ์šฉ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : SHA-256 ์•Œ๊ณ ๋ฆฌ์ฆ˜
      • ํ•ด์‹œ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ด๊ฐ’์ด 256๋น„ํŠธ
      • ๋น„ํŠธ ์ฝ”์ธ ๋“ฑ ๋งŽ์€ ๋ธ”๋ก์ฒด์ธ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ
    • TLS์—์„œ ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ
      • ์ธ์ฆ ์ƒ์„ฑ์ž‘์—… : ์ „์ž์„œ๋ช… ๋งŒ๋“œ๋Š”๋ฐ ์„œ๋ช…๋˜๋Š” ๋ฉ”์‹œ์ง€ ํ•ด์‹ฑ
      • ์ธ์ฆ ํ™•์ธ์ž‘์—… : ๋ฉ”์‹œ์ง€๋ฅผ ๋ณตํ˜ธํ™”ํ•ด์„œ ํ•ด์‹œ๋ฅผ ์„œ๋กœ ๋น„๊ตํ•ด ์˜ฌ๋ฐ”๋ฅธ ๋ฉ”์‹œ์ง€์ธ์ง€ ํ™•์ธ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ์ „์ž์„œ๋ช…

  • ์†ก์‹ ์ž๊ฐ€ ์ž์‹ ์˜ ์‹ ์›์„ ์ฆ๋ช…ํ•˜๋Š” ์ ˆ์ฐจ/์ •๋ณด
  • ์ „์ž์„œ๋ช…์„ ํ†ตํ•ด ์ธ์ฆ์„œ์˜ ์ฃผ์ฒด๊ฐ€ ์„œ๋น„์Šค ์ œ๊ณต์ž์ธ์ง€ ํ™•์ธ
  • ๊ธฐ๋ก๋œ ์ „์ž์„œ๋ช… ๊ธฐ๋ฐ˜์œผ๋กœ CA์˜ ๊ณต๊ฐœํ‚ค๋กœ ๋ณตํ˜ธํ™” ํ•ด์„œ ์ง€๋ฌธ์„ ์–ป๊ณ , ์ธ์ฆ์„œ์— ๊ธฐ๋ก๋œ ์ •๋ณด๋ฅผ ํ•ด์‹œ ํ•จ์ˆ˜์— ์ž…๋ ฅํ•˜์—ฌ ๋‘ ํ•ด์‹œ์˜ ์ผ์น˜ ์—ฌ๋ถ€ ํ™•์ธ (์œ ํšจ์„ฑ ๊ฒ€์ฆ)
  • ์œ ํšจ์„ฑ ๊ฒ€์ฆ : ์ธ์ฆ์„œ๊ฐ€ ๋ณ€์กฐ๋˜์ง€ ์•Š๊ณ , ์ธ์ฆ์„œ๊ฐ€ "์„œ๋น„์Šค ์ œ๊ณต์ž"๊ฒƒ์ž„์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ์ธ์ฆ์„œ

  • ์ฃผ์ฒด + ๊ณต๊ฐœํ‚ค ํฌํ•จํ•˜๋Š” ๋‹จ์ˆœ ๋ฐ์ดํ„ฐ ํŒŒ์ผ
    • ์ฃผ์ฒด : ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ํ•œ CA, ๋„๋ฉ”์ธ, ์›น์‚ฌ์ดํŠธ ์†Œ์œ ์ž, ์ธ์ฆ์„œ ์†Œ์œ ์ž
    • ๊ณต๊ฐœํ‚ค : ์ฒซ ์ธ์ฆ์‹œ ์‚ฌ์šฉ (๊ณต๊ฐœํ‚ค, ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ๋ฒ•)
    • ํด๋ผ์ด์–ธํŠธ์—์„œ ์˜๋„ํ•œ ์„œ๋ฒ„๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธ์‹œ ์‚ฌ์šฉ
  • ์ธ์ฆ๊ธฐ๊ด€(CA)์—์„œ ๋ฐœ๊ธ‰ํ•œ SSL ์ธ์ฆ์„œ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆ
    • ์ž์‹ ์˜ ์›น์‚ฌ์ดํŠธ ์•ˆ์—์„œ SSL ์ธ์ฆ์„œ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Œ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– CA (Certificate Authority)

  • ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋Š” ๊ธฐ์—…๋“ค
  • CA๋กœ๋ถ€ํ„ฐ ์ธ์ฆ์„œ๋ฅผ ๊ตฌ์ž…ํ•  ๋•Œ ์„œ๋น„์Šค์˜ ๋„๋ฉ”์ธ, ๊ณต๊ฐœํ‚ค ๊ฐ™์€ ์ •๋ณด๋ฅผ ์ œ์ถœํ•ด์•ผ ํ•จ
  • ์ข…๋ฅ˜
    • ๋‹จ์ผ ๋„๋ฉ”์ธ : 1๊ฐœ ๋„๋ฉ”์ธ์— ์ ์šฉ๋˜๋Š” ์ธ์ฆ์„œ (ex. www.naver.com)
    • ์™€์ผ๋“œ์นด๋“œ : ๋„๋ฉ”์ธ์˜ ํ•˜์œ„๋„๋ฉ”์ธ๋„ ํฌํ•จํ•˜๋Š” ์ธ์ฆ์„œ (www.cloudflare.com, blog.cloudflare.com)
    • ๋ฉ€ํ‹ฐ ๋„๋ฉ”์ธ : ๊ด€๋ จ๋˜์ง€ ์•Š์€ ๋‹ค์ˆ˜์˜ ๋„๋ฉ”์ธ์— ์ ์šฉ๋˜๋Š” ์ธ์ฆ์„œ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– 0 - RTT

  • ์„ธ์…˜ํ‚ค ์ƒ์„ฑ ํ›„ ๋‹ค์‹œ ์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธํ•˜๋ฉด, ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์€ ์„ธ์…˜ํ‚ค(PSK)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฐ๊ฒฐํ•ด์„œ ์ธ์ฆ์— ๋“œ๋Š” ๋น„์šฉX
  • ์ธ์ฆ์— ๊ด€ํ•œ RTT๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ

๐Ÿ“• ์›น๋ธŒ๋ผ์šฐ์ €์˜ ์บ์‹œ

1. ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€

  • ๊ฐœ๋…
    • ์›น ๋ธŒ๋ผ์šฐ์ € ๋‚ด์— { key : value } ํ˜•ํƒœ๋กœ ์˜ค๋ฆฌ์ง„์— ์ข…์†๋˜์–ด ์ €์žฅ๋˜๋Š” ์›น ์Šคํ† ๋ฆฌ์ง€ ๊ฐ์ฒด
    • ์˜ค๋ฆฌ์ง„์ด ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ๊ณต์œ ๋จ
  • ํŠน์ง•
    • ํ•˜๋‚˜์˜ ํ‚ค์— ์˜ค๋กœ์ง€ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ์ €์žฅ
    • ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š” ํ•œ ํ‰์ƒ ๋™์•ˆ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ์ €์žฅ๋˜๋ฉฐ ๋งŒ๋ฃŒ๋‚ ์งœ ์—†์Œ (์‚ฌ์šฉ์ž๊ฐ€ ์ฐฝ/ํƒญ ๋‹ซ๊ฑฐ๋‚˜ ์ปดํ“จํ„ฐ ์ข…๋ฃŒํ•ด๋„ ๋งŒ๋ฃŒX)
    • ์ตœ๋Œ€ ์ €์žฅ์šฉ๋Ÿ‰ 5MB
    • ๋กœ๊ทธ์ธ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’ ๋“ฑ์œผ๋กœ ์‚ฌ์šฉ๋จ
    • ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ๋ฐ์ดํ„ฐ๋Š” ์ž๋™์œผ๋กœ ์„œ๋ฒ„ ์ „์†กX (์ฟ ํ‚ค๋Š” ์ž๋™ ์ „์†ก)
  • ์‚ฌ์šฉ๋ฒ•
    • ์„ค์ • : localStorage.setItem(key, value);
    • key์— ํ•ด๋‹นํ•˜๋Š” value ๊ฐ€์ ธ์˜ค๊ธฐ : localStorage.getItem(key);
    • ์ œ๊ฑฐ : localStorage.removeItem(key);
    • ์ „์ฒด ์ œ๊ฑฐ : localStorage.clear();

2. origin

  • query string (search)
    https://search.shopping.naver.com (์˜ค๋ฆฌ์ง„) + /catalog + (๊ฒฝ๋กœ) /33803998618?adId... (์ฟผ๋ฆฌ)

3. ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ํ™œ์šฉ

  • (1) ๋กœ๊ทธ์ธ ์œ ์ง€์— ์‚ฌ์šฉ

  • (2) ์บ์‹ฑ

    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : UX๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ…์ŠคํŠธ ์ฐฝ์— ์ž…๋ ฅํ•œ ๊ฐ’์„ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํ†ตํ•ด ์บ์‹ฑ
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,
initial-scale=1.0">
    <title>Document</title>
    <style>
/* CSS */
        .button-62 {
            background: linear-gradient(to bottom right, #EF4765,
#FF9A5A);
            border: 0;
            border-radius: 12px;
            color: #FFFFFF;
            cursor: pointer;
            display: inline-block;
            font-family: -apple-system, system-ui, "Segoe UI",
Roboto, Helvetica, Arial, sans-serif;
                 font-size: 16px;
            font-weight: 500;
            line-height: 2.5;
            outline: transparent;
            padding: 0 1rem;
            text-align: center;
            text-decoration: none;
            transition: box-shadow .2s ease-in-out;
            user-select: none;
            -webkit-user-select: none;
            touch-action: manipulation;
            white-space: nowrap;
}
        .button-62:not([disabled]):focus {
            box-shadow: 0 0 .25rem rgba(0, 0, 0, 0.5), -.125rem
-.125rem 1rem rgba(239, 71, 101, 0.5), .125rem .125rem 1rem
rgba(255, 154, 90, 0.5);
}
        .button-62:not([disabled]):hover {
            box-shadow: 0 0 .25rem rgba(0, 0, 0, 0.5), -.125rem
-.125rem 1rem rgba(239, 71, 101, 0.5), .125rem .125rem 1rem
rgba(255, 154, 90, 0.5);
} #field{
            font-size: 27px;
        }
body{
display: flex;
            justify-content: center;
            align-items: center;
            margin: 0 auto;
            height: 100vh;
}
    </style>
</head>
<body> <div>
<input type="text" id="field" />
<input type="button" class="button-62" value="๊ฒ€์ƒ‰"id="save" />
<input type="button" class="button-62" value="์กฐํšŒ"
id="read" />
<input type="button" class="button-62" value="์‚ญ์ œ"
id="clear" />
    </div>
</body>
<script>
window.onload = async () => {
const field = document.getElementById("field"),
            save = document.getElementById("save"),
            read = document.getElementById("read"),
            clear = document.getElementById("clear")
save.addEventListener("click", e => localStorage.setItem("์ž…๋ ฅ๊ฐ’", field.value))
read.addEventListener("click", e => alert(window.localStorage["์ž…๋ ฅ๊ฐ’"]))
        clear.addEventListener("click", e => {
            window.localStorage.clear()
            field.value = ""
})
if (window.localStorage["์ž…๋ ฅ๊ฐ’"]) {
field.value = window.localStorage["์ž…๋ ฅ๊ฐ’"] }
}
</script>
</html>

4. ์„ธ์…˜์Šคํ† ๋ฆฌ์ง€

  • ๊ฐœ๋…
    • ์›น ์Šคํ† ๋ฆฌ์ง€ ๊ฐ์ฒด๋กœ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์— { key : value } ํ˜•ํƒœ๋กœ ์˜ค๋ฆฌ์ง„์— ์ข…์†๋˜์–ด ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ
    • ์˜ค๋ฆฌ์ง„์ด ๊ฐ™์€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ๊ณต์œ ๋จ
    • ๋ณดํ†ต ์„ธ์…˜์Šคํ† ๋ฆฌ์ง€๋ณด๋‹ค ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ๋งŽ์ด ์‚ฌ์šฉ
  • ํŠน์ง•
    • ํ•˜๋‚˜์˜ ํ‚ค์— ์˜ค๋กœ์ง€ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ์ €์žฅ
    • ์ตœ๋Œ€ ์ €์žฅ์šฉ๋Ÿ‰ 5MB
    • ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํƒญ์„ ๋‹ซ์œผ๋ฉด ๋ฐ์ดํ„ฐ ๋งŒ๋ฃŒ๋จ(์‚ญ์ œ)
  • ์‚ฌ์šฉ๋ฒ•
    • ์„ค์ • : sessionStorage.setItem(key, value);
    • ํƒ์ƒ‰ : sessionStorage.getItem(key);
    • ์ œ๊ฑฐ : sessionStorage.removeItem(key);
    • ์ „์ฒด ์ œ๊ฑฐ : sessionStorage.clear()

5. ์ฟ ํ‚ค

  • 1) ๊ฐœ๋…

    • ํด๋ผ์ด์–ธํŠธ์— ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ์š”์ฒญ์‹œ ์„œ๋ฒ„์— ์ž๋™์œผ๋กœ ์ฟ ํ‚ค ์ „์†ก๋จ
    • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋‘˜ ๋‹ค ์กฐ์ž‘ ๊ฐ€๋Šฅ
      - ๋ณดํ†ต ์„œ๋ฒ„์—์„œ ๋งŒ๋ฃŒ๊ธฐํ•œ ๋“ฑ ์„ค์ •ํ•ด์„œ ์ฟ ํ‚ค ์ƒ์„ฑ
      - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ document.cookie ํ†ตํ•ด ์ฟ ํ‚ค ์„ค์ • (ํ—ค๋” = ์ฟ ํ‚ค๊ฐ’)
      โžก๏ธ ์ฟ ํ‚ค ์ œ์–ด๊ถŒ์„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ€์ง€๋ฉด ์ฟ ํ‚ค์— ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธธ ์ˆ˜ ์žˆ์–ด์„œ, ์„œ๋ฒ„๊ฐ€ ์ œ์–ด๊ถŒ ๊ฐ–๊ฒŒ ํ•ด์•ผํ•จ
      axios.get(url, { 
      headers: {
                    Cookie: "cookie1=value; cookie2=value; cookie3=value;"
      		}
      }).then
    • ์„œ๋ฒ„์—์„œ ์‘๋‹ตํ—ค๋”๋กœ Set-cookie ์„ค์ •ํ•ด์„œ ์ฟ ํ‚ค ๋ณด๋‚ด๋ฉด, ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญํ—ค๋” Cookie์— ์„ค์ •๋˜์–ด ์ž๋™์œผ๋กœ ์„œ๋ฒ„ ์ „๋‹ฌ๋˜๊ณ , ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ
    • ์ €์žฅ์šฉ๋Ÿ‰ ์ตœ๋Œ€ 4KB
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ๋กœ๊ทธ์ธ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ, ์‚ฌ์šฉ์ž ์ปค์Šคํ„ฐ๋งˆ์ด์ง•, ์‚ฌ์šฉ์ž ํ–‰๋™๋ถ„์„(๊ฐœ์ธํ™” ๊ด‘๊ณ ์— ์‚ฌ์šฉ)
  • 2) ์„ธ์…˜ ์ฟ ํ‚ค

    • Expires ๋˜๋Š” Max-Age ์†์„ฑ์„ ์ง€์ •X
    • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ฟ ํ‚ค๋„ ์‚ฌ๋ผ์ง
  • 3) ์˜๊ตฌ ์ฟ ํ‚ค

    • Expires ๋˜๋Š” Max-Age ์†์„ฑ์„ ์ง€์ •
    • ๋ธŒ๋ผ์šฐ์ € ๋‹ซ์„ ๋•Œ ๋งŒ๋ฃŒX (ํŠน์ • ๋‚ ์งœ ๋˜๋Š” ์ผ์ • ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์‚ญ์ œ)
  • 4) ๋ฌธ๋ฒ•

    Set-Cookie: <cookie-name>=<cookie-value>
    Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
    Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>
    Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
    Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
    Set-Cookie: <cookie-name>=<cookie-value>; Secure
    Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly
    Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
    • (1) Secure : https๋กœ๋งŒ ์ฟ ํ‚ค ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•จ (ํ˜„์žฌ ํฌ๋กฌ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์‚ฌ์ดํŠธ๊ฐ€ Secure ์ง€์‹œ๋ฌธ์œผ๋กœ ์ฟ ํ‚ค ์„ค์ • ๊ธˆ์ง€ํ•จ)
    • (2) HttpOnly : ๊ณต๊ฒฉ์ž๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋นผ๋‚ผ ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ฆ (document.cookie๋กœ ์ ‘๊ทผ ๋ถˆ๊ฐ€)
    • (3) SameSite : ์š”์ฒญ์ด ๋™์ผํ•œ ๋„๋ฉ”์ธ์—์„œ ์‹œ์ž‘ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ฟ ํ‚ค๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ „์†ก๋˜๋„๋ก ํ—ˆ์šฉ
      const http = require('http');
      const hostname = '127.0.0.1';
      const port = 3000;
      const server = http.createServer((req, res) => {
      res.setHeader('Content-Type', 'text/plain; charset=utf-8');
      res.setHeader('Set-Cookie', ['kundol = amumu; httponly',
      'loltier = master; Secure']);
      res.end('ํฐ๋Œ, ๊ทธ๋Š” ์‹ ์ธ๊ฐ€?!\n'); });
      server.listen(port, hostname, () => {
      console.log(`Server running at http://${hostname}:${port}/`);
      });
  • 5) ์ฟ ํ‚ค์˜ ์‹œํ์–ด์ฝ”๋”ฉ

    • ์„ธ์…˜ID ์„ค์ •์‹œ
      • cookie์— ์„ธ์…˜ID๋ฅผ ์„ธ์…˜ID ๊ธฐ๋ฐ˜์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์œ ์ถ”ํ•  ์ˆ˜ ์—†๊ฒŒ ํ•ด์•ผํ•จ (์„ธ์…˜ID ์–ด๋ ต๊ณ , ๊ธธ๊ณ , ๋žœ๋คํ•˜๊ฒŒ ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ)
      • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ๋Š” ํŒŒ์•…ํ•  ์ˆ˜ ์—†๊ฒŒ http only ์˜ต์…˜ ์ ์šฉ
      • ์ผ์ •์‹œ๊ฐ„์˜ ์„ธ์…˜ ํƒ€์ž„์•„์›ƒ ๊ฑธ๊ธฐ
    • ์ฟ ํ‚ค ํ—ˆ์šฉ ๊ด€๋ จ ์•Œ๋ฆผ์ฐฝ ์ƒ์„ฑ
    • ์„œ๋น„์Šค ์šด์šฉ์‹œ ์ฟ ํ‚ค ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ฟ ํ‚ค ํ—ˆ์šฉ ๊ด€๋ จ ์•Œ๋ฆผ์ฐฝ ์ƒ์„ฑ
  • ๋ฐฉ๋ฌธ ๊ธฐ๋ก์„ ์ถ”์ ํ•  ๋•Œ ์ฟ ํ‚ค ์‚ฌ์šฉ๋จ

    • ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ ๊ฐ„์ ‘ ์ˆ˜์ง‘์— ํ•ด๋‹น๋˜์–ด KISA(ํ•œ๊ตญ์ธํ„ฐ๋„ท์ง„ํฅ์›) ์ง€์นจ ์ค€์ˆ˜
    • ์ •๋ณด๋ณดํ˜ธ ๋ฐ ๊ฐœ์ธ์ •๋ณด๋ณดํ˜ธ ๊ด€๋ฆฌ์ฒด๊ณ„(ISMS-P) ์ธ์ฆ๊ธฐ์ค€(KISA) - ๊ฐ„์ ‘์ˆ˜์ง‘ ๋ณดํ˜ธ์กฐ์น˜
      • ์ •๋ณด์ฃผ์ฒด(์ด์šฉ์ž) ์ด์™ธ๋กœ๋ถ€ํ„ฐ ๊ฐœ์ธ์ •๋ณด ์ˆ˜์ง‘ํ•˜๊ฑฐ๋‚˜ ์ œ๊ณต๋ฐ›๋Š” ๊ฒฝ์šฐ์—๋Š” ์—…๋ฌด์— ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ฐœ์ธ์ •๋ณด๋งŒ ์ˆ˜์ง‘, ์ด์šฉํ•˜์—ฌ์•ผ ํ•˜๊ณ  ๋ฒ•๋ น์— ๊ทผ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ •๋ณด์ฃผ์ฒด(์ด์šฉ์ž)์˜ ์š”๊ตฌ๊ฐ€ ์žˆ์œผ๋ฉด ๊ฐœ์ธ์ •๋ณด์˜ ์ˆ˜์ง‘ ์ถœ์ฒ˜, ์ฒ˜๋ฆฌ๋ชฉ์ , ์ฒ˜๋ฆฌ์ •์ง€์˜ ์š”๊ตฌ๊ถŒ๋ฆฌ๋ฅผ ์•Œ๋ ค์•ผ ํ•œ๋‹ค.
      • ๋‹ค๋งŒ, ์„œ๋น„์Šค ์ œ๊ณต ๊ณ„์•ฝ ์ดํ–‰๊ณผ๋Š” ๋ฌด๊ด€ํ•œ ๋ชฉ์ ์œผ๋กœ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์„ ํƒ ๋™์˜ ํ•ญ๋ชฉ์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜์—ฌ ๋ณ„๋„์˜ ์‚ฌ์ „ ๋™์˜๋ฅผ ๋ฐ›์•„์•ผ ํ•จ (์˜ˆ๋ฅผ ๋“ค์–ด, ์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ์ˆ˜์ง‘ํ•˜๋Š” ํ–‰ํƒœ ์ •๋ณด๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๊ฐœ์ธ๋ณ„ ๋งž์ถคํ˜• ๊ด‘๊ณ ์— ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ)

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ์—…๋น„ํŠธ์˜ ์ฟ ํ‚ค ์„ธ์…˜ ํƒ€์ž„์•„์›ƒ (๊ณต๊ฒฉ์ž ์ ‘๊ทผ ์ฐจ๋‹จ)

  • ๋กœ๊ทธ์ธ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์—…๋น„ํŠธ ๋กœ๊ทธ์ธ ํ™”๋ฉด์—์„œ '๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€' ํ™œ์„ฑํ™”
  • PC ์›น์—์„œ ์ง€์›๋˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ '๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€' ํ™œ์„ฑํ™” ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๊ธฐ๋ณธ ๋กœ๊ทธ์ธ ์œ ์ง€ ์‹œ๊ฐ„์ด ์„ค์ •๋จ
    • ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€ ํ™œ์„ฑํ™” : ๋กœ๊ทธ์ธ ์œ ์ง€ ์‹œ๊ฐ„ ๊ธฐ๋ณธ 24์‹œ๊ฐ„
    • ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€ ๋น„ํ™œ์„ฑํ™” : ๋กœ๊ทธ์ธ ์œ ์ง€ ์‹œ๊ฐ„ ๊ธฐ๋ณธ 3์‹œ๊ฐ„

6. ๋กœ์ปฌ/์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€์™€ ์ฟ ํ‚ค ๋น„๊ต

  • ๊ณตํ†ต์ 1๏ธโƒฃ) ํ•„์š”ํ•œ ์ด์œ 

    • ๋ธŒ๋ผ์šฐ์ €์— ์บ์‹ฑ์„ ํ•จ์œผ๋กœ์จ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ค„์—ฌ ์„œ๋ฒ„ ๋ถ€ํ•˜ ๋ฐฉ์ง€
    • ์บ์‹ฑ์œผ๋กœ ์ธํ•ด ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์ปจํ…์ธ  ์ค„์–ด ์›น์‚ฌ์ดํŠธ์˜ ์ปจํ…์ธ ๋ฅผ ๋” ๋นจ๋ฆฌ ๋‹ค์šด๋กœ๋“œ ๊ฐ€๋Šฅ
  • ๊ณตํ†ต์ 2๏ธโƒฃ) ์ €์žฅ๋ชฉ๋ก

    • ์‚ฌ์ดํŠธ ๊ธฐ๋ณธ ์„ค์ • ์ปค์Šคํ„ฐ๋งˆ์ด์ง•(์ƒ‰์ƒ, ๊ธ€๊ผด ํฌ๊ธฐ ๋“ฑ)
    • ๋กœ๊ทธ์ธ ์ƒํƒœ ์ €์žฅ
  • ์ฐจ์ด์ 1๏ธโƒฃ) ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ vs ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€ vs ์ฟ ํ‚ค

  • ์ฐจ์ด์ 2๏ธโƒฃ) ์„ธ์…˜์ฟ ํ‚ค vs ์˜๊ตฌ์ฟ ํ‚ค

  • ์ฐจ์ด์ 3๏ธโƒฃ) ์„ธ์…˜ vs ์„ธ์…˜์ฟ ํ‚ค vs ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€

๐Ÿ“• ๋กœ๊ทธ์ธ

1. ์„ธ์…˜๊ธฐ๋ฐ˜ ์ธ์ฆ๋ฐฉ์‹

  • 1) ๊ฐœ๋…

    • HTTP ์š”์ฒญ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ์š”์ฒญ์ด ๋๋‚˜๋ฉด ์š”์ฒญํ•œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์œ ์ง€X (stateless) โžก๏ธ ์„ธ์…˜ ํ•„์š”
    • ์„ธ์…˜ : ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์ด ํ™œ์„ฑํ™”๋œ ์ƒํƒœ
    • ์„ธ์…˜ID : ์›น ์„œ๋ฒ„ ๋˜๋Š” DB์— ์ €์žฅ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์œ ๋‹ˆํฌ ID
  • 2) ์ธ์ฆ ํ”„๋กœ์„ธ์Šค

    • 1๏ธโƒฃ : ์ฒ˜์Œ ๋กœ๊ทธ์ธ โžก๏ธ ์„ธ์…˜ID ์ƒ์„ฑ โžก๏ธ ์„œ๋ฒ„์—์„œ ์„ธ์…˜ID๋ฅผ ์ฟ ํ‚ค๋กœ ์„ค์ •ํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌ
    • 2๏ธโƒฃ : ์ดํ›„ ์š”์ฒญ๋งˆ๋‹ค HTTP ํ—ค๋”์— ์„ธ์…˜ID๋ฅผ ์ฟ ํ‚ค์— ํฌํ•จ์‹œ์ผœ ์š”์ฒญ
    • 3๏ธโƒฃ : ํ•ด๋‹น ์ฟ ํ‚ค์— ๋งž๋Š” ์„ธ์…˜ID๋กœ ์ „์— ๋กœ๊ทธ์ธํ•œ ID์ธ์ง€ ํ™•์ธ
    • 4๏ธโƒฃ : ๋กœ๊ทธ์ธ ์œ ์ง€
  • 3) ๋‹จ์ 

    • ๋กœ๊ทธ์ธ ์ค‘์ธ ์œ ์ €์˜ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚  ๊ฒฝ์šฐ
      โžก๏ธ ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณผ๋ถ€ํ•˜
    • DB์ค‘ RDBMS์— ์ €์žฅํ•  ๊ฒฝ์šฐ
      โžก๏ธ ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™”์— ๊ด€ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™”

  • ๋„คํŠธ์›Œํฌ๊ฐ„ ๊ฐ์ฒด๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ ํ•„์š”
  • โœ๏ธ ์ง๋ ฌํ™”
    • ๊ฐ์ฒด์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆผ์— ๋‹ด๊ธฐ ์œ„ํ•ด ์—ฐ์†์ ์ธ(serial) ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜
  • โœ๏ธ ์—ญ์ง๋ ฌํ™”
    • ์ŠคํŠธ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ฝ์–ด์™€์„œ ๊ฐ์ฒด๋กœ ๋งŒ๋“ฆ
  • 4) ์‹ค์Šต
    • node.js ์„ค์น˜ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜
      npm install escape-html express express-session
    • ์„ธ์…˜ ์ƒ์„ฑ ํ›„ ์ž๋™์œผ๋กœ ์ฟ ํ‚ค๊ฐ’ ์„ค์ •
      // ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ธ ๊ฐ’์„ ๋ณด์•ˆ์„ ์œ„ํ•ด escapeํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. // ์˜ˆ๋ฅผ ๋“ค์–ด foo&bar>>foo&amp;bar ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
      const escapeHtml = require('escape-html')
      const express = require('express')
      const session = require('express-session')
      const app = express()
      // ๋ฐ•์ข…์„ ๋ฐ”๋ณด๋ฉ์ฒญ์ด >> SHA256 >>
      // 9e8821c8ef4ab43ba09310af54e98caedc13e314efdea720bf513b9b3675faf4 app.use(session({
      name: "session-id",
      secret:
      "9e8821c8ef4ab43ba09310af54e98caedc13e314efdea720bf513b9b3675faf4"
      ,
      resave: false,
      saveUninitialized: false
      }))
      // ๋ฏธ๋“ค์›จ์–ด : auth
      const isAuthenticated = (req,res, next) =>{
      // ๋งŒ์•ฝ ์„ธ์…˜์ด ์žˆ๋‹ค๋ฉด ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋กœ. ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด. ๋‹ค์Œ route๋กœ ์ œ์–ด๊ถŒ์„ ๋„˜๊น๋‹ˆ๋‹ค.
      if (req.session.user) next()
      else next('route') }
      // ๋งŒ์•ฝ isAuthenticated ํ•˜๋‹ค๋ฉด logout์„ ๋ณด์—ฌ์ค€๋‹ค. app.get('/', isAuthenticated, function (req, res) {
      res.send(escapeHtml(req.session.user) + '๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!') })
      // ๋งŒ์•ฝ isAuthenticated ํ•˜์ง€ ์•Š๋‹ค๋ฉด login์„ ๋ณด์—ฌ์ค€๋‹ค. app.get('/', function (req, res) {
      res.send('<p>๋กœ๊ทธ์ธ</p><form action="/login" method="post">' + 'Username: <input name="user"><br>' +
      'Password: <input name="pass" type="password"><br>' + '<input type="submit" text="Login"></form>')
      })
      // ๋กœ๊ทธ์ธ์š”์ฒญ >> ์„ธ์…˜ ์ƒ์„ฑ
      app.post('/login', express.urlencoded({ extended: false }), function (req, res) {
      if(req.body.user === "kundol" && req.body.pass === "1234"){ req.session.regenerate(function (err) {
      if (err) next(err)
      // input : user ์— ์žˆ๋Š” ๊ฐ’์„ req.session.user์— ํ• ๋‹น req.session.user = req.body.user
      //์„ธ์…˜ ์ƒ์„ฑ>>์ฟ ํ‚ค๊ฐ’ ์„ค์ •>>์ดํ›„ ๋‹ค์‹œ ๋ฆฌ๋‹ค์ด๋ ‰ํŒ… req.session.save(function (err) {
      if (err) return next(err)
             res.redirect('/')
           })
      })
      }else res.redirect('/')
      })
      app.listen(3000, () => console.log("server is started :
      http://localhost:3000"))

2. ํ† ํฐ๊ธฐ๋ฐ˜ ์ธ์ฆ๋ฐฉ์‹

  • 1) ๊ฐœ๋…

    • state๋ฅผ ๋ชจ๋‘ ํ† ํฐ์œผ๋กœ ์ฒ˜๋ฆฌ
    • ์ธ์ฆ์€ ํ† ํฐ ์ธ์ฆ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ํ•˜๊ณ , ๋‹ค๋ฅธ ์„œ๋ฒ„๋Š” statelessํ•œ ๋ฐฉ์‹
  • 2) ์ธ์ฆ ํ”„๋กœ์„ธ์Šค

    • 1๏ธโƒฃ : /login ์š”์ฒญ โžก๏ธ JWTํ† ํฐ ์ƒ์„ฑ
      (access ํ† ํฐ ์ˆ˜๋ช… ์งง๊ฒŒ + refresh ํ† ํฐ ์ˆ˜๋ช… ๊ธธ๊ฒŒ)
    • 2๏ธโƒฃ : access ํ† ํฐ์„ HTTP Header-Authorization/Cookie์— ๋‹ด์•„ ์„œ๋ฒ„์— ์š”์ฒญ
      • Bearer <token> ํ˜•์‹์œผ๋กœ ํ† ํฐ๊ธฐ๋ฐ˜ ์ธ์ฆ๋ฐฉ์‹ ์•Œ๋ฆฌ๊ธฐ
      • https ์‚ฌ์šฉ
      • ์ฟ ํ‚ค์— ์ €์žฅํ•  ๊ฒฝ์šฐ sameSite: 'Strict' ์‚ฌ์šฉ
      • ์ˆ˜๋ช…์ด ์งง์€ access token ๋ฐœ๊ธ‰
      • url ํ† ํฐ ์ „๋‹ฌX
    • 3๏ธโƒฃ : access ํ† ํฐ ๋งŒ๋ฃŒ/์ƒˆ๋กœ๊ณ ์นจ์‹œ refresh ํ† ํฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด access ํ† ํฐ ์–ป์Œ

  • 3) JWT (JSON Web Token)

    • ํŠน์ง• : JSON ๊ฐ์ฒด๋กœ ์ธ์ฝ”๋”ฉ
    • ์‚ฌ์šฉ : ์ธ์ฆ, ์•”ํ˜ธํ™”์— ์‚ฌ์šฉ
    • ๊ตฌ์„ฑ : ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ, ์„œ๋ช…
    • Header
      • ์–ด๋–ค ๋ฐฉ๋ฒ•์˜ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ ์ •๋ณด
      • ํ† ํฐ ์œ ํ˜•๊ณผ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜, base64URI๋กœ ์ธ์ฝ”๋”ฉ๋จ
    • Payload
      • ์ธ์ฆ์ด ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ •๋ณด
      • ๋ฐ์ดํ„ฐ, ํ† ํฐ ๋ฐœ๊ธ‰์ž, ํ† ํฐ ์œ ํšจ๊ธฐ๊ฐ„, base64URI๋กœ ์ธ์ฝ”๋”ฉ๋จ
    • Signature
    • (์ธ์ฝ”๋”ฉ๋œ header + payload) + ๋น„๋ฐ€ํ‚ค ๊ธฐ๋ฐ˜์œผ๋กœ ํ—ค๋”์— ๋ช…์‹œ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋‹ค์‹œ ์ƒ์„ฑํ•œ ์„œ๋ช…๊ฐ’
  • 4) ์žฅ์ 

    • ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋˜๋ฉด ๋ชจ๋“  ์‹œ์Šคํ…œ์ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด์•ˆ ํ† ํฐ ๋ฐ›์Œ
    • ๋ณด์•ˆ ํ† ํฐ์€ ์ผ์ข…์˜ ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ๋กœ์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์„œ๋ฒ„๊ฐ„ API ์ƒํ˜ธ์ž‘์šฉ์„ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Œ
    • ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋Š” ๋ชจ๋‘ ํ† ํฐ์— ํฌํ•จ๋˜์–ด ๋ณ„๋„์˜ ์ธ์ฆ ์ €์žฅ์†Œ ํ•„์š”X
    • ๋‹ค๋ฅธ ์œ ํ˜•์˜ ํ† ํฐ(SAML)๊ณผ ๋น„๊ตํ•˜๋ฉด ์‚ฌ์ด์ฆˆโฌ‡๏ธ
    • ํ™•์žฅ์„ฑ, ๋””๋ฒ„๊น… ์„ฑ๋Šฅโฌ†๏ธ (๋””์ฝ”๋”ฉ์‹œ ์‰ฝ๊ฒŒ ์ง๋ ฌํ™”, ์—ญ์ง๋ ฌํ™” ๊ฐ€๋Šฅ)
  • 5) ๋‹จ์ 

    • ํ† ํฐ์ด ๋น„๋Œ€ํ•ด์งˆ ๊ฒฝ์šฐ ์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜์— ์˜ํ–ฅ
    • ํ† ํฐ์„ ํƒˆ์ทจ๋‹นํ•  ๊ฒฝ์šฐ ๋””์ฝ”๋”ฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๋ณผ ์ˆ˜ ์žˆ์Œ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– SAML (Security Assertion Markup Language)

  • ์ธ์ฆ(Authentication)/์ธ๊ฐ€(Authorization)
    โžก๏ธ SAMLAssertion ์•ˆ์— ์ธ์ฆ/๊ถŒํ•œ ์ •๋ณด
  • ์•„์ด๋ดํ‹ฐํ‹ฐ ๊ณต๊ธ‰์—…์ฒด(IdP)์—์„œ ์„œ๋น„์Šค ๊ณต๊ธ‰์—…์ฒด(SP)๋กœ ๊ถŒํ•œ ์ธ์ฆ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” XML๊ธฐ๋ฐ˜ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ ํฌ๋งท
  • SSO ๊ธฐ๋Šฅ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ฐ„ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ด๋ฃจ์–ด์ ธ 1๋ฒˆ์˜ ๋””์ง€ํ„ธ ์„œ๋ช…์œผ๋กœ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ด์šฉ
  • ์ธ์ฆ ํ”Œ๋กœ์šฐ
    • User : ์ธ์ฆ ์›ํ•˜๋Š” ์‚ฌ์šฉ์ž
    • Indentity Provider(IDP) : ์ธ์ฆ ์ •๋ณด ์ œ๊ณต์ž
    • Service Provider(SP) : ์„œ๋น„์Šค ์ œ๊ณต์ž

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– OAuth (Open Authorization)

  • ์ธ์ฆ(Authentication)/์ธ๊ฐ€(Authorization)
    โžก๏ธ Access Token ์•ˆ์— ๊ถŒํ•œ ์ •๋ณด
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์ž๊ฒฉ ์ฆ๋ช…์„ ๊ณต์œ ํ•˜์ง€ ์•Š๊ณ , ํƒ€์‚ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฐœ๋ฐฉํ˜• ์ธ์ฆ ํ‘œ์ค€
  • ์†Œ์…œ ๋ฏธ๋””์–ด ํ”Œ๋žซํผ์ด๋‚˜ API ๊ฐ™์€ ์™ธ๋ถ€ ์„œ๋น„์Šค์˜ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šค ํ•ด์•ผํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ
  • ์ธ์ฆ ํ”Œ๋กœ์šฐ
    • Resource Owner : ์ž์› ์†Œ์œ ์ž (User)
    • Client : ํด๋ผ์ด์–ธํŠธ (ex. 3rd party app)
    • Service Provider : ์„œ๋น„์Šค ์ œ๊ณต์ž
      - Resource Server : ์ž์› ์„œ๋ฒ„
      - Authorization Server : ๊ถŒํ•œ ์„œ๋ฒ„

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– OIDC (OpenID Connect)

  • ์ธ์ฆ(Authentication)/์ธ๊ฐ€(Authorization)
    โžก๏ธ ID Token ์•ˆ์— ์ธ์ฆ ์ •๋ณด
  • Access Token : Bearer ํ† ํฐ ํ˜•์‹
  • ID Toekn : JSON Web Toekn ํ˜•์‹
    (๋ˆ„๊ฐ€ ์ธ์ฆํ–ˆ๋Š”์ง€, ๋ฐœํ–‰์ž(issuer) ๋ˆ„๊ตฌ์ธ์ง€ ํ™•์ธ ๊ฐ€๋Šฅ)
  • ์ธ์ฆ ํ”Œ๋กœ์šฐ
  • 6) ์‹ค์Šต
    • ๋ชจ๋“ˆ ์„ค์น˜
      npm install express cookie-parser jsonwebtoken cors
    • ๋กœ๊ทธ์ธ์„ ํ•ด์„œ access token, refresh token ๋ฐœ๊ธ‰ ๋ฐ›์Œ
      // npm install express cookie-parser jsonwebtoken
      // ๋ณดํ†ต ์ด๋Ÿฐ ํ† ํฐ์— ๊ด€ํ•œ ๋‚ด์šฉ์€ ๋”ฐ๋กœ .env ํŒŒ์ผ์— ๋†“์Šต๋‹ˆ๋‹ค.
      // ์˜ˆ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•œํŒŒ์ผ์— ๋†“์Šต๋‹ˆ๋‹ค.
      // ํ† ํฐ์„ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋น„๋ฐ€ํ‚ค
      // ๋ฐ•์ข…์„ ๋ฐ”๋ณด๋ฉ์ฒญ์ด >> SHA256 >> 9e8821c8ef4ab43ba09310af54e98caedc13e314efdea720bf513b9b3675faf4 const ACCESS_TOKEN_SECRET= "9e8821c8ef4ab43ba09310af54e98caedc13e314efdea720bf513b9b3675faf4" const REFRESH_TOKEN_SECRET= "9e8821c8ef4ab43ba09310af54e98caedc13e314efdea720bf513b9b3675faf4"
      const PORT = 12010
      //๋ผ์šฐํŒ…์„ค์ •์„ ์‰ฝ๊ฒŒ, ๋ฏธ๋“ค์›จ์–ด ์„ค์ •์„ ์‰ฝ๊ฒŒ ๋„์™€์ฃผ๋Š” express ํ”„๋ ˆ์ž„์›Œํฌ
      const express = require('express');
      // ์ฟ ํ‚ค ํ•ธ๋“ค๋ง์„ ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ
      const cookieparser = require('cookie-parser');
      //jwt์— ๊ด€ํ•œ ๋กœ์ง์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ชจ๋“ˆ.
      const jwt = require('jsonwebtoken')
      // browser - postman์—์„œ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋˜๋ฉด CORS๊ฐ€ ๊ฑธ๋ฆฌ๋Š”๋ฐ ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ.
      // CORS์˜ ์ž์„ธํ•œ ์„ค๋ช…์€ ํฐ๋Œ์˜ ํ„ฐ์ „ - CORS๋ฅผ ์ฐธ๊ณ .
      const cors = require('cors')
      const app = express();
      // ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์„ค์ •
      app.use(cors())
      app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieparser());
      // DB์— ์žˆ๋Š” ์œ ์ € ์ •๋ณด๋ฅผ ํ‰๋‚ด๋‚ด๋Š” ๊ฐ์ฒด const userInfo = {
        username: 'kundol',
        password: '1234',
        email: 'kundol@gmail.com'
      }
      //ํ† ํฐ์„ ๋งŒ๋“ค ๋•Œ ์“ฐ๋Š” ์œ ์ € ๊ฐ์ฒด const user = {
        username: userInfo.username,
        email: userInfo.email
      }
      // ๋‘๊ฐœ์˜ ํ† ํฐ์— ๋Œ€ํ•œ ๋งŒ๋ฃŒ๊ธฐํ•œ ์˜ต์…˜ : accessํ† ํฐ์€ ์งง๊ฒŒ. refreshํ† ํฐ์€ ๊ธธ๊ฒŒ
      const accessOpt = {
        expiresIn: '10m'
      }
      const refreshOpt = { expiresIn: '1d'
      }
      // ์ฟ ํ‚ค ์˜ต์…˜
      const cookieOpt = {
        httpOnly: true,
        sameSite: 'Strict',
          secure: true,
        maxAge: 24 * 60 * 60 * 1000
      }
      const isAuthenticated = (req, res, next) =>{ if(!req.headers.authorization){
      return next('route') }
      let auth = req.headers.authorization
      if (auth.startsWith("Bearer ")){
      auth = auth.substring(7, auth.length);
      }
      const user = jwt.verify(auth, ACCESS_TOKEN_SECRET)
      //์ธ์ฆ๋œ ์œ ์ €๊ฐ€ ์žˆ๋‹ค๋ฉด ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋กœ. ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ๋‹ค์Œ ๋ผ์šฐํŒ…์œผ๋กœ. ์ œ์–ด๊ถŒ์„ ๋„˜๊ธด๋‹ค.
      if (user) return next()
      else return next('route') }
      app.get('/', isAuthenticated, function (req, res) { return res.status(200).send("ํ—ˆ์šฉ๋œ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.")
      })
      app.get('/', (req, res) =>{
      return res.status(401).send("ํ—ˆ์šฉ๋˜์ง€ ์•Š์€ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.") })
      app.post('/login', (req, res) => {
      const { username, password } = req.body; console.log(req.body)
      console.log(username, password)
      if (username === userInfo.username && password ===
      userInfo.password) {
      const accessToken = jwt.sign(user, ACCESS_TOKEN_SECRET,
      accessOpt);
      const refreshToken = jwt.sign(user, REFRESH_TOKEN_SECRET,
      refreshOpt);
      // cookie์—๋Š” refreshํ† ํฐ์„ ๋‹ด์Šต๋‹ˆ๋‹ค.
      // ์ดํ›„ ์š”์ฒญ์‹œ์— refreshํ† ํฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ accesstoken์„ ๊ฐฑ์‹ ๋ฐ›์Šต๋‹ˆ๋‹ค.
      console.log("jwtํ† ํฐ์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
              console.log(refreshToken)
            console.log(accessToken)
            res.cookie('jwt', refreshToken, cookieOpt);
      return res.json({ accessToken, refreshToken}); }
      else {
      //๋งŒ์•ฝ ์ธ์ฆ์„ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
      return res.status(401).json({message: "์ธ์ฆ๋˜์ง€ ์•Š์€
      ์š”์ฒญ์ž…๋‹ˆ๋‹ค."}); }
      })
      // accessํ† ํฐ ์š”์ฒญ ์ „์— ๋จผ์ € refresh ํ† ํฐ ์š”์ฒญ์„ ๋จผ์ € ํ•จ. app.post('/refresh', (req, res) => {
      console.log("REFRESH์š”์ฒญ") console.log(req.cookies) if (req.cookies.jwt) {
      const refreshToken = req.cookies.jwt; jwt.verify(refreshToken, REFRESH_TOKEN_SECRET, (err, decoded) => {
      if (err) {
      return res.status(401).json({ message: '์ธ์ฆ๋˜์ง€
      ์•Š์€ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.' }); }else {
                    console.log(decoded)
      const accessToken = jwt.sign(user, ACCESS_TOKEN_SECRET, accessOpt);
      return res.json({ accessToken }); }
      }) } else {
      return res.status(401).json({ message: "์ธ์ฆ๋˜์ง€ ์•Š์€ ์š”์ฒญ์ž…๋‹ˆ๋‹ค." });
      } })
      app.listen(PORT, () => {
      console.log(`์„œ๋ฒ„์‹œ์ž‘ : http://localhost:${PORT}`); console.log(`๋กœ๊ทธ์ธ์š”์ฒญ : http://localhost:${PORT}/login`); console.log(`refresh์š”์ฒญ : http://localhost:${PORT}/refresh`);
      })
      /*
      ์„œ๋ฒ„์‹œ์ž‘ : http://localhost:12010
      ๋กœ๊ทธ์ธ์š”์ฒญ : http://localhost:12010/login refresh์š”์ฒญ : http://localhost:12010/refresh {
        "username": "kundol",
        "password": "1234",
        "email": "kundol@gmail.com"
      }
      curl -X POST http://localhost:12010/refresh -H 'Content-Type:
      application/json' --cookie
      "jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Imt1bmRv
      bCIsImVtYWlsIjoia3VuZG9sQGdtYWlsLmNvbSIsImlhdCI6MTY3MjI3MzgxNSwiZX
      hwIjoxNjcyMzYwMjE1fQ.rAhD3tF11APHaSoxUp1F5DtNUte-5mt8HjawHoVVbns"
      */

๐Ÿ“• HTTP ์ƒํƒœ์ฝ”๋“œ

1. 1xx (์ •๋ณด)

  • ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ ๋ฐ›์Œ + ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ณ„์† ์ฒ˜๋ฆฌ (HTTP1.0 ์ดํ›„ ์ž˜ ์‚ฌ์šฉX)
    • 100 : ๊ณ„์†ํ•จ

2. 2xx (์„ฑ๊ณต)

  • ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ ์ž˜ ๋ฐ›์Œ + ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณด๋‚ธ ๊ฒƒ
    • 200 OK : ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ
    • 201 CREATED : ์š”์ฒญ์ด ์„ฑ๊ณต์  + ๊ทธ ๊ฒฐ๊ณผ ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ๋จ

3. 3xx (๋ฆฌ๋‹ค์ด๋ ‰์…˜)

  • ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ๋Œ€ํ•ด ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ์ž‘์—… ์กฐ์น˜ ํ•„์š”
    • 301 MOVED_PERMANENTLY : ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์˜ URI๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ (๋ณ€๊ฒฝ๋œ ์ƒˆ๋กœ์šด URI๋ฅผ reponse๋กœ ์ „๋‹ฌ)

4. 4xx (ํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜)

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†์Œ / ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ๋ฌธ๋ฒ• ์ž˜๋ชป๋˜์–ด ์š”์ฒญ ์ฒ˜๋ฆฌ ๋ชปํ•จ
    • 400 BAD_REQUEST : ์ž˜๋ชป๋œ ๋ฌธ๋ฒ•์œผ๋กœ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ดํ•ดํ•  ์ˆ˜ ์—†์Œ
    • 401 UNAUTHORIZED : ํด๋ผ์ด์–ธํŠธ์˜ ์ธ์ฆ์ด ๋˜์ง€ ์•Š์Œ
    • 403 FORBIDDEN : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฝ˜ํ…์ธ  ์ ‘๊ทผํ•  ๊ถŒ๋ฆฌ๋ฅผ ๊ฐ€์ง€์ง€X
    • 404 NOT_FOUND : ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ๋ฐ›์€ ์ปจํ…์ธ ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ

5. 5xx (์„œ๋ฒ„ ์˜ค๋ฅ˜)

  • ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํƒœ
    • 500 INTERNAL_SERVER_ERROR : ์„œ๋ฒ„์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Œ
    • 502 BAD_GATEWAY : ๊ฒŒ์ดํŠธ์›จ์ด/ํ”„๋ก์‹œ์„œ๋ฒ„๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊น€
    • 504 GATEWAY_TIMEOUT : ๊ฒŒ์ดํŠธ์›จ์ด/ํ”„๋ก์‹œ์„œ๋ฒ„๊ฐ€ ์ •ํ•ด์ง„ Timeout ์‹œ๊ฐ„๋™์•ˆ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•จ

6. ์‹ค์Šต

  • ์„ค์น˜
npm install express
  • ์ฝ”๋“œ
const express = require('express') const app = express()
const port = 3000
app.get('/', (req, res) => { res.status(401).send('์ธ์ฆ๋˜์ง€ ์•Š์€ ์š”์ฒญ์ž…๋‹ˆ๋‹ค.')
})
app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

๐Ÿ“• HTTP ๋ฉ”์„œ๋“œ

1. HTTP ๋ฉ”์„œ๋“œ ๊ฐœ๋…

  • ์ข…๋ฅ˜
    • GET
    • POST
    • PUT
    • HEAD
    • DELETE
    • PATCH
    • OPTIONS
    • CONNECT
    • TRACE

2. GET๊ณผ POST ์ฐจ์ด

  • GET : ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ

    • url ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ์š”๊ตฌ (๊ธธ์ด ์ œํ•œ 2000์ž ๋ฏธ๋งŒ)
      โžก๏ธ ํ•ด๋‹น ์š”์ฒญ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ก์— ๋‚จ์Œ
      โžก๏ธ ์š”์ฒญํ•  ๋•Œ ASCII ๋ฌธ์ž์—ด๋งŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ
    • ์„ฑ๊ณต์‹œ : HTTP ์ƒํƒœ์ฝ”๋“œ 200 ๋ฐ˜ํ™˜
    • ์˜ค๋ฅ˜์‹œ : 404(NOT_FOUND) ๋˜๋Š” 400(BAD_REQUEST) ๋ฐ˜ํ™˜
    • ์บ์‹ฑ ๊ฐ€๋Šฅ
    • ์‚ฌ์šฉ์ž ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด ์ „๋‹ฌ์‹œ ์‚ฌ์šฉX
  • POST : ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

    • url์ด ์•„๋‹Œ HTTP message body๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ „๋‹ฌ (๊ธธ์ด ์ œํ•œ ์—†์Œ)
      โžก๏ธ ํ•ด๋‹น ์š”์ฒญ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ก์— ๋‚จ์ง€ ์•Š์Œ
      โžก๏ธ ์š”์ฒญํ•  ๋•Œ ASCII ๋ฌธ์ž์—ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์ฒญ ๊ฐ€๋Šฅ
    • ์„ฑ๊ณต์‹œ : HTTP ์ƒํƒœ์ฝ”๋“œ 201 ๋ฐ˜ํ™˜ (์ƒ์„ฑํ•œ ๊ฒฝ์šฐ 201, ์ƒ์„ฑํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ 200)
    • ์บ์‹ฑ ๋ถˆ๊ฐ€๋Šฅ
    • ์‚ฌ์šฉ์ž ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด ์ „๋‹ฌ์‹œ ์‚ฌ์šฉ
  • ์‹ค์Šต

3. PUT๊ณผ PATCH ์ฐจ์ด

  • PUT : ๋ฐ์ดํ„ฐ ์ „์ฒด ์ˆ˜์ •
    • ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ๋ฐ์ดํ„ฐ ์ „์ฒด ๊ต์ฒด
    • ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์ƒ์„ฑ / ์žˆ์„ ๊ฒฝ์šฐ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ์™€ ๊ต์ฒด
    • ์„ฑ๊ณต์‹œ : ์ˆ˜์ •๋œ ๊ฒฐ๊ณผ๊ฐ’ ์ „๋‹ฌ
  • PATCH : ๋ฐ์ดํ„ฐ ์ผ๋ถ€ ์ˆ˜์ •
    • ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์ˆ˜์ •ํ•˜๋Š” ์ผ๋ถ€๋ถ„๋งŒ ๊ต์ฒด
    • ์„ฑ๊ณต์‹œ : ์ˆ˜์ •๋œ ๊ฒฐ๊ณผ๊ฐ’ ์ „๋‹ฌ
  • ์‹ค์Šต
// ์˜ˆ๋ฅผ ๋“ค์–ด email: "kundol@naver.com"์„ ์ˆ˜์ •ํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋–„ const obj = {
    "id": 2,
    "email": "kundol@naver.com",
    "first_name": "Janet",
    "last_name": "Weaver",
    "avatar": "https://reqres.in/img/faces/2-image.jpg"
}
const obj2 = {
    "email": "kundol@naver.com"
}
// PUT
const PutRequest = () => { fetch("https://reqres.in/api/users/2", {
      headers: {
        "Accept": "application/json",
        "Content-Type": "application/json"
    },
    method: "PUT",
    body: JSON.stringify(obj)
}).then(res => res.json())
.then(data => console.log(data))
PutRequest();
// PATCH                          
const PatchRequest = () => {
    fetch("https://reqres.in/api/users/2", {
            headers: {
};
        "Accept": "application/json",
        "Content-Type": "application/json"
    },
    method: "PATCH",
    body: JSON.stringify(obj2)
}).then(res => res.json())
.then(data => console.log(data))
PatchRequest();
/* {
  id: 2,
  email: 'kundol@naver.com',
  first_name: 'Janet',
  last_name: 'Weaver',
  avatar: 'https://reqres.in/img/faces/2-image.jpg',
  updatedAt: '2022-12-19T01:13:39.638Z'
}
{ email: 'kundol@naver.com', updatedAt: '2022-12-19T01:13:39.639Z'
}
*/

๐Ÿ“• OSI 7๊ณ„์ธต

1. PDU

2. ๊ณ„์ธต๋ณ„ ๋„คํŠธ์›Œํฌ ์žฅ์น˜

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต : L7 ์Šค์œ„์น˜
  • ์ „์†ก ๊ณ„์ธต : L4 ์Šค์œ„์น˜
  • ์ธํ„ฐ๋„ท ๊ณ„์ธต(๋„คํŠธ์›Œํฌ ๊ณ„์ธต) : ๋ผ์šฐํ„ฐ, L3 ์Šค์œ„์น˜
  • ๋ฐ์ดํ„ฐ๋งํฌ ๊ณ„์ธต : L2 ์Šค์œ„์น˜, ๋ธŒ๋ฆฌ์ง€
  • ๋ฌผ๋ฆฌ ๊ณ„์ธต : NIC, ๋ฆฌํ”ผํ„ฐ, AP

3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต

  • 1) ๊ฐœ๋…

    • ์‘์šฉ ํ”„๋กœ์„ธ์Šค์™€ ์ง์ ‘ ๊ด€๊ณ„ํ•˜์—ฌ ์„œ๋น„์Šค ์ˆ˜ํ–‰
    • ํ”„๋กœํ† ์ฝœ : HTTP, FTP, SMTP, POP3, IMAP, Telnet
  • 2) L7 ์Šค์œ„์น˜

    • IP์ฃผ์†Œ, TCP/UDP ํฌํŠธ ์ •๋ณด ๋ฐ ํŒจํ‚ท ๋‚ด์šฉ ์ฐธ์กฐํ•˜์—ฌ ์Šค์œ„์น˜
    • L4 ์Šค์œ„์น˜ ๊ธฐ๋Šฅ + ์ปจํ…์ธ  ๊ธฐ๋ฐ˜ ์ œ์–ด
    • ์„œ๋ฒ„ ์ด์ค‘ํ™”, ๋ณด์•ˆ์— ๊ฐ•์  (์›น ๋ฐฉํ™”๋ฒฝ ๋ฐ ๋ณด์•ˆ ์Šค์œ„์น˜์— ์‚ฌ์šฉ)
    • ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•˜๋Š” ๊ธฐ๊ธฐ (๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ)
      • IP, Port ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ url, ํ—ค๋”, ์ฟ ํ‚ค ๊ธฐ๋ฐ˜์œผ๋กœ ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ
    • ํ—ฌ์Šค์ฒดํฌ๋ฅผ ํ†ตํ•ด ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ์„œ๋ฒ„ ํ™•์ธ โžก๏ธ ํ•ด๋‹น ์„œ๋ฒ„๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ์—ญํ• 

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ํ—ฌ์Šค์ฒดํฌ

  • ์„œ๋ฒ„์˜ ์ •์ƒ/๋น„์ •์ƒ ์—ฌ๋ถ€ ํŒ๋ณ„
  • ์ „์†ก ์ฃผ๊ธฐ์™€ ์žฌ์ „์†ก ํšŸ์ˆ˜ ๋“ฑ์„ ์„ค์ •ํ•œ ํ›„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋ƒ„
  • L4 ๋˜๋Š” L7 ์Šค์œ„์น˜์— ์‚ฌ์šฉ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ์„œ๋ฒ„ ์ด์ค‘ํ™”

  • ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์˜ ๋Œ€ํ‘œ์  ๊ธฐ๋Šฅ
  • ์„œ๋น„์Šค๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ 2๋Œ€ ์ด์ƒ์˜ ์„œ๋ฒ„ ํ•„์ˆ˜์ 
  • ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์„œ๋ฒ„ 1๋Œ€ ์ข…๋ฃŒํ•ด๋„ ์•ˆ์ •์ ์œผ๋กœ ์šด์šฉ ๋ชฉ์ 

4. ์ „์†ก ๊ณ„์ธต

  • 1) ๊ฐœ๋…

    • ๋‘ ์ง€์ ๊ฐ„ ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ฃผ๊ณ ๋ฐ›๋Š” ์—ญํ•  (port ๋ฒˆํ˜ธ, ์ „์†ก๋ฐฉ์‹ ๊ฒฐ์ •)
    • ์—๋Ÿฌ ์ œ์–ด, ๊ฒฝ๋กœ ์ œ์–ด
    • ํ”„๋กœํ† ์ฝœ : TCP, UDP
  • 2) L4 ์Šค์œ„์น˜

    • IP์ฃผ์†Œ, TCP/UDP ํฌํŠธ ์ •๋ณด ์ฐธ์กฐํ•˜์—ฌ ์Šค์œ„์น˜
    • L3 ์Šค์œ„์น˜ ๊ธฐ๋Šฅ + ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ
    • ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•˜๋Š” ๊ธฐ๊ธฐ (๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ)
      • ํŒจํ‚ท์˜ IP์ฃผ์†Œ์™€ Port๋ฒˆํ˜ธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ
      • TCP, UDP ํ—ค๋”๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ํŒ๋‹จํ•ด์„œ ์Šค์œ„์นญ ํŒ๋‹จ ๊ฐ€๋Šฅ
    • ํ—ฌ์Šค์ฒดํฌ๋ฅผ ํ†ตํ•ด ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ์„œ๋ฒ„ ํ™•์ธ

5. ๋„คํŠธ์›Œํฌ ๊ณ„์ธต

  • 1) ๊ฐœ๋…

    • ๋ผ์šฐํ„ฐ๋ฅผ ํ†ตํ•ด ๊ฒฝ๋กœ ์„ ํƒ + ์ฃผ์†Œ ์ง€์ • + ํŒจํ‚ท ์ „๋‹ฌ
    • ๋‹จ์œ„ : packet
    • ์žฅ๋น„ : router
  • 2) ๋ผ์šฐํ„ฐ

    • ๋„คํŠธ์›Œํฌ์—์„œ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•˜๋Š” ์žฅ๋น„
    • ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ์— ์กด์žฌํ•˜๋Š” ์žฅ์น˜๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ ์ฃผ๊ณ  ๋ฐ›์„ ๊ฒฝ์šฐ โžก๏ธ ํŒจํ‚ท ์†Œ๋ชจ ์ตœ์†Œํ™”, ๊ฒฝ๋กœ ์ตœ์†Œํ™”
  • 3) L3 ์Šค์œ„์น˜

    • IP์ฃผ์†Œ ์ฐธ์กฐํ•˜์—ฌ ์Šค์œ„์น˜
    • L2 ์Šค์œ„์น˜ ๊ธฐ๋Šฅ + ๋ผ์šฐํŒ…
    • ๋ผ์šฐํŒ…ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•ด์„œ IPํŒจํ‚ท์— IP์ฃผ์†Œ๋ฅผ ๋‹ด์•„ ๋ณด๋ƒ„
    • ํŒจํ‚ท ๋ชฉ์ ์ง€ ์ฃผ์†Œ๊ฐ€ ๋ผ์šฐํŒ…ํ…Œ์ด๋ธ”์— ์—†์„ ๊ฒฝ์šฐ ํŒจํ‚ท ๋ฒ„๋ฆผ

6. ๋ฐ์ดํ„ฐ๋งํฌ ๊ณ„์ธต

  • 1) ๊ฐœ๋…
    • ์†ก์ˆ˜์‹ ๋˜๋Š” ์ •๋ณด์˜ ์˜ค๋ฅ˜์™€ ํ๋ฆ„์„ ๊ด€๋ฆฌํ•˜์—ฌ ํ†ต์‹ ์˜ ํ๋ฆ„์„ ๊ด€๋ฆฌ (ํ”„๋ ˆ์ž„์— MAC์ฃผ์†Œ ๋ถ€์—ฌ)
    • ์—๋Ÿฌ ๊ฒ€์ถœ, ์žฌ์ „์†ก, ํ๋ฆ„ ์ œ์–ด
    • ๋‹จ์œ„ : frame
    • ์žฅ๋น„ : bridge, switch, Ethernet
  • 2) L2 ์Šค์œ„์น˜
    • MAC address ์ฐธ์กฐํ•˜์—ฌ ์Šค์œ„์น˜
    • ์žฅ์น˜๋“ค์˜ MAC ์ฃผ์†Œ๋ฅผ MAC ์ฃผ์†Œ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ๊ด€๋ฆฌ
    • ๋„คํŠธ์›Œํฌ ๊ณ„์ธต์—์„œ ๋ฐ›์€ ํŒจํ‚ท์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋”๋„ทํ”„๋ ˆ์ž„ ๋งŒ๋“ค์–ด ๋ชฉ์ ์ง€MAC์ฃผ์†Œ๋กœ ํŒจํ‚ท ๋ณด๋‚ด์ฃผ๋Š” ์—ญํ• 
  • 3) ๋ธŒ๋ฆฌ์ง€
    • ๋‘ ๊ฐœ์˜ LAN์„ ์ƒํ˜ธ ์ ‘์† ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ†ต์‹ ๋ง ์—ฐ๊ฒฐ ์žฅ์น˜ (ํฌํŠธ๊ฐ„ ๋‹ค๋ฆฌ ์—ญํ• )
    • ํ†ต์‹ ๋ง์˜ ๋ฒ”์œ„ ํ™•์žฅ or ์„œ๋กœ ๋‹ค๋ฅธ LAN์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋‚˜์˜ ํ†ต์‹ ๋ง ๊ตฌ์ถ•

7. ๋ฌผ๋ฆฌ ๊ณ„์ธต

  • 1) ๊ฐœ๋…

    • ๋ฌด์„ LAN๊ณผ ์œ ์„ LAN์„ ํ†ตํ•ด 0/1๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋Š” ๊ณ„์ธต
    • ๋‹จ์œ„ : bit
    • ์žฅ๋น„ : repeater, hub, ํ†ต์‹  ์ผ€์ด๋ธ”
  • 2) NIC (Network Interface Card)

    • LAN ์นด๋“œ
    • 2๋Œ€ ์ด์ƒ์˜ ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
    • ๋„คํŠธ์›Œํฌ์™€ ๋น ๋ฅธ ์†๋„๋กœ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹  ํ•˜๋„๋ก PC์— ์„ค์น˜๋œ ํ™•์žฅ ์นด๋“œ
    • ์žฅ์น˜์— PC ๊ณ ์œ ์˜ ์‹๋ณ„๋ฒˆํ˜ธ(MAC ์ฃผ์†Œ) ์ €์žฅ
  • 3) ๋ฆฌํ”ผํ„ฐ

    • ๋“ค์–ด์˜ค๋ฉด์„œ ์•ฝํ•ด์ง„ ์‹ ํ˜ธ ์ฆํญํ•˜์—ฌ ๋‹ค๋ฅธ ์ชฝ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ์žฅ์น˜
    • ํŒจํ‚ท ๋” ๋ฉ€๋ฆฌ ๋ณด๋ƒ„
    • ๊ด‘์ผ€์ด๋ธ” ๋ณด๊ธ‰์œผ๋กœ ํ˜„์žฌ ์‚ฌ์šฉX
  • 4) AP (Access Point)

    • ํŒจํ‚ท์„ ๋ณต์‚ฌํ•˜๋Š” ์žฅ์น˜
    • AP์— ์œ ์„  LAN์„ ์—ฐ๊ฒฐํ•œ ํ›„ ๋‹ค๋ฅธ ์žฅ์น˜์—์„œ ๋ฌด์„  LAN๊ธฐ์ˆ (wifi ๋“ฑ)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด์„  ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– OSI 7๊ณ„์ธต vs TCP/IP 4๊ณ„์ธต

  • OSI 7๊ณ„์ธต : ๋„คํŠธ์›Œํฌ ์ „์†ก์˜ ๋ฐ์ดํ„ฐ ํ‘œ์ค€ ์ •๋ฆผ
  • TCP/IP 4๊ณ„์ธต : ์‹ค์ œ ์ธํ„ฐ๋„ท ํ†ต์‹ ์„ ๋ฐ˜์˜ํ•œ ์ธํ…Œ๋„› ํ‘œ์ค€

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ์œ ์„  LAN

  • ๋™์ถ•์ผ€์ด๋ธ”, ๊ด‘์ผ€์ด๋ธ” ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์œ ์„ LAN์„ ์ด๋ฃจ๋Š” ์ด๋”๋„ท์€ IEEE802.3 ํ”„๋กœํ† ์ฝœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ „์ด์ค‘ํ™” ํ†ต์‹ ์„ ์‚ฌ์šฉ
  • ๊ด‘์—ญ ํ†ต์‹ ๋ง ๊ธฐ์ˆ ์—๋„ ํ™œ์šฉ๋˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทผ๊ฑฐ๋ฆฌ ํ†ต์‹ ๋ง ๊ธฐ์ˆ 
  • โœ๏ธ IEEE802.3
    • ์—ฐ๊ฒฐ๋œ ์ด๋”๋„ท์—์„œ ๋ฌผ๋ฆฌ ๊ณ„์ธต, ๋ฐ์ดํ„ฐ๋งํฌ ๊ณ„์ธต์˜ ๋งค์ฒด ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์ •์˜ํ•˜๋Š” Working Group
    • ์ด๋”๋„ทํ”„๋ ˆ์ž„์„ ์–ด๋–ค ๊ตฌ์กฐ ๊ธฐ๋ฐ˜์ธ์ง€, ์ผ€์ด๋ธ”์˜ ์ตœ๋Œ€ ์ „์†ก๋Ÿ‰, ์–ด๋–ค ์ผ€์ด๋ธ”๋งŒ ๊ฐ€๋Šฅํ•œ์ง€ ๋“ฑ ์ •ํ•œ ๊ทœ์น™
  • โœ๏ธ ์ „์ด์ค‘ํ™” ํ†ต์‹  (Full Duplex)
    • ์–‘์ชฝ ์žฅ์น˜๊ฐ€ ๋™์‹œ์— ์†ก์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹
    • ์†ก์‹ ๋กœ, ์ˆ˜์‹ ๋กœ ๋‚˜๋ˆ ์„œ ๋ฐ์ดํ„ฐ ์ฃผ๊ณ ๋ฐ›์Œ
    • ํ˜„๋Œ€ ๊ณ ์† ์ด๋”๋„ท์˜ ๊ธฐ๋ฐ˜
  • โœ๏ธ CSMA/CD (Carrier Sense Multiple Access with Collision Detection)
    • ์ถฉ๋Œ ๊ฐ์ง€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ์ถฉ๋Œ ์—ฌ๋ถ€ ํ™•์ธ
    • IEEE 802.3 LAN์˜ ์ด๋”๋„ท ์ „์†ก ํ”„๋กœํ† ์ฝœ์—์„œ ์‚ฌ์šฉ
    • 1๏ธโƒฃ ํšŒ์„ ๊ฐ์ง€ : ์†ก์‹  ์ „์— ํšŒ์„ ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ (Carrier Sense)
    • 2๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ „์†ก : ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ์ƒ ๋ชจ๋“  ์ปดํ“จํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ ์ „์†ก์œ„ํ•ด ๋™์‹œ์— ์•ก์„ธ์Šค ์‹œ๋„ (Multiple Access)
    • 3๏ธโƒฃ ์ถฉ๋Œ ๋ฐœ์ƒ : ๋™์‹œ์— ๋ฐ์ดํ„ฐ ์ „์†กํ•  ๊ฒฝ์šฐ ์ถฉ๋Œ ๋ฐœ์ƒ ํ›„ ๋„คํŠธ์›Œํฌ ์ƒ์˜ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—๊ฒŒ ์ถฉ๋Œ ์•Œ๋ฆผ (Collision Detection)
    • 4๏ธโƒฃ ํšŒ์„  ๊ฐ์ง€: ์ถฉ๋Œ ์žˆ์„ ๊ฒฝ์šฐ ์ผ์ • ์‹œ๊ฐ„ ๋Œ€๊ธฐ ํ›„ ์žฌ์ „์†ก
    • CSMA๋ฐฉ์‹ ๋‹จ๋ง์˜ ์ฆ๊ฐ€์— ๋”ฐ๋ผ ๋™์‹œ ์ „์†ก(์ถฉ๋Œ)ํ•  ํ™•๋ฅ  ๋†’์•„์ง€๋Š” ๋ฌธ์ œ์  ๊ฐœ์„ 

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– ๋ฌด์„  LAN

  • IEEE802.11 ํ‘œ์ค€๊ทœ๊ฒฉ์„ ๋”ฐ๋ฅด๋ฉฐ ๋ฐ˜์ด์ค‘ํ™” ํ†ต์‹ ์„ ์‚ฌ์šฉ
  • ๋ฌด์„ ๋žœ, wifi ๋“ฑ ๋ฌด์„  ๊ทผ๊ฑฐ๋ฆฌ ํ†ต์‹ ๋ง์„ ์œ„ํ•œ ์ปดํ“จํ„ฐ ๋ฌด์„  ๋„คํŠธ์›Œํฌ์— ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ 
  • โœ๏ธ ๋ฐ˜์ด์ค‘ํ™” ํ†ต์‹  (Half Duplex)
    • ์–‘์ชฝ ์žฅ์น˜๋Š” ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋™์‹œ์—๋Š” ํ†ต์‹ X
    • ํ•œ ๋ฒˆ์— ํ•œ ๋ฐฉํ–ฅ๋งŒ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ์‹
    • ์žฅ์น˜๊ฐ€ ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด, ๋ฐ”๋กœ ์‘๋‹ตํ•  ์ˆ˜ ์—†๊ณ  ์ˆ˜์‹ ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
  • โœ๏ธ CSMA/CA (Carrier Sense Multiple Access with Collision Avoidance)
    • ์ถฉ๋Œ ํšŒํ”ผ ๊ธฐ๋Šฅ ์‚ฌ์šฉ
    • ์žฅ์น˜์—์„œ ๋ฐ์ดํ„ฐ ๋ณด๋‚ด๊ธฐ ์ „ Carrier ๊ฐ์ง€ ๋“ฑ์œผ๋กœ ์‚ฌ์ „์— ๊ฐ€๋Šฅํ•œ ์ถฉ๋Œ ๋ฐฉ์ง€
    • IEEE 802.11 ๋ฌด์„  ๋žœ ์ „์†ก ํ”„๋กœํ† ์ฝœ์—์„œ ์‚ฌ์šฉ
    • 1๏ธโƒฃ ํšŒ์„  ๊ฐ์ง€ : ์†ก์‹  ์ „์— ํšŒ์‹ ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ (Carrier Sense)
    • 2๏ธโƒฃ IFS ๋Œ€๊ธฐ : ์ฑ„๋„์ด idle ํ•ด๋„ IFS ๋™์•ˆ ๋Œ€๊ธฐํ•˜์—ฌ ์ „์†ก ๋Šฆ์ถฐ ์ถฉ๋Œ ํ”ผํ•จ
      • IFS(InterFrame Space) ํ”„๋ ˆ์ž„๊ฐ„ ๊ณต๊ฐ„
      • IFS ์ž‘์œผ๋ฉด ํ”„๋ ˆ์ž„ ์šฐ์„ ์ˆœ์œ„ ๋†’์Œ
    • 3๏ธโƒฃ Cotention Window ๋Œ€๊ธฐ
      • Contention Window๋Š” time-slot์œผ๋กœ ๋‚˜๋‰œ ์ผ์ • ์‹œ๊ฐ„
      • ์ „์†กํ•  ์ค€๋น„๊ฐ€ ๋œ ๋…ธ๋“œ๋Š” random ์ˆ˜(0~(2^k-1))๋งŒํผ ๋Œ€๊ธฐ ํ›„ ํ”„๋ ˆ์ž„ ์ „์†ก
      • ๋…ธ๋“œ๋Š” ๋งค time-slot ๋’ค์— ์ฑ„๋„ ๊ฐ์ง€
      • ํ•ด๋‹น ์‹œ๊ฐ„๋™์•ˆ busy ์ƒํƒœ๋ฉด ํƒ€์ด๋จธ ์ค‘์ง€ ํ›„ idle ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋‹ค์‹œ ํƒ€์ด๋จธ ์‹œ์ž‘
      • ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ ์žˆ์„ ๊ฒฝ์šฐ ํ”ผํ•จ (Collision Avoidcnace)
    • 4๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ „์†ก
      • ํ”„๋ ˆ์ž„ ์ œ๋Œ€๋กœ ๋ฐ›๊ณ  + ACK ์„ธ๊ทธ๋จผํŠธ ๋ฐ›์„ ๊ฒฝ์šฐ โžก๏ธ ์ข…๋ฃŒ
      • ํ”„๋ ˆ์ž„ ๋ฐ›์ง€ ๋ชปํ•  ๊ฒฝ์šฐ โžก๏ธ k = k + 1 ์œ„ ๊ณผ์ • ๋ฐ˜๋ณต (k๊ฐ€ ์ •ํ•ด์ง„ Kmax๋ณด๋‹ค ์ปค์ง€๋ฉด ํ•ด๋‹น ํ”„๋ ˆ์ž„ ์ „์†ก ๋ฒ„๋ฆผ)

๐Ÿ“• ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์œผ๋กœ ์ธํ•œ ์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

1. ์„œ๋ฒ„ ๊ณผ๋ถ€ํ•˜

  • 1) ๊ฐœ๋…
    • ์„œ๋ฒ„๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ์ง„ํ•˜์—ฌ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•จ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž์˜ ์›น์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•ด ์‘๋‹ต์—†์Œ์ด ๋œธ
  • 2) ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
    • ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ†ตํ•œ ์ž์› ํ• ๋‹น
    • ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ
    • ๋ธ”๋ž™์Šค์™„ ํ”„๋กœํ† ์ฝœ
    • ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค
    • ์ปจํ…์ธ  ๊ด€๋ฆฌ

2. ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ†ตํ•œ ์ž์› ํ• ๋‹น

  • 1) ์›์ธ

    • ์ž์›(CPU, ๋ฉ”๋ชจ๋ฆฌ, ๋Œ€์—ญํญ ๋“ฑ)์˜ ํ•œ๊ณ„์  ๋„๋‹ฌ
    • ๋ณดํ†ต ์„œ๋ฒ„์˜ CPU ์‚ฌ์šฉ๋Ÿ‰์ด 80~90%์— ๋„๋‹ฌํ•˜๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด ๊ณ„์† ์Šค์™€ํ•‘ํ•˜๋ฉด ๊ณผ๋ถ€ํ•˜
  • 2) ๋ชจ๋‹ˆํ„ฐ๋ง

    • ์„œ๋ฒ„ ๊ณผ๋ถ€ํ™”๋กœ ์ธํ•œ ์„œ๋ฒ„ ์ค‘์ง€ ๋Œ€์ฒ˜
      • ์–ด๋–ค ํŽ˜์ด์ง€์— ์–ด๋–ค ํŠธ๋ž˜ํ”ฝ์ด ์–ผ๋งˆ๋‚˜ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์ธ
      • ์–ด๋–ค ๋„คํŠธ์›Œํฌ์—์„œ ๋ณ‘๋ชฉํ˜„์ƒ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ํ™•์ธ
    • ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•˜๋ฉด ํŽ˜์ด์ง€ ํ™œ์šฉ๋„ ๋†’์€์ง€/๋‚ฎ์€์ง€ ํŒŒ์•…ํ•˜์—ฌ ์„œ๋น„์Šค ๊ฐœ์„ ์— ๋„์›€
    • ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ œ์  ํŒŒ์•…
    • cloudflare๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ ์„œ๋น„์Šค ์ค‘๋‹จ ์—ฌ๋ถ€๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ
  • 3) AWS ์˜คํ† ์Šค์ผ€์ผ๋ง

    • ์„œ๋น„์Šค ์ด์šฉ๋ถˆ๊ฐ€๋Šฅ ์ƒํƒœ ๋ฐœ์ƒ ์ด์ „ cloud watch๊ฐ€ ๊ณ„์† ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์„œ๋ฒ„ ๋Œ€์ˆ˜ ๋Š˜๋ ค์ฃผ๋Š” ๋ฐฉ๋ฒ•
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž๋™์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ž์›์˜ ์šฉ๋Ÿ‰์„ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•จ
  • 4) netdata๋ฅผ ์ด์šฉํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง

    • AWS ๋Œ€์ฒดํ•˜๋Š” ๋ฌด๋ฃŒ ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋น„์Šค
    • ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง, ์ž์›ํ• ๋‹น ํ•ด๊ฒฐ
    • slack๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์„ค์ •ํ•œ ์ž„๊ณ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์•Œ๋ฆผ์„œ๋น„์Šค ๊ตฌ์ถ• ๊ฐ€๋Šฅ

3. ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ

  • 1) ๊ฐœ๋…
    • ์„œ๋ฒ„ ์•ž๋‹จ์—์„œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์Šค ํ†ตํ•ด ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ
    • ํ•œ ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํŠธ๋ž˜ํ”ฝ์„ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ ์„œ๋ฒ„๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•˜์—ฌ ์‹œ์Šคํ…œ ์ค‘๋‹จ ๋ฐฉ์ง€

4. ๋ธ”๋ž™์Šค์™„ ํ”„๋กœํ† ์ฝœ

  • 1) ๋ธ”๋ž™์Šค์™„ ๊ฐœ๋…
    • ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ์‚ฌ๊ณ ๊ฐ€ ์ผ์–ด๋‚œ ๊ฒƒ
    • ์‚ฌํ›„์—๋Š” ์ด ์‚ฌ๊ณ ์˜ ์›์ธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‚ฌ์ „์—๋Š” ์‚ฌ๊ณ ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์Œ
  • 2) ๋ธ”๋ž™์Šค์™„ ๋ฐœ์ƒ์‹œ ์šด์˜ ์ˆ˜์น™
    • ์˜ํ–ฅ์„ ๋ฐ›์€ ์‹œ์Šคํ…œ๊ณผ ๊ฐ ์‹œ์Šคํ…œ์˜ ์ƒ๋Œ€์  ์œ„ํ—˜ ์ˆ˜์ค€์„ ํ™•์ธ
      • ์ฒด๊ณ„์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
      • ์›์ธ์— ๋Œ€ํ•œ ๊ฐ€์„ค์„ ์ˆ˜๋ฆฝํ•œ ํ›„ ํ…Œ์ŠคํŒ…
    • ์ž ์žฌ์ ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ถ€์˜ ๋ชจ๋“  ํŒ€์— ์—ฐ๋ฝ
    • ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ทจ์•ฝ์ ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ชจ๋“  ์‹œ์Šคํ…œ์„ ์—…๋ฐ์ดํŠธ
    • ๋ณต์› ๊ณ„ํš์„ ํฌํ•จํ•œ ์šฐ๋ฆฌ์˜ ๋Œ€์‘ ๊ณผ์ •์„ ํŒŒํŠธ๋„ˆ/๊ณ ๊ฐ ๋“ฑ ์™ธ๋ถ€์— ์ „๋‹ฌ

5. ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค

  • 1) ๊ฐœ๋…

    • ์„œ๋น„์Šค ์žฅ์• ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์—ฐ์‡„์ ์œผ๋กœ ์ƒ๊ธฐ๋Š” ์˜ค๋ฅ˜ ์ „ํŒŒ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋ฒ•
    • ์—ฐ์‡„์  ์žฅ์•  ์ „ํŒŒ ๋ง‰๊ธฐ ์œ„ํ•ด ์ž๋™์œผ๋กœ ์™ธ๋ถ€ ์„œ๋น„์Šค์™€ ์—ฐ๊ฒฐ์„ ์ฐจ๋‹จ/๋ณต๊ตฌ
    • ์„œ๋น„์Šค-์„œ๋น„์Šค๊ฐ„ ์„œํ‚ท๋ธŒ๋ ˆ์ด์ปค ๊ณ„์ธต์„ ๋‘ 
    • ์—ฐ์†์ ์ธ ์—๋Ÿฌ๋ฅผ ๋ง‰์•„ ์ผ๋ถ€ ์„œ๋น„์Šค ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์„œ๋น„์Šค ๋™์ž‘ ๊ฐ€๋Šฅ
  • 2) ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ๋™์ž‘๊ณผ์ •

  • ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋ฅผ ์„œ๋น„์Šค๊ฐ„ ์‚ฌ์ด์— ๋„ฃ๊ณ  ๊ด€๋ จ ํ•จ์ˆ˜๋“ค ๋ž˜ํ•‘

  • ๋„คํŠธ์›Œํฌ ์žฅ์• ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ํŠน์ • ์„œ๋น„์Šค๊ฐ€ timeou์œผ๋กœ ์„ค์ •๋œ ์‹œ๊ฐ„ ์ดˆ๊ณผํ•  ๊ฒฝ์šฐ

    • ๋ช‡๋ฒˆ์˜ ์š”์ฒญ์„ ํ•œ ์ดํ›„์—๋„ ๊ณ„์† timeout ์‹œ๊ฐ„์„ ์ดˆ๊ณผํ•˜๋ฉด ์žฅ์• ๋กœ ์ธ์‹ (์—๋Ÿฌ ๋ฐ˜ํ™˜)
  • ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๊ฐ€ trip ๋˜๋ฉฐ ๊ทธ ์ดํ›„ ์ถ”๊ฐ€์ ์ธ ํ˜ธ์ถœ์€ ๋ฐœ์ƒX (fail fast)

    • trip : ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค open ๋œ ์ƒํƒœ
    • closed ์ƒํƒœ๋ผ๋ฉด ๊ธฐ๋ณธ์ ์ธ ์š”์ฒญ ์ˆ˜ํ–‰ํ•˜๊ณ , open๋œ ์ƒํƒœ๋ผ๋ฉด ์š”์ฒญ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋น ๋ฅด๊ฒŒ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜
  • 3) ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ์ƒํƒœ

    • closed[์ •์ƒ] : ๋„คํŠธ์›Œํฌ ์š”์ฒญ์˜ ์‹คํŒจ์œจ์ด ์ž„๊ณ„์น˜๋ณด๋‹ค ๋‚ฎ์Œ
    • open[์˜ค๋ฅ˜] : ์ž„๊ณ„์น˜ ์ด์ƒ์˜ ์ƒํƒœ, ์š”์ฒญ์„ ์„œ๋น„์Šค๋กœ ์ „์†กํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜ (fail fast)
    • half_open[ํ™•์ธ์ค‘] : ์žฅ์• ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋Š” ์ง€ ํ™•์ธ์„ ์œ„ํ•ด ์š”์ฒญ์„ ์ „์†กํ•˜์—ฌ ์‘๋‹ต ํ™•์ธ (์žฅ์•  ํ’€๋ฆฌ๋Š”์ง€ ํ™•์ธ ํ›„ ์„ฑ๊ณต์‹œ closed, ์‹คํŒจ์‹œ open)
  • 4) ๊ตฌํ˜„

6. ์ปจํ…์ธ  ๊ด€๋ฆฌ

  • 1) ๋ถˆํ•„์š”ํ•œ ์ปจํ…์ธ  ์ œ๊ฑฐ

    • ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ ๋“ฑ ์ œ๊ฑฐ
      • ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ฟผ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ์ธ๋ฑ์Šค ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐœ์„ 
      • ๊ฐœ์„ ์ด ์•ˆ๋˜๋Š” ์ฟผ๋ฆฌ๋ผ๋ฉด ์ฐจ๋ผ๋ฆฌ ๊ธฐ๋Šฅ OFF
      • select *๋กœ ์กฐํšŒํ•˜๋˜ ์ฟผ๋ฆฌ์—์„œ ์‹ค์ œ ๊ธฐ๋Šฅ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์นผ๋Ÿผ ๋ชจ๋‘ ์ œ๊ฑฐ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์ธํ”„๋Ÿฐ์˜ ์žฅ์•  ๋ณต๊ตฌ ์‚ฌ๋ก€
      • ๊ณ ์šฉ๋Ÿ‰์˜ ์ปฌ๋Ÿผ์„ ๊ฐ•์˜ ๊ด€๋ จ ์ฟผ๋ฆฌ์—์„œ ์กฐํšŒ ํ•ญ๋ชฉ์— ํฌํ•จ์‹œ์ผœ ๊ฐ€์ ธ์˜ด
  • 2) CDN์„ ํ†ตํ•œ ์ปจํ…์ธ  ์ œ๊ณต

    • ๋ถ„์‚ฐ๋œ ๋Œ€๊ทœ๋ชจ ์„œ๋ฒ„ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•ด์„œ ์„œ๋ฒ„ ๋ถ€ํ•˜ ์ค„์ž„
    • CDN (Content Delivery Network) : ๋ถ„์‚ฐ๋œ ์„œ๋ฒ„๋ฅผ ์—ฐ๊ฒฐํ•œ ๋„คํŠธ์›Œํฌ
  • 3) ์ปจํ…์ธ  ์บ์‹ฑ

    • ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ(์ฟ ํ‚ค, ๋กœ์ปฌ์ €์žฅ์†Œ, ์„ธ์…˜์ €์žฅ์†Œ)๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์š”์ฒญ์— ๊ด€ํ•œ ํ•ญ๋ชฉ์„ ์บ์‹œ์—์„œ ์‘๋‹ต์„ ์ฝ์–ด ๋„คํŠธ์›Œํฌ ์š”์ฒญ์— ๊ด€ํ•œ ๋น„์šฉ์„ ๋ชจ๋‘ ์ œ๊ฑฐ
  • 4) ์ปจํ…์ธ  ์••์ถ•

    • ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฆฌ์†Œ์Šค๋Š” gzip ๋˜๋Š” Brotli ํ†ตํ•ด ์••์ถ•ํ•จ (70% ๊นŒ์ง€ ์••์ถ•)
    • ์••์ถ•์„ ํ’€๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„์—์„œ ์ž์›(CPU)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์–‘ ๊ณ ๋ ค ํ•„์š”
  • 5) ์ปจํ…์ธ  ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ์‘๋‹ต

    • ์‹œ์Šคํ…œ์˜ ๊ณผ๋„ํ•œ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š” ์ปจํ…์ธ  ๋ฐ ๊ธฐ๋Šฅ์ผ ์ผ์‹œ์ ์œผ๋กœ ์ค„์ž„
    • ๋ฐฉ์‹
      • ์ •์  ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€ ์ œ๊ณต
      • ๊ฒ€์ƒ‰ ๋น„ํ™œ์„ฑํ™”
      • ๋” ์ ์€ ์ˆ˜์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
      • ํ•„์ˆ˜์ ์ธ์ง€ ์•Š์€ ๊ธฐ๋Šฅ ๋น„ํ™œ์„ฑํ™”

๐Ÿ“• REST API

1. ๊ฐœ๋…

  • RESTfulํ•œ API

2. ํŠน์ง•

  • 1) Uniform-Interface

    • API์—์„œ ์ž์›๋“ค์€ ๊ฐ๊ฐ์˜ ๋…๋ฆฝ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง
    • ๊ฐ ์ž์›๋“ค์ด url ์ž์›์‹๋ณ„, ํ‘œํ˜„์„ ํ†ตํ•œ ์ž์›์กฐ์ž‘, Self-descriptive messages, HATEOAS ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง
    • ๋…๋ฆฝ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค : ์„œ๋กœ ์ข…์†์ ์ด์ง€ ์•Š์€ ์ธํ„ฐํŽ˜์ด์Šค
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์›นํŽ˜์ด์ง€๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค๊ณ  ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜์ง€X, HTTP ๋ช…์„ธ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์›นํŽ˜์ด์ง€ ์ž‘๋™์— ์˜ํ–ฅX
    • url ์ž์›์‹๋ณ„ : identification of resources
    • ์ž์›์€ url๋กœ ์‹๋ณ„๋˜์–ด์•ผ ํ•จ
    • ํ‘œํ˜„์„ ํ†ตํ•œ ์ž์›์กฐ์ž‘ : manipulation of resources through representation
    • url๊ณผ GET, DELETE ๋“ฑ HTTP ํ‘œ์ค€๋ฉ”์„œ๋“œ ๋“ฑ์„ ํ†ตํ•ด ์ž์›์„ ์กฐํšŒ, ์‚ญ์ œ ๋“ฑ ์ž‘์—…์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์•ผ ํ•จ
    • Self-descriptive messages : HTTP Header์— ํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ณ  ๊ฐ ๋ฉ”์‹œ์ง€(์ž์›)๋“ค์€ MIME types์— ๋งž์ถฐ ํ‘œํ˜„๋˜์–ด์•ผ ํ•จ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : .json์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด application/json์œผ๋กœ ๋ช…์‹œ
    • MIME types๋Š” ๋ฌธ์„œ, ํŒŒ์ผ ๋“ฑ ํŠน์„ฑ๊ณผ ํ˜•์‹์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ‘œ์ค€
    • IETF์˜ RFC6838์— ์ •์˜ ๋ฐ ํ‘œ์ค€ํ™” ๋˜์–ด ์žˆ์Œ
    • font/ttf, text/plain, text/csv
    • ๊ตฌํ˜„
      const express = require('express')
      const app = express()
      app.get('/good',(req, res) =>{
        res.status(200).json({"a" : 1})
      })
      app.get('/bad',(req, res) =>{ 
      res.setHeader('content-type', 'application/json'); // json()๋ฉ”์„œ๋“œ ์“ฐ๊ฒŒ ๋˜๋ฉด, application/json ํ˜•์‹
      res.send("ํฐ๋Œ์ด")
      })
      const server = app.listen(12010, () =>{
      console.log("์˜ค๋Š˜๋„ ์žฌ๋ฐŒ๋Š” CS๊ณต๋ถ€์„œ๋ฒ„ ~ : http://127.0.0.1:12010/good") })
    • HATEOAS ๊ตฌ์กฐ (Hypermedia As The Engine Of Application State)
    • ํ•˜์ดํผ๋งํฌ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋งˆ๋‹ค ์–ด๋–ค URL์—์„œ ์›ํ–ˆ๋Š”์ง€ ๋ช…์‹œํ•ด์ค˜์•ผ ํ•จ
    • href, links, link, url ์†์„ฑ ์ค‘ ํ•˜๋‚˜์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ URL์„ ๋‹ด์•„์„œ ํ‘œ๊ธฐ
    • _links ์†์„ฑ์— ๋‹ด๊ธฐ๋„ ํ•จ, ๋งํฌ๋ฅผ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ช… ์‚ฌ์šฉ
    • ๋™์ ์œผ๋กœ ๋งํฌ๋ฅผ ๋งŒ๋“ค๋ฉฐ href์†์„ฑ์„ ํ†ตํ•ด ์„ค์ •
    • rel์€ relation์œผ๋กœ ๋งํฌ์™€ ์š”์ฒญํ•œ ์ž์›๊ณผ์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ„
    • self : ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ๋‚˜ํƒ€๋ƒ„
    • ์ƒ์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ค€๋‹ค๋ฉด detail, ์ฑ…์„ ์‚ฌ๋Š” ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค๋ฉด buybook ๋“ฑ ๋“ค์–ด๊ฐ
      const express = require('express'); const app = express();
      const books = [
      { id: 1, title: '์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ’€์Šคํƒ MEVN', author: 'ํฐ๋Œ1'}, { id: 2, title: 'CS์ง€์‹๋…ธํŠธ', author: 'ํฐ๋Œ2'},
      { id: 3, title: '์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ด๋‚˜๋”๋ ˆ๋ฒจ', author: 'ํฐ๋Œ3'},
      ];
      app.get('/books', (req, res) => {
      const bookCollection = books.map((book) => ({
      ...book,
        links: [{ rel: 'self', href: `/books/${book.id}` }]
      }));
      res.status(200).json(bookCollection);
      });
      app.get('/books/:id', (req, res) => {
      const bookId = parseInt(req.params.id);
      const book = books.find((book) => book.id === bookId);
      if (book) {
      book.links = [{ rel: 'self', href: `/books/${book.id}` }]; res.status(200).json(book);
      } else {
      res.status(404).json({ error: 'Book not found' });
      } });
      app.listen(12010, () => { console.log('ํฐ๋Œ์ด์˜ ์ฑ…์„œ๋ฒ„ ์‹œ์ž‘ :
      http://127.0.0.1:12010/books');
      });
    • link ์†์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค์ •
    • ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋‹น link ํ•œ๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ ์—ฌ๋Ÿฌ๊ฐœ ๋‹น link ํ•œ๊ฐœ๋กœ ๊ฑธ ์ˆ˜ ์žˆ์Œ
      {"link":http://kundol.net/todos/{id}, "data":[{...}]}
    • ์‹ค์ œ github์—์„œ ์ œ๊ณตํ•˜๋Š” REST API, url ์†์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค์ •
      [ {
        "url":
      "https://api.github.com/repos/octocat/Hello-World/milestones/1",
        "html_url":
      "https://github.com/octocat/Hello-World/milestones/v1.0",
        "labels_url":
      "https://api.github.com/repos/octocat/Hello-World/milestones/1/lab
      els",
        "id": 1002604,
        "node_id": "MDk6TWlsZXN0b25lMTAwMjYwNA==",
        "number": 1,
        "state": "open",
        "title": "v1.0",
        "description": "Tracking milestone for version 1.0",
        "creator": {
          "login": "octocat",
          "id": 1,
          "node_id": "MDQ6VXNlcjE=",
          "avatar_url":
      "https://github.com/images/error/octocat_happy.gif",
          "gravatar_id": "",
          "url": "https://api.github.com/users/octocat",
          "html_url": "https://github.com/octocat",
          "followers_url":
      "https://api.github.com/users/octocat/followers",
          "following_url":
      "https://api.github.com/users/octocat/following{/other_user}",
          "gists_url":
      "https://api.github.com/users/octocat/gists{/gist_id}",
          "starred_url":
      "https://api.github.com/users/octocat/starred{/owner}{/repo}",
            "subscriptions_url":
      "https://api.github.com/users/octocat/subscriptions",
          "organizations_url":
      "https://api.github.com/users/octocat/orgs",
          "repos_url": "https://api.github.com/users/octocat/repos",
          "events_url":
      "https://api.github.com/users/octocat/events{/privacy}",
          "received_events_url":
      "https://api.github.com/users/octocat/received_events",
          "type": "User",
          "site_admin": false
        },
        "open_issues": 4,
        "closed_issues": 8,
        "created_at": "2011-04-10T20:09:31Z",
        "updated_at": "2014-03-03T18:58:10Z",
        "closed_at": "2013-02-12T13:22:01Z",
        "due_on": "2012-10-09T23:39:01Z"
      } ]
  • 2) Stateless

    • HTTP๊ฐ€ stateless์ด๊ธฐ ๋•Œ๋ฌธ์— HTTP ์ด์šฉํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๋งŒ์กฑ
    • REST API์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ์„œ๋ฒ„๋Š” ์„ธ์…˜(session)์„ ํ•ด๋‹น ์„œ๋ฒ„ ์ชฝ์— ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ
  • 3) Cacheable

    • HTTP๋Š” ์บ์‹ฑ ๊ฐ€๋Šฅ (cache-control = public ๊ธฐ๋ณธ, cache-control = no=store ์บ์‹ฑ ์•ˆ๋จ)
    • ์•„๋ฌด๋Ÿฐ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ž๋™์ ์œผ๋กœ ์บ์‹ฑ๋จ
    • ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๋ฉด 304๊ฐ€ ๋œจ๋ฉด์„œ ์›๋ž˜ ์žˆ๋˜ js์™€ css ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ด
    • HTTP ๋ฉ”์„œ๋“œ ์ค‘ GET์— ํ•œ์ •๋˜๋ฉฐ 'Cache-control:max-age=100(100์ดˆ)' ์ด๋Ÿฐ ํ˜•์‹์œผ๋กœ ํ•œ์ •๋œ ์‹œ๊ฐ„ ์ •ํ•จ
    • ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•œ์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด 'Last-modified'์™€ 'Etag'๋ผ๋Š” ํ—ค๋”๊ฐ’ ์‚ฌ์šฉ
    • 'Etag'๋Š” ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์— ํƒœ๊ทธ๋ฅผ ๋ถ™์—ฌ์„œ ์บ์‹ฑ๋˜๋Š” ์ž์›์ธ์ง€ ํ™•์ธํ•ด์คŒ
  • 4) Client-Server ๊ตฌ์กฐ

    • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ ๋…๋ฆฝ์ ์ธ ๊ตฌ์กฐ์—ฌ์•ผ ํ•จ
    • HTTP๋ฅผ ํ†ตํ•ด ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ
    • ์„œ๋ฒ„์—์„œ HTTP ํ‘œ์ค€๋งŒ ์ง€ํ‚จ๋‹ค๋ฉด ์›น์—์„œ๋Š” ๊ทธ์— ๋”ฐ๋ฅธ ํ™”๋ฉด์ด ์ž˜ ๋‚˜ํƒ€๋‚จ
    • ์„œ๋ฒ„๋Š” API๋ฅผ ์ œ๊ณตํ•˜๊ณ , API์— ๋งž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•จ
    • ํด๋ผ์ด์–ธํŠธ๋Š” HTTP๋กœ ๋ฐ›๋Š” ๋กœ์ง๋งŒ ์ž˜ ์ฒ˜๋ฆฌํ•จ
  • 5) Layered System

    • ๊ณ„์ธต๊ตฌ์กฐ๋กœ ๋‚˜๋ˆ ์ ธ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜
    • WEB๊ธฐ๋ฐ˜ ์„œ๋น„์Šค๋ฅผ ํ•˜๋ฉด ๊ณ„์ธต ์‹œ์Šคํ…œ ๊ตฌ์ถ•ํ•จ

2. URI ๊ทœ์น™

  • 1) ๋™์ž‘์€ HTTP ๋ฉ”์†Œ๋“œ๋งŒ ํ•ด์•ผํ•˜๊ณ  url์— ํ•ด๋‹น ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋จ
    • ์ˆ˜์ • = put, ์‚ญ์ œ = delete, ์ถ”๊ฐ€ = post, ์กฐํšŒ = get ์ด์šฉ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : /books/delete/1 ๊ธˆ์ง€
  • 2) .jpg, .png ๋“ฑ ํ™•์žฅ์ž ํ‘œ์‹œX
  • 3) ๋™์‚ฌ๊ฐ€ ์•„๋‹Œ ๋ช…์‚ฌ๋กœ ํ‘œ๊ธฐ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : '์œ ์ €๊ฐ€ ์ฑ…์„ ์†Œ์œ ํ•œ๋‹ค' ํ‘œํ˜„ํ•  ๊ฒฝ์šฐ
      • ์œ ์ €/์œ ์ €์•„์ด๋””/inclusion/์ฑ…/์ฑ…์•„์ด๋”” ๋กœ ํ‘œํ˜„
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : '์œ ์ €๊ฐ€ ์†Œ์œ ํ•œ ์•„ํŒŒํŠธ๋ฅผ ์กฐํšŒํ•œ๋‹ค' ํ‘œํ˜„ํ•  ๊ฒฝ์šฐ
      • /users/{userid}/aprst
  • 4) ๊ณ„์ธต์ ์ธ ๋‚ด์šฉ ๋‹ด๊ธฐ
  • 5) ๋Œ€๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ์†Œ๋ฌธ์ž๋กœ ์“ฐ๊ธฐ
    • ๋„ˆ๋ฌด ๊ธธ ๊ฒฝ์šฐ์— ์–ธ๋”๋ฐ”(_) ์•„๋‹Œ ํ•˜์ดํ”ˆ(-) ์‚ฌ์šฉ
  • 6) HTTP ์‘๋‹ต ์ƒํƒœ์ฝ”๋“œ๋ฅผ ํ™œ์šฉ
    • ์„ฑ๊ณต์‹œ์— 200
    • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ 301
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ๋„์„œ๊ด€ ์‹œ์Šคํ…œ REST API ์ƒ์„ฑ
app.get('/books')
// ๋ชจ๋“  ์ฑ…์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. app.post('/books/:booksid')
// ์ฑ…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. app.put('/books/:booksid')
// ์ฑ…์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. app.get('/books/:booksid')
// ํŠน์ • ์ฑ…์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. app.put('/users/:userid/books/:booksid') // ์–ด๋–ค ์œ ์ €๊ฐ€ ํŠน์ • ์ฑ…์„ ๋นŒ๋ฆฝ๋‹ˆ๋‹ค. app.patch('/users/:userid/books/:booksid') // ์–ด๋–ค ์œ ์ €๊ฐ€ ํŠน์ • ์ฑ…์„ ๋นŒ๋ฆฝ๋‹ˆ๋‹ค.
  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์ฟผ๋ฆฌ์ŠคํŠธ๋ง๊ณผ ํ˜ผํ•ฉํ•œ url
    • REST API๋Š” /๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์ง€๋งŒ, ์ ์ ˆํžˆ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ํ˜ผ์žฌํ•ด์„œ ์‚ฌ์šฉ
    • ๊ฒ€์ƒ‰, ํŽ˜์ด์ง€๋„ค์ด์…˜, ์ •๋ ฌ ๋“ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ๊ฑฐ๋‚˜ ๋ณต์žกํ•  ๋•Œ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง ์‚ฌ์šฉ
    • ์‹ค์ œ ์›Œ๋“œํ”„๋ ˆ์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” REST API (posts์˜ 2๋ฒˆ์งธ ๊ฒฐ๊ณผ๋ฌผ์„ ๋‚˜ํƒ€๋ƒ„) : /wp/v2/posts?page=2
    • ์‹ค์ œ KAKAO API : /oauth/token?grant_type=refresh_token&client_id=${REST_API_KEY}
    • ๋ฐ”๋ฒจ์ด ํ•„์š”ํ•œ ์šด๋™์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ : /api/v1/workouts?equipment=barbell
    • ๋ชจ๋“  ์šด๋™์ •๋ณด๋ฅผ ์ƒ์„ฑ๋‚ ์งœ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ : /api/v1/workouts?sort=-createdAt

๐Ÿ“• ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •

1. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •

  • 1) ๋ธŒ๋ผ์šฐ์ € ๊ตฌ์„ฑ

    • ๋ธŒ๋ผ์šฐ์ € ์—”์ง„
    • ๋ Œ๋”๋ง ์—”์ง„
    • ๋„คํŠธ์›Œํฌ ํ†ต์‹ ๋ถ€
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•ด์„๊ธฐ
    • UI ๋ฐฑ์—”๋“œ
    • ์ž๋ฃŒ์ €์žฅ์†Œ
  • 2) ๊ณผ์ •

    • ๋ Œ๋”๋ง ์—”์ง„์ด ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์„ ๋‹ด๋‹น
    • DOMํŠธ๋ฆฌ, CSSํŒŒ์„œ ๋“ฑ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ Œ๋”ํŠธ๋ฆฌ ๊ตฌ์ถ•ํ•ด ํ™”๋ฉด ๊ตฌ์ถ•

2. DOM ํŠธ๋ฆฌ์™€ CSSOM ํŠธ๋ฆฌ ๊ตฌ์ถ• (Parsing)

  • 1) ๊ณผ์ •

    • HTML ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ(DOM ํŠธ๋ฆฌ) ์ƒ์„ฑ
    • DOM ํŠธ๋ฆฌ๋Š” HTML element๋“ค์ด ํ•˜๋‚˜ํ•˜๋‚˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ
    • HTML ํŒŒ์‹ฑ ์ค‘ CSS ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” link/style ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด DOM ํŠธ๋ฆฌ ์ƒ์„ฑ ์ค‘๋‹จ
      โžก๏ธ CSS ํŒŒ์ผ์„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์š”์ฒญํ•˜๊ณ , HTML๊ณผ ๋™์ผํ•œ ํŒŒ์‹ฑ๊ณผ์ •์„ ๊ฑฐ์ณ CSSOM ํŠธ๋ฆฌ ์ƒ์„ฑ
    • CSS ํŒŒ์‹ฑ์„ ์ „๋ถ€ ์™„๋ฃŒํ•˜๋ฉด ๋‹ค์‹œ HTML ํŒŒ์‹ฑ ์žฌ๊ฐœ
  • 2) DOM ํŠธ๋ฆฌ ๊ตฌ์ถ•

    • html ํŽ˜์ด์ง€์˜ div, span ๋“ฑ ์š”์†Œ๊ฐ€ HTMLํŒŒ์„œ์— ์˜ํ•ด ๊ตฌ๋ฌธ ๋ถ„์„๋จ
    • ์š”์†Œ๋Š” ํ•˜๋‚˜ํ•˜๋‚˜๊ฐ€ ๋…ธ๋“œ๋กœ ์„ค์ •๋˜์–ด ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ์ €์žฅ
  • 3) CSSOM ํŠธ๋ฆฌ ๊ตฌ์ถ•

    • ๊ฐ ๋…ธ๋“œ๋Š” CSSํŒŒ์„œ์— ์˜ํ•ด ์ •ํ•ด์ง„ ์Šคํƒ€์ผ ๊ทœ์น™์ด ์ ์šฉ๋จ
    • DOMํŠธ๋ฆฌ ๊ตฌ์ถ•๊ณผ ๋™์‹œ์— ์ผ์–ด๋‚จ

3.๋ Œ๋”ํŠธ๋ฆฌ ์ƒ์„ฑ (Style)

  • DOM ํŠธ๋ฆฌ์™€ CSSOM ํŠธ๋ฆฌ๋ฅผ ์ˆœ์„œ์— ๋งž๊ฒŒ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ Œ๋”๊ฐ์ฒด (Render Object) ์ƒ์„ฑ

    • ๋žœ๋”๊ฐ์ฒด๊ฐ€ ๋ชจ์—ฌ ๋ Œ๋”ํŠธ๋ฆฌ ์ƒ์„ฑ
  • ๋ Œ๋” ํŠธ๋ฆฌ๋Š” ๋ ˆ์ด์•„์›ƒ์—์„œ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜์ง€ ์•Š๋Š” ์š”์†Œ๋Š” ํฌํ•จX

    • disply:none์ธ ์š”์†Œ
    • ์ƒ์†์ ์ธ ์Šคํƒ€์ผ์€ ๋ถ€๋ชจ ๋…ธ๋“œ์—๋งŒ ์œ„์น˜

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– display:none ์™€ visibility:hidden ์ฐจ์ด

  • display:none : ๋ Œ๋”ํŠธ๋ฆฌ์—์„œ ์‚ญ์ œ๋จ
  • visibility:hidden : ์š”์†Œ๋Š” ๋ณด์ด์ง€ ์•Š์ง€๋งŒ, ์‚ญ์ œ๋˜์ง€ ์•Š๊ณ  ๋ ˆ์ด์•„์›ƒ์— ๊ณต๊ฐ„ ์ฐจ์ง€ํ•จ

4. ๋ Œ๋” ํŠธ๋ฆฌ์˜ ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ ์œ„์น˜์™€ ํฌ๊ธฐ ๊ณ„์‚ฐ (Layout)

  • ๋ฃจํŠธ์—์„œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜์—ฌ ์‹ค์ œ ๊ธฐ๊ธฐ ํ™”๋ฉด์˜ ํฌ๊ธฐ์— ๋งž์ถฐ ๋…ธ๋“œ์˜ ์ •ํ™•ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ ๊ณ„์‚ฐ
    • ์ƒ๋Œ€์ ์ด์—ˆ๋˜ ์ธก์ •๊ฐ’์„ ํ™”๋ฉด์•ˆ์—์„œ์˜ ์ ˆ๋Œ€์ ์ธ ํ”ฝ์…€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •
    • ์ขŒํ‘œ๋Š” ๋ถ€๋ชจ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค์ •
  • ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์ด์ฆˆ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํฐํŠธ ๋ณ€๊ฒฝ์‹œ Global Layout ๋ฐœ์ƒ
    • Global Layout : ์ „์ฒด๋ฅผ Layout ํ•˜๋Š” ๊ฒƒ (๋ธŒ๋ผ์šฐ์ € ์‚ฌ์ด์ฆˆ๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ํฐํŠธ ์‚ฌ์ด์ฆˆ ์ปค์ง€๋ฉด ๋ณ€๊ฒฝ๋จ)

5. Render Object๋ฅผ ์ •ํ•ด์ง„ ๊ธฐ์ค€์— ๋”ฐ๋ผ Layer ๋‚˜๋ˆ” (Update Layer Tree)

  • ๋ Œ๋” ๋ ˆ์ด์–ด๊ฐ€ ์™„์„ฑ๋  ๋•Œ GPU์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ถ€๋ถ„์€ Graphic Layer๋กœ ๋ถ„๋ฆฌ
    • GPU ์ฒ˜๋ฆฌ ๋ถ€๋ถ„ : CSS3D/ video & canvas / filter / animation / tramsform : tranlateZ(0)
  • ๋‚˜๋จธ์ง€๋Š” Rander Layer๋กœ ๋ถ„๋ฆฌ

6. Layout ๋‹จ๊ณ„์—์„œ ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ์ด์šฉํ•ด ๊ฐ Layer๋ฅผ ํ™”๋ฉด์ƒ์—์„œ ์‹ค์ œ ํ”ฝ์…€๋กœ ๋ณ€ํ™˜ (Paint)

  • ํ”ฝ์…€๋งˆ๋‹ค ์ ์„ ์ฐ๋“ฏ ์น ํ•จ (๋ ˆ์Šคํ„ฐํ™”)
  • ํ”ฝ์…€๋กœ ๋ณ€ํ™˜๋œ ๊ฒฐ๊ณผ๋Š” ํ•˜๋‚˜์˜ ๋ ˆ์ด์–ด๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ ˆ์ด์–ด๋กœ ๊ด€๋ฆฌ๋จ

7. ๋ ˆ์ด์–ด ํ•ฉ์น˜๊ธฐ ๋ฐ ํ‘œ๊ธฐ (Composite Layer)

  • ๊ฐ๊ฐ ๋ ˆ์ด์–ด๋กœ๋ถ€ํ„ฐ ๋น„ํŠธ๋งต์ด ์ƒ์„ฑ๋˜๊ณ , GPU์— ํ…์Šค์ฒ˜๋กœ ์—…๋กœ๋“œ
  • ํ…์Šค์ฒ˜๋“ค์€ ์„œ๋กœ ํ•ฉ์ณ์ ธ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋กœ ๋ Œ๋”๋ง๋˜๋ฉฐ ํ™”๋ฉด์œผ๋กœ ์ถœ๋ ฅ

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– RenderํŠธ๋ฆฌ์™€ DOMํŠธ๋ฆฌ๋Š” 1:1 ๋Œ€์‘์ผ๊นŒ

  • NO
  • DOMํŠธ๋ฆฌ > ๋ Œ๋”๊ฐ์ฒด > ๋ Œ๋”ํŠธ๋ฆฌ ๋˜๋Š” ๊ณผ์ •์—์„œ display:none์œผ๋กœ ์‚ฌ๋ผ์ง€๋Š” ๋ Œ๋” ๊ฐ์ฒด(๋…ธ๋“œ)๋“ค์ด ์žˆ์–ด์„œ 1:1 ๋Œ€์‘ ์•ˆ๋จ

๐Ÿ“• www.naver.com์„ ์ณค์„ ๋•Œ ์ƒ๊ธฐ๋Š” ๊ณผ์ •

1. ๊ณผ์ •

  • 1) ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ, ์บ์‹ฑ, DNS, IP ๋ผ์šฐํŒ…, ARP, TCP ์—ฐ๊ฒฐ ๊ตฌ์ถ•์„ ๊ฑฐ์ณ ์ปจํ…์ธ  ์š”์ฒญ, ์‘๋‹ตํ•˜๋Š” TTFB(Time to First Byte)
  • 2) ์ปจํ…์ธ  ๋‹ค์šด๋ฐ›๊ณ , ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •์„ ๊ฑฐ์ณ ๋„ค์ด๋ฒ„ ํ™”๋ฉด ๋‚˜ํƒ€๋‚จ

2. ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

  • 1) ๊ฐœ๋…
    • 'URL์„ ๋‹ค์‹œ ๊ฐ€๋ฆฌํ‚จ๋‹ค'๋Š” ์˜๋ฏธ
    • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ URL์— ์‘๋‹ต์—์„œ ๋‹ค๋ฅธ URL๋กœ ์žฌ์ ‘์†ํ•˜๋ผ๊ณ  ๋ช…๋ น ๋ณด๋ƒ„
  • 2) ๊ณผ์ •
    • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์žˆ์œผ๋ฉด ์ง„ํ–‰ํ•˜๊ณ , ์—†์œผ๋ฉด ํ•ด๋‹น ์š”์ฒญ์— ๋Œ€ํ•œ ๊ณผ์ • ์ง„ํ–‰

3. ์บ์‹ฑ

  • 1) ๊ณผ์ •
    • ํ•ด๋‹น ์š”์ฒญ์ด ์บ์‹ฑ ๊ฐ€๋Šฅํ•œ์ง€/์•„๋‹Œ์ง€ ํŒŒ์ต
    • ์š”์ฒญ๋œ ๊ฐ’์˜ ์บ์‹ฑ๋œ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , ๊ทธ ๊ฐ’ ๋‹ค์‹œ ์š”์ฒญํ•  ๋•Œ ๋น ๋ฅด๊ฒŒ ์ œ๊ณต
    • ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ/๊ณต์œ  ํ”„๋ก์‹œ ์บ์‹œ๋กœ ๋‚˜๋‰จ
  • 2) ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ
    • ์ฟ ํ‚ค, ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ๋“ฑ ํฌํ•จํ•œ ์บ์‹œ
    • ๊ฐœ์ธ์บ์‹œ (private cache)
    • ์‚ฌ์šฉ์ž๊ฐ€ HTTP๋ฅผ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๋ธŒ๋ผ์šฐ์ € ์ž์ฒด์— ์ €์žฅ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : ์‚ฌ์ดํŠธ ์žฌ๋ฐฉ๋ฌธ์‹œ ์ปจํ…์ธ ๊ฐ€ ๋น ๋ฅด๊ฒŒ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ
  • 3) ๊ณต์œ  ํ”„๋ก์‹œ ์บ์‹œ
    • ์„œ๋ฒ„์—์„œ ํ”„๋ก์‹œ์„œ๋ฒ„๊ฐ€ ์บ์‹ฑ
    • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์— ์žˆ๊ณ , ์‚ฌ์šฉ์ž๊ฐ„์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์‘๋‹ต ์ €์žฅ
    • ์š”์ฒญํ•œ ์„œ๋ฒ„ ์•ž๋‹จ์— ํ”„๋ก์‹œ ์„œ๋ฒ„๊ฐ€ ์บ์‹ฑํ•˜๋Š” ๊ฒƒ
      • ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ๋‘ฌ์„œ ๋‚ด๋ถ€ ์„œ๋ฒ„๋กœ ํฌ์›Œ๋“œํ•จ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : Node.js(์›น์„œ๋ฒ„) ์•ž๋‹จ์— Nginx์„œ๋ฒ„(ํ”„๋ก์‹œ ์„œ๋ฒ„)๋ฅผ ๋‘ฌ์„œ ์บ์‹ฑ์„œ๋ฒ„๋กœ ์ด์šฉ

4. DNS

  • 1) DNS(Domain Name Server)
    • ๋„๋ฉ”์ธ๋ช…๊ณผ IP์ฃผ์†Œ๋ฅผ ๋งคํ•‘ํ•ด์ฃผ๋Š” ์„œ๋ฒ„
      • ๊ณ„์ธต์ ์ธ ๋„๋ฉ”์ธ ๊ตฌ์กฐ์™€ ๋ถ„์‚ฐ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ด์šฉํ•œ ์‹œ์Šคํ…œ
      • FQDN์„ ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ์ธ IP๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์‹œ์Šคํ…œ
    • ๋ฆฌ์กธ๋ฒ„์™€ ๋„ค์ž„์„œ๋ฒ„๋กœ ๊ตฌ์„ฑ
      • ๋ฆฌ์กธ๋ฒ„ : DNS๊ด€๋ จ ์š”์ฒญ์„ ๋„ค์ž„์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๊ณ , ํ•ด๋‹น ์‘๋‹ต๊ฐ’์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ
      • ๋„ค์ž„์„œ๋ฒ„ : ๋„๋ฉ”์ธ์„ IP๋กœ ๋ณ€ํ™˜
  • 2) ๊ณผ์ •
    • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญ IP ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•˜๋Š” ๋‹จ๊ณ„
    • FQDN์ธ www.naver.com ๋“ฑ์˜ ์ด๋ฆ„์„ DNS๋ฅผ ํ†ตํ•ด ์‹ค์ œ IP ์ฃผ์†Œ ํ™•์ธ
    • DNS์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ์บ์‹œ๋ฅผ ๋จผ์ € ํ™•์ธ ํ›„ ์บ์‹œ๋ฏธ์Šค์ผ ๊ฒฝ์šฐ ์š”์ฒญ
    • ๐Ÿ—’๏ธ ์˜ˆ์‹œ : www.naver.com์— DNS ์ฟผ๋ฆฌ๊ฐ€ ์˜ฌ ๊ฒฝ์šฐ
      • Root DNS โžก๏ธ .com DNS โžก๏ธ .naver DNS โžก๏ธ .www DNS
      • ๋งž๋Š” ์ฃผ์†Œ๋ฅผ ์ฐพ์•„ IP ์ฃผ์†Œ๋กœ ๋งคํ•‘

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“– FQDN (Fully Qualified Domain Name)

  • ํ˜ธ์ŠคํŠธ์™€ ๋„๋ฉ”์ธ์ด ํ•ฉ์ณ์ง„ ์™„์ „ํ•œ ๋„๋ฉ”์ธ ์ด๋ฆ„
    • ํ˜ธ์ŠคํŠธ : www ๋“ฑ
    • ๋„๋ฉ”์ธ : naver.com
  • 3) DNS ์บ์‹ฑ
    • ๋ฏธ๋ฆฌ ํ•ด๋‹น ๋„๋ฉ”์ธ ์ด๋ฆ„ ์š”์ฒญํ–ˆ์„ ๊ฒฝ์šฐ local PC์— ์ž๋™์ ์œผ๋กœ ์ €์žฅ๋จ
    • ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ๊ณผ OS์บ์‹ฑ์œผ๋กœ ๊ตฌ์„ฑ
      • ๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ : chrome://net-internals#dns
      • OS ์บ์‹ฑ : ipconfig/displaydns

5. IP ๋ผ์šฐํŒ…

  • ํ•ด๋‹น IP๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ IP ๋ผ์šฐํŒ…๊ณผ ARP ๊ณผ์ •์„ ๊ฑฐ์ณ ์‹ค์ œ ์„œ๋ฒ„๋ฅผ ์ฐพ์Œ

6. TCP ์—ฐ๊ฒฐ ๊ตฌ์ถ•

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ TCP 3-way handshake ๋ฐ SSL ์—ฐ๊ฒฐ ๋“ฑ ํ†ตํ•ด ์—ฐ๊ฒฐ ์„ค์ •
    • TCP ์—ฐ๊ฒฐ์€ HTTP/2 ๊นŒ์ง€ ์ผ์–ด๋‚จ
    • HTTP/3์€ QUIC๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์Œ
  • ์—ฐ๊ฒฐ ์„ค์ •๋œ ํ›„ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ํ•ด๋‹น ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต ๋ฐ›์Œ

7. ์ฝ˜ํ…์ธ  ๋‹ค์šด๋กœ๋“œ

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ์˜ ์‘๋‹ต ์ˆ˜์‹ 
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ์ปจํ…์ธ ๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋‹ค์šด๋ฐ›์Œ

8. ๋ธŒ๋ผ์šฐ์ €๋ Œ๋”๋ง

  • ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ์—”์ง„์ด ๋ธŒ๋ผ์šฐ์ €๋ Œ๋”๋ง ๊ณผ์ •์„ ๊ฑฐ์ณ ํ™”๋ฉด์„ ๋งŒ๋“ฆ

  • ๐Ÿ—’๏ธ ์˜ˆ์‹œ :

๐Ÿ“– ์ฐธ๊ณ  ๐Ÿ“–

  • โœ๏ธ

๐Ÿ“• ์ด๋”๋„ท ํ”„๋ ˆ์ž„

1. ๊ฐœ๋…

  • ๋ฐ์ดํ„ฐ๋งํฌ ๊ณ„์ธต์˜ ๋ฐ์ดํ„ฐ ๋‹จ์œ„
  • ์ด๋ฐ๋„› ํ”„๋ ˆ์ž„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

2. ๊ตฌ์„ฑ

  • Preamble[7๋ฐ”์ดํŠธ]
    • ์ด๋”๋„ท ํ”„๋ ˆ์ž„์ด ์‹œ์ž‘์ž„์„ ์•Œ๋ฆผ
  • SFD[1๋ฐ”์ดํŠธ]
    • Start Frame Delimiter
    • ๋‹ค์Œ ํ•„๋“œ๋กœ๋ถ€ํ„ฐ ์ฃผ์†Œํ•„๋“œ๊ฐ€ ์‹œ์ž‘๋จ์„ ์•Œ๋ ค์คŒ
  • Destination Address[6๋ฐ”์ดํŠธ]
    • ๋ชฉ์ ์ง€ ์ฃผ์†Œ
  • Source Address[6๋ฐ”์ดํŠธ]
    • ์‹œ์ž‘์ง€ ์ฃผ์†Œ
  • Ether Type[2๋ฐ”์ดํŠธ]
    • ๋ฐ์ดํ„ฐ๋งํฌ ๊ณ„์ธต ์œ„์˜ IP ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ (IPv4/IPv6)
  • Payload[๊ฐ€๋ณ€๋ฐ”์ดํŠธ]
    • ๋ฐ์ดํ„ฐ ๋˜๋Š” ํŽ˜์ด๋กœ๋“œ
    • ๊ฐ€๋ณ€๊ธธ์ด ํ•„๋“œ
    • ํ•ด๋‹น ํ•„๋“œ๋Š” ์ด์ง„๋ฐ์ดํ„ฐ(0/1)๋กœ ๊ตฌ์„ฑ
    • IEEE ํ‘œ์ค€์€ ์ตœ๋Œ€ ํŽ˜์ด๋กœ๋“œ๋ฅผ 1500 ๋ฐ”์ดํŠธ๋กœ ์ง€์ •ํ•จ
  • FCS[4๋ฐ”์ดํŠธ]
    • Frame Check Sequence
    • ์ˆ˜์‹ ์ธก์˜ ์—๋Ÿฌ๊ฒ€์ถœ์„ ์œ„ํ•ด ์‚ฝ์ž…๋˜๋Š” ํ•„๋“œ
    • CRC ์—๋Ÿฌ๊ฒ€์ถœ ๊ธฐ๋ฒ•์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๋น„ํŠธ๋ฐฐ์—ด์ด ๋‹ด๊น€
    • ๋น„ํŠธ๋ฐฐ์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์ƒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์—๋Ÿฌ ํ™•์ธ์‹œ์—๋Š” ํ•ด๋‹น ํ”„๋ ˆ์ž„ ํ๊ธฐํ•˜๊ณ  ์†ก์‹ ์ธก์— ์žฌ์ „์†ก ์š”๊ตฌ
profile
Notion์œผ๋กœ ์ด๋™ (https://24tngus.notion.site/3a6883f0f47041fe8045ef330a147da3?v=973a0b5ec78a4462bac8010e3b4cd5c0&pvs=4)

0๊ฐœ์˜ ๋Œ“๊ธ€