2022-06-02(목) TIL

황인호·2022년 6월 7일
0

TIL 모음

목록 보기
66/119

오늘해야할일

  • 영상 촬영 ppt 수정 [완료]

  • 영상 촬영 대본 수정 [완료]

  • 피드백 바탕으로 영상재촬영 [완료]

  • jest 사용

  • 인프런 강의 다시 들어보기

  • 내가 Node.js를 사용하는 이유

  • 내가 Express를 사용하는 이유

  • 내가 MySQL을 사용하는 이유a

  • 내가 사용하는Node.js 란?

    Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다.

    즉, 노드를 통해 다양한 자바스크립트 애플리케이션을 실행할 수 있으며, 서버를 실행하는데 제일 많이 사용된다.

    • Node.js는 JavaScript를 서버에서도 사용할 수 있도록 만들어진 프로그램이다.

    • Node.js는 V8이라는 JavaScript 엔진 위에서 동작하는 자바스크립트 런타임(환경)이다.

    • Node.js는 서버사이트 스크립트 언어가 아니다. 프로그램(환경)이다.

    • Node.js는 웹서버와 같이 확장성 있는 네트워크 프로그램을 제작하기 위해 만들어졌다.

      Node.js는 확장성이 있는 네트워크 어플리케이션 개발에 사용되는 소프트웨어 플랫폼이다.

      특히 서버사이트에서 많이 사용되고 있다.

      사용되는 언어로는 자바스크립트(JavaScript)를 활용하며, Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있는 것이 특징이다.

      내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도 소프트웨어 없이 동작하는 것이 가능하며, 이를 통한 웹서버의 동작에 있어 더 많은 통제에서 벗어나 여러 가지 기능을 가능하게 한다.

      🎈자바스크립트 런타임

    • 런타임이란 특정 언어로 만든 프로그램을 실행할 수 있는 환경을 뜻한다.

    • 다라서 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있게 하는 자바스크립트 실행기 이다.

    • 특히 2008년 구글이 V8 엔진을 사용하여 크롬을 출시했고 V8 엔진은 다른 자바스크립트 엔진과 달리 매우 빨라 라이언 달은 2009년 V8 엔진 기반의 노드 프로젝트를 시작하며 세상에 나왔다.

      🎉이벤트 기반

    • 노드는 V8과 더불어 libuv라는 라이브러리를 사용한다.

    • libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O모델을 구현하고 있다.

    • 이벤트 기반(Event-driven)이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다.

    • 즉, 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두고, 이를 이벤트 리스너에 콜백함수를 등록한다.

    • 이후 이벤트가 발생하면 리스너에 등록해둔 콜백함수를 호출하며, 이벤트가 끝난 후 노드는 다음 이벤트가 발생할 때까지 대기한다.

      이벤트 루프

    • 이벤트 루프(event loop)는 여러 이벤트가 동시에 발생했을때 어떤 순서로 콜백함수를 호출 할지를 이벤트 루프가 판단한다.

    • 노드는 이벤트가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loop)라고 부른다.

      Untitled

      🎁논 블로킹 I/O

    • 이벤트 루프를 잘 활용하면 오래 걸리는 작업을 효율적으로 처리할 수 있다.

    • 작업에는 두 가지 종류가 있는데 동시에 실행될 수 있는 작업과 동시에 실행될 수 없는 작업이다.

    • 특히 파일 시스템 접근, 네트워크를 통한 요청 작업은 입력(Input) / 출력(Output)의 일종이며, 이러한 작업을 할 때 노드는 비동기 방식으로 블로킹을 만들지 않게 끔(논 블로킹) 처리한다.

    • 비동기이란 이전 작업이 완료될 때까지 대기하지 않고 동시에 작업을 수행한다.

    • 반대로 동기는 이전 작업이 끝나야만 다음 작업을 수행한다.

    • 자세하게 풀어서 이야기하면 함수 호출 시 당장 실행하는 것이 아니라(동기→블로킹) 일단 어느 곳에 쌓아 놓고 동시에 요청을 처리하고(비동기→논 블로킹) 요청이 완료된 순서대로처리(스택 이용)한다는 말이다.

      🎨싱글 스레드

      이벤트 기반, 논 블로킹 모델과 더불어 노드를 설명하는 키워드 중 하나는 싱글 스레드이다.

      자바스크립트 코드는 동시에 실행될 수 없는데 그 이유는 노드가 싱글 스레드 기반이기 때문이다.

    • 프로세스 : 운영체제에서 할당하는 작업의 단위이다. 노드나 웹 브라우저 같은 프로그램은 개별적인 프로세스이다. 프로세스간에는 메모리 등의 자원을 공유하지 않는다.

    • 스레드 : 스레드는 프로세스 내에서 실행되는 흐름의 단위이다. 프로세스는 스레드를 여러 개 생성해 여러 작업을 동시에 처리할 수 있다. 스레드들은 부모 프로세스의 자원을 공유한다. 같은 주소의 메모리에 접근 가능하므로 데이터를 공유할 수 있다.

      Node.js는 싱글스레드, 논 블로킹 모델로 싱글 스레드가 혼자서 일을 처리하지만 들어오는 요청 순서가 아닌 논 블로킹 방식으로 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행한다.

  • 내가 Node.js를 사용하는 이유

    배우기 간단하고 수많은 프레임워크를 가지고 있고 Node를 구글에서 관리하기때문에 빠르다.

    여러가지 모듈이 공유되어있습니다.

  • 내가 Express를 사용하는 이유

    가장 큰 이유는 가볍게 웹서버를 구축할수있기 때문이다.

    기존의 다른 프레임워크와는 다르게 Express는 아주 간단하게 구현 할 수 있다

  • **socket.io에 대해서**

    socket.io는 오래된 버전의 웹브라우저는 websocket을 지원하지 않는 경우가 있기 때문에 이때 http를 이용해 실시간 통신을 흉내내는것입니다.

    socket.io는 자바스크립트를 이용하여 브라우저 종류와 상관없이 실시간 웹을 구현할 수 있도록 한 기술입니다.

    socket.io는 node.js 기반으로 만들어진 기술
    ——————————————————————————————————————————

    polling 클라이언트가 평범한 http request를 서버로 계속 날려서 이벤트 내용을 전달받는 방식이다.

    가장 쉬운 방법이지만 클라이언트가 계속적으로 request 를 날라기 때문에 클라이언트가 많아지면 서버의 부담이 급증하게 된다.

    http request connection을 맺고 끊는 것 자체가 부담이 많은 방식이다.

    그리고 클라이언트에서 실시간정도의 빠른 응답을 기대하기도 어렵다.

    polling은 http 오버헤드가 발생한다는 단점이 있다.

    하지만 일정하게 갱신되는 서버 데이터의 경우 유용하게 사용할 수 있는 방식이다.

    오버헤드란 처리시간 및 메모리 등이 추가적으로 사용되는 현상을 말한다.


    long polling 서버측에서 접속을 열어두는 시간을 길게하는 방식.

    클라이언트로 request를 받으면 서버에서 클라이언트로 전달할 이벤트가 있는 순간까지 기다리다가 그 순간 response 메시지를 전달하면서 연결이 종료됨

    이벤트 간격이 좁다면 polling과 별차이가 없게되며 다수의 클라이언트에게 동시에 이벤트가 발생할경우 서버의 부담이 급증하게 된다.


    websocket

    기존 http 요청 응답 방식은 요청한 클라이언트에만 응답이 가능했는데 ws프로토콜을 통해 웹소켓 포트에 접속해 있는 모든 클라이언트에게 이벤트 방식으로 응답한다.

    최초접속이 http request를 통해 이루어 지기 때문에 기존의 80,443포트로 접속을 하므로 추가로 방화벽을 열지 않고도 양방향 통신이 가능하고 http 규격인 cors적용이나 인증등의 과정을 기존과 동일하게 가져갈수 있다는 장점이있다.

  • helmet를 사용한 이유

    Express 사용시 헤더의 설정을 통하여 웹 취약점으로부터 서버를 보호해주는 보안 모듈이라서 사용하였습니다.

    기능에 대한 설명

    1. CSP : Content-Sesurity-Policy 헤더를 설정해서 XSS나 교차사이트 인젝션등을 방지한다.
      다른사이트의 script를 불러오는것도 막기때문에 헬멧 적용전 별도로 설정이 필요하다.

    2. dnsprefetchControl : 도메인이 미리로딩되는 Prefetch에 대해 컨트롤 하기위해 X-DNS-Prefetch-Control 헤더를 설정한다.

    3. expectCt : 잘못 발급된 SSL인증서를 완화한다.

    4. frameguard : X-Fram-Options를 설정하며 클릭재킹의 공격을 방지한다.

    5. HidePowerdBy : 응답 헤더에 있는 X-Powerd-By에 서버 소프트웨어가 표기되는데 이를 숨겨준다. 나는 Express 표기

    6. hsts : http보다 https를 선호하도록 지시하는 Strict-Transport-Security 헤더를 설정한다. => 기본 false

    7. ieNoOpen : IE8 이상에 대해 X-Download-Options 설정한다.

    8. noSniff : X-Content-Type-Options를 설정하여 MIME유형 스니핑을 방지한다.

    9. permittedCrossDomainPolicies : 일부 클라이언트간에 도메인 간 콘텐츠 로드에 대해 도메인 정책을 알려주는 헤더 X-Permitted-Cross-Domain-Policies를 설정한다

    10. xssFilter : X-XSS-Protection헤더를 설정하여 xss공격이 있는 스크립트를 비활성화 시킨다.

      referrerPolicy는 헤더에 있는 referrer과 관련이 있는 설정같다.

  • hpp를 사용한 이유

    hpp : HTTP Parameter Pollution

    Express의 중복 이름 파라메터 공격을 방어해줄수있어서 사용하게되었습니다.

  • morgan을 사용한 이유

    로킹에 도움을 주는 미들웨어로 무슨일이 어디에서 일어났는지를 기록하고 확인할수있어서 사용하게 되었습니다.

  • CORS를 사용한 이유

    CORS(Cross-Origin Resource Sharing)는 한국말고 직역하면 교차 출처 리소스 공유이다.

    CORS 정책은 우리가 가져오는 리소스들이 안전한지를 검사하는 관문이다.

    교차 출처 리소스 공유 는 추가 HTTP헤더를 사용하여, 한 출처에서 실행 중인 웹 어플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라우저에게 알려주는 체제다.

    CORS 기본 동작과정

    1. 클라이언트에서 HTTP요청의 헤더에 Origin을 담아서 전달한다.

      다른 Origin의 리소스 요청시 클라이언트는 HTTP 요청을 보낸다.

      이때 요청헤더의 Origin필드에는 요청을 보내는 Origin을 담아보낸다.

    2. 서버는 응답헤더에 Access-Control-Allow-Origin을 담아 클라이언트로 전달한다.

      서버가 응답을 보낸때, 허락하는 Origin을 클라이언트에게 전달한다.

    3. 클라이언트에서, 자신이 보냈던 요청의 Origin과 서버가 보내준 Access-Control-Allow-Origin을 비교한다.

      자신이 보낸 Origin과 서버가 보내준 Access-Control-Allow-Origin을 비교하여 차단할지 말지를 결정한다.

      만약 유효하지 않다면 그 응답을 사용하지 않고 버린다.

  • MySQL을 사용한 이유

    배우기 쉽고 , 구조가 간단하고 유연하고 확장이 가능하며

    다른 프로그래밍 언어와 통합이 가능하고 낮은 성능의 하드웨어에서도 사용하 가능한 장점이있어서 사용하게되었습니다.

profile
성장중인 백엔드 개발자!!

0개의 댓글