TIL 37: [Web Server] ๊ธฐ์ดˆ

์–ด์ œ ๋ชธ์ด ์ข€ ์•ˆ์ข‹์•˜์–ด์„œ ๊ณต๋ถ€ํ–ˆ๋˜ ๋‚ด์šฉ ์˜ค๋Š˜ ์ •๋ฆฌํ•ด์„œ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค!

States Airline์—์„œ ์ผ๋˜ ๋‚ด์šฉ ์ •๋ฆฌ ํ›„ ์ฟ ํ‚ค์™€ ์„ธ์…˜์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Sprint - States Airline Server

Express.js์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  1. ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด url์ด๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ™•์ธํ•  ๋•Œ
  2. POST ์š”์ฒญ ๋“ฑ์— ํฌํ•จ๋œ body(payload)๋ฅผ ์ˆœ์ˆ˜ node.js๋ณด๋‹ค ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌ์กฐํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  3. ๋ชจ๋“  ์š”์ฒญ/์‘๋‹ต์— CORS ํ—ค๋”๋ฅผ ๋ถ™์—ฌ์•ผ ํ•  ๋•Œ
  4. ์š”์ฒญ ํ—ค๋”์— ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ

Object ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ String ํ˜•ํƒœ๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ€์€ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

const jsonParser = express.json({strict:false})

express.json ์†์„ฑ ์ค‘ strict์˜ ๋””ํดํŠธ ๊ฐ’์€ true๋กœ ๋˜์–ด์žˆ์–ด Object๋งŒ ํ—ˆ์šฉ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

 

res.json ๊ณผ res.send([body])์˜ ์ฐจ์ด

๋‘˜์˜ ๊ณตํ†ต์ ์€ ํด๋ผ์ด์–ธํŠธ์˜ request์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์„œ response๋ฅผ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๋‹จ, send๋Š” json๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ข…๋ฅ˜์˜ ์ œํ•œ์ด ์ ์Šต๋‹ˆ๋‹ค.

 

CORS

์™œ ํ•„์š”ํ•œ๊ฐ€?

์„œ๋ฒ„๊ฐ€ ํ—ˆ์šฉํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์—๋งŒ ์‘๋‹ตํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž…๋‹ˆ๋‹ค.

 

์ž‘๋™์›๋ฆฌ

1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ OPTIONS/upper ๋ณด๋‚ด๊ณ ,

2. ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ 200 OK ๋ณด๋‚ด๊ณ  ์ด๋•Œ ๋งŒ์•ฝ Max-Age: 20์œผ๋กœ ๋˜์–ด์žˆ๋‹ค๋ฉด,
    3, 4๋ฒˆ ๊ณผ์ •์ด ๋ฐ˜๋ณต๋˜์–ด๋„ ์‹คํ–‰๋์–ด๋„ ์ด 10์ดˆ ๊ฑธ๋ ธ๋‹ค๋ฉด preflight ์•„์˜ˆ ์•ˆ๋ณด๋‚ด๋„ ๋ฉ๋‹ˆ๋‹ค.

3. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ POST /upper ๋ณด๋‚ด๊ณ ,

4. ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ 200 ๋ณด๋‚ด๊ณ , ์‚ฌ์ „์— ํ—ˆ์šฉํ–ˆ์–ด๋„ ์—ฌ์ „ํžˆ 'Access-Control-Allow-Origin'์€ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

 

์ฟ ํ‚ค (Cookie)

๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค์™€ ๊ฐ™์ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•ด์•ผํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ ์ ์  ๋งŽ์•„์ ธ, ์ •๋ณด๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์—†๋Š” ๋‹จ์ ์„ ๊ฐ€์ง„ HTTP์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ํ‚ค๋ผ๋Š” ๊ฐœ๋…์ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

์ฟ ํ‚ค(Cookie)๋ž€ ์›น์„œ๋ฒ„๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ง€์‹œํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ์ž‘์€ ๊ธฐ๋ก ์ •๋ณด ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์ด ์ฟ ํ‚ค์˜ ๋‚ด์šฉ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ™์€ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค ์ฝํžˆ๊ณ , ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ๊ธฐ๋กํ•˜๊ณ  ๋ถ„์„ํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ์ •๋ณด๋กœ ๊ฐฑ์‹ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€๋ฅผ ์‚ดํŽด๋ณด์ž๋ฉด, ๋จผ์ € ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ HTTP Request๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

์ดํ›„์— ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ Cookie ์ •๋ณด๋ฅผ ํฌํ•จํ•œ Response๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ๋‹ค์Œ ์š”์ฒญ์„ ์„œ๋ฒ„์—๊ฒŒ ์ „๋‹ฌํ•  ๋•Œ ์›น์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ Cookie๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค

์„œ๋ฒ„๋Š” Cookie ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  ๋™์ผ ์‚ฌ์šฉ์ž๋กœ ์ธ์ง€ํ•œ ํ›„ ์‘๋‹ต๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

 

์„ธ์…˜ (Session)

์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์ง€์†์ ์œผ๋กœ ์œ ์ง€์‹œ์ผœ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ฟ ํ‚ค์˜ ์žฅ์ ์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ ๋‹จ์ ์œผ๋กœ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณด์•ˆ์ด ์šฐ๋ ค๋˜๋Š” ๊ฒฝ์šฐ ์„ธ์…˜(Session)์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์„ธ์…˜์€ ์ฟ ํ‚ค์˜ ๋™์ž‘์›๋ฆฌ๋ž‘ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์ •๋ณด๋Š” Session ID์ด๊ณ , ๋‚˜๋จธ์ง€ ๋ณด์•ˆ์ ์œผ๋กœ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ์„œ๋ฒ„์— ์ง์ ‘ ์ €์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ๋งŒ ๋ณด๋ฉด ์„ธ์…˜์ด ๋ฌด์กฐ๊ฑด ์ฟ ํ‚ค๋ณด๋‹ค ์ข‹์•„๋ณด์ด์ง€๋งŒ, ์„ธ์…˜์˜ ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์žฅ๋‹จ์ ์„ ์ž˜ ์ด์šฉํ•ด์„œ ์ฟ ํ‚ค์™€ ์„ธ์…˜์„ ์ ์ ˆํžˆ ์„ž์–ด ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.