CORS, HTTP νŠΈλžœμž­μ…˜ πŸ’»

forhreverΒ·2023λ…„ 2μ›” 20일
0

πŸ“’ CORS λ™μž‘ 방식

  1. ν”„λ¦¬ν”ŒλΌμ΄νŠΈ μš”μ²­
  • μ‹€μ œ μš”μ²­μ„ 보내기 μ „, OPTIONS λ©”μ„œλ“œλ‘œ 사전 μš”μ²­μ„ 보내 ν•΄λ‹Ή 좜처 λ¦¬μ†ŒμŠ€μ— μ ‘κ·Ό κΆŒν•œμ΄ μžˆλŠ”μ§€λΆ€ν„° ν™•μΈν•˜λŠ” 것

    ν”„λ¦¬ν”ŒλΌμ΄νŠΈ μš”μ²­μ΄ ν•„μš”ν•œ 이유

    • μ‹€μ œ μš”μ²­μ„ 보내기 전에 미리 κΆŒν•œ 확인을 ν•  수 있기 λ•Œλ¬Έμ—, μ‹€μ œ μš”μ²­μ„ μ²˜μŒλΆ€ν„° ν†΅μ§Έλ‘œ λ³΄λ‚΄λŠ” 것보닀 νš¨μœ¨μ μ΄λ‹€.
    • CORS에 λŒ€λΉ„κ°€ λ˜μ–΄μžˆμ§€ μ•Šμ€ μ„œλ²„λ₯Ό λ³΄ν˜Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  1. λ‹¨μˆœ μš”μ²­
  • νŠΉμ • 쑰건이 만쑱 되면 ν”„λ¦¬ν”ŒλΌμ΄νŠΈ μš”μ²­μ„ μƒλž΅ν•˜κ³  μš”μ²­μ„ λ³΄λ‚΄λŠ” 것을 λ§ν•©λ‹ˆλ‹€.

    λ‹¨μˆœ μš”μ²­ 쑰건

    • GET, HEAD, POST μš”μ²­ 쀑 ν•˜λ‚˜λŠ” 쑴재
    • Accept, Accept-Language, Content-Language, Content-Type ν—€λ”μ˜ κ°’λ§Œ μˆ˜λ™μ„ μ„€μ •ν•  수 μžˆλ‹€.
  1. 인증 정보λ₯Ό ν¬ν•¨ν•œ μš”μ²­
  • μš”μ²­ 헀더에 인증 정보λ₯Ό λ‹΄μ•„ λ³΄λ‚΄λŠ” μš”μ²­

    CORS μ„€μ •

    • ν”„λ‘ νŠΈ μΈ‘ : μš”μ²­ 헀더 withCredentials : true
    • μ„œλ²„ μΈ‘ : 응닡 헀더 : Access-Control-Allow-Credentials : true
    • μ„œλ²„ μΈ‘μ—μ„œ Access-Control-Allow-Origin을 μ„€μ • ν•  λ•Œ, λͺ¨λ“  좜처λ₯Ό ν—ˆμš©ν•œλ‹€λŠ” 뜻의 (*)둜 μ„€μ •ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒ, 좜처 μ •ν™•ν•˜κ²Œ ν‘œκΈ°

πŸ“’ HTTP νŠΈλžœμž­μ…˜ ν•΄λΆ€

https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/

μ„œλ²„ 생성

  • λͺ¨λ“  node μ›Ή μ„œλ²„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ›Ή μ„œλ²„ 객체λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. createServer 이용
const http = require('http');

const server = http.createServer((request, response) => {
// μž‘μ—… μ‹€ν–‰
});

μš”μ²­ λ°”λ””

  • POSTλ‚˜ PUT μš”μ²­μ„ 받을 λ•Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μš”μ²­ λ°”λ””λŠ” μ€‘μš”ν•˜λ‹€.
  • ν•Έλ“€λŸ¬μ— μ „λ‹¬λœ request κ°μ²΄λŠ” ReadableStream μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³  μžˆλ‹€.
  • 슀트림의 β€˜data’와 β€˜end’ μ΄λ²€νŠΈμ— 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό λ“±λ‘ν•΄μ„œ 데이터λ₯Ό 받을 수 μžˆλ‹€.
  • 각 β€˜data’ μ΄λ²€νŠΈμ—μ„œ λ°œμƒμ‹œν‚¨ μ²­ν¬λŠ” Buffer이닀.
let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // μ—¬κΈ°μ„œ `body`에 전체 μš”μ²­ λ°”λ””κ°€ λ¬Έμžμ—΄λ‘œ λ‹΄κ²¨μžˆμŠ΅λ‹ˆλ‹€.
});

HTTP μƒνƒœμ½”λ“œ

  • λ”°λ‘œ μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ μ‘λ‹΅μ˜ HTTP μƒνƒœ μ½”λ“œλŠ” 항상 200이닀.
response.statusCode = 404; // ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ¦¬μ†ŒμŠ€λ₯Ό 찾을 수 μ—†λ‹€κ³  μ•Œλ €μ€λ‹ˆλ‹€.

과제 - Mini Node Server πŸ”—

basic-server.js

const server = http.createServer((request, response) => {
  // CORS κ΄€λ ¨ 헀더λ₯Ό OPTIONS 응닡에 μ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  if (request.method === 'OPTIONS') { 
    response.writeHead(200, defaultCorsHeader);
    response.end();
    return;
  }

  let body = [];
  if(request.method === 'POST' && request.url === '/lower') { 
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      body = Buffer.concat(body).toString().toLowerCase();
      response.writeHead(200, defaultCorsHeader);
      response.end(body);
      return;
    });
  }
  if(request.method === 'POST' && request.url === '/upper') {
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      body = Buffer.concat(body).toString().toUpperCase();
      response.writeHead(200, defaultCorsHeader);
      response.end(body);
      return;
    });
  } 
  else {
    response.statusCode = 404;
    response.end();
  }
}).listen(PORT, ip, () => {
  console.log(`http server listen on ${ip}:${PORT}`);
});

const defaultCorsHeader = {
  'Access-Control-Allow-Origin': '*',
  'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
  'Access-Control-Allow-Headers': 'Content-Type, Accept',
  'Access-Control-Max-Age': 10
};
// CORS κ΄€λ ¨ 헀더λ₯Ό OPTIONS 응닡에 μ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  if (request.method === 'OPTIONS') { 
    response.writeHead(200, defaultCorsHeader);
    response.end();
    return;
  }
let body = [];
  if(request.method === 'POST' && request.url === '/lower') { 
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      body = Buffer.concat(body).toString().toLowerCase();
      response.writeHead(200, defaultCorsHeader);
      response.end(body);
      return;
    });
  }

if(request.method === 'POST' && request.url === '/upper') {
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      body = Buffer.concat(body).toString().toUpperCase();
      response.writeHead(200, defaultCorsHeader);
      response.end(body);
      return;
    });
} else {  // elseμ—μ„œ statusCode μ—λŸ¬ν‘œμ‹œ
    response.statusCode = 404;
    response.end();
} 
  • μš”μ²­ λ©”μ„œλ“œ POST , URL = /upper
  • μœ„ 쑰건이 μ•„λ‹Œ 경우 404 응닡
response.writeHead(200, defaultCorsHeader);
  • 이전 μš”μ²­μ— λŒ€ν•œ λ‚΄μš©μ„ κΈ°μ–΅ν•˜μ§€ λͺ» ν•˜κΈ° λ•Œλ¬Έμ— 맀번 μš”μ²­ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.
profile
개발자 μ„±μž₯ 계단 μ˜¬λΌκ°€κΈ°

0개의 λŒ“κΈ€