전체 글 132

NodeJS 작동 원리

Nodejs 작동 원리 V8 엔진은 자바스크립트 실행을 담당하는 호출 스택을 담당하며, libuv는 비동기 I/O와 이벤트 루프를 담당한다. 노드 실행은 하나의 스레드에 의해서만 수행되고 하나의 콜 스택을 가짐 콜 스택은 동기적 블로킹 작업이므로 이를 극복하기 위해 Event Loop를 추상화한 libuv를 사용 libuv 내부에 Event Loop는 메인 스레드에 상주하여 비동기 작업을 수행 요청의 특징(블로킹 또는 논 블로킹)에 따라 Thread Pool에 작업을 위임하고 콜백 함수를 실행하기 위해 Event Queue에 적재된 콜백 함수를 빈 상태의 콜 스택으로 이동시킴 Event Loop는 6개의 단계로 이루어져 있으며 각 단계별로 Event Queue를 소유 Event Loop는 각 단계를 순차..

서버/Node 2022.07.25

NodeJS

node 크롬 V8 엔진으로 빌드 된 자바스크립트 런타임 노드는 서버와 자바스크립트 엔진이 아니다. 런타임이다. 싱글 스레드 이벤트 기반 아키텍처 논 블로킹 I/O 모델 서버의 역할도 수행할 수 있는 자바스크립트 런타임 노드로 자바스크립트 언어로 작성된 서버를 실행 서버 실행을 위해 필요한 http/https/http2 모듈을 제공 내부는 내장 코어 라이브러리와 V8 그리고 libuv로 이루어져 있음 런타임이란 특정 언어로 작성된 프로그램을 실행할 수 있게 해주는 실행기(가상 머신) Node는 자바스크립트 실행기이다. 자바스크립트 언어 노드 런타임(실행기) 엔진 V8 노드 등장 전의 자바스크립트 브라우저가 HTML 파일을 읽으며 HTML 내부에 포함된 자바스크립트 코드를 읽어 실행했다. 이는 HTML 파..

서버/Node 2022.07.23

그런 REST API로 괜찮은가

지인의 추천을 받아 동영상을 보게 되었다. 그런 RESP API로 괜찮은가라는 47분가량의 영상이다. 제목부터 느낌 있다. 4 년전 네이버 D2 채널에 올라온 영상이고 흔히 구글에 나와있는 RESP API 개념이랑은 많은 차이가 있는 거 같다. 내가 기존에 알고 있던 개념들과 비교해 보며 47분 동안 시간 가는 줄 모르고 시청했다. 이 동영상의 내용을 휘발성으로 보내기 싫어 기록으로 남긴다. REST API REST 아키텍처 스타일을 따르는 API이다. 여기서 REST의 의미는 분산 하이퍼미디어 시스템을 위한 아키텍처 스타일을 의미한다. 아키텍처 스타일이란 제약 조건의 집합 즉 제약 조건들을 모두 만족해야 REST를 따른다고 할 수 있다. 요즘은 HTTP를 잘 지켜도 REST 하다고 표현한다. 하지만 오..

네트워크 2022.07.19

Cors

Cors Cors(Cross Origin Resource Sharing)란 교차 출처 리소스 공유로 서로 다른 출처에서 데이터를 송/수신하는 걸 허용하는 정책이다. 우리가 흔히 알고 있는 Cors 에러는 Sop(Same Origin Policy)가 다른 경우 Cors 정책에 위반되므로 브라우저에서 발생시키는 에러다. Sop Sop(Same Origin Policy)란 한 Origin으로부터 로드된 Document 또는 Script가 다른 Origin의 리소스와 상호작용할 수 있는 방법을 제안하는 보안 메커니즘이다. 즉 같은 Origin들이랑만 데이터를 송/수신할 수 있다. Oirign 프로토콜과 호스트 그리고 포트 번호를 합친 걸 의미 Cros 접근 제어 시나리오 1. 단순 요청(Simple Reques..

네트워크 2022.07.17

JavaScript substr substring slice

JavaScript substr substring slice 문자열 관련 알고리즘 문제를 풀다 무지성으로 사용 한 메서드를 기록으로 남긴다. substr sbustr(시작, 길이) 또는 substr(시작) 시작부터 길이만큼 문자열을 자르며 길이를 생략하면 시작부터 끝까지 자른다. let str = "Absolute"; let res = str.substr(3, 2); console.log(res); // ol let str = "typeGuard"; let res = str.substr(4); console.log(res); // Guard substring substring(시작, 종료) 또는 substring(시작) 시작에서 종료까지 문자열을 자른다. 여기서 종료 위치는 -1이다. let str = ..

ExpressJS express-validator 유효성 검사

ExpressJS Express express-validator 유효성 검사 각 서비스는 클라이언트가 존재하므로 폼이 존재한다. 서비스의 규모가 커질수록 더 많은 사용자의 데이터가 필요하게 되고 서버와 클라이언트가 데이터를 주고받기 위한 폼이 더 많아지게 된다. 사용자의 데이터는 대부분 데이터베이스에 저장되는데 저장되는 시점에 유효하지 않은 데이터가 저장되면 안 되므로 저장 전 클라이언트가 보낸 데이터의 유효성을 반드시 검사해야 한다. 1차적으로 클라이언트에서 사용자의 입력값을 필터링할 수 있지만 사용자는 자바스크립트 코드를 볼 수 있고 해제할 수 있어 완벽하지 않다. 사용자의 경험을 좋게 만들 순 있어도 전체적인 서비스 관점에서보면 결코 안전하지않다. 그럼 결국 서버에서 유효성 검사를 해야하는데 대부분..

서버/Express 2022.06.23

ExpressJS nodemailer 비밀번호 초기화

ExpressJS nodemailer 비밀번호 초기화 사용자 비밀번호 초기화는 요즘 웹 서비스에 없어서는 안 될 기능 중 하나다. 예전에는 휴대폰 인증 방식을 사용했지만 요즘은 비밀번호 초기화 링크를 사용자가 입력 한 메일로 보내주는 방식을 사용한다. 노드로 수천 또는 수만 건을 동시에 처리하는 메일 서버를 만드는 건 단순 요청과 응답을 처리하는 작업이랑 차원이 다르다. 다행히도 사용자에게 메일을 쉽게 보낼 수 있도록 도와주는 nodemailer 라이브러리가 존재한다. 실제 대부분의 웹 서비스들이 자사 메일 서버를 직접 구축해 사용하기보다 AWS 등 제3자 라이브러리를 이용한다. Use - npm i nodemailer - nodemailer 임포트 후 발신(서버) 설정과 수신(클라이언트)에 대한 설정을..

서버/Express 2022.06.21

ExpressJS moment

ExpressJS moment 토큰 만료 기간 설정도 중 알아두면 유용한 라이브러리를 찾았다. moment는 날짜 관련 라이브러리이다. 현재는 업데이트가 중단되었지만 여전히 많이 사용한다고 한다. 자바스크립트는 Date라는 날짜 관련 객체를 제공하지만 가독성이 떨어지는 경우가 있어 moment를 사용한다고 한다. 성능 영향이 있을 수 있으니 상황에 따라 사용하면 된다. Use - npm i moment - 단순 날짜 출력외에도 계산과 비교 등 생각보다 다양한 기능이 많으니 원할 경우 공식 문서를 참고하자.

서버/Express 2022.06.20

ExpressJS CSRF

ExpressJS CSRF 사용자의 의자와 무관하게 해커가 의도한 행위(결제/수정/삭제 등)을 특정 웹사이트에 요청하게 하는 사이트간 요청 위조 공격 방법 사이트 간 요청 위조는 특정 웹사이트가 사용자의 브라우저를 신용하는 상태를 노리는 의미이다. 쇼핑몰 사이트에 로그인된 사용자가 있다고 가정해 보자. 해커는 쇼핑몰 관리자인 거처럼 속여 사용자에게 개인 정보 보안 강화를 위한 내용으로 이메일을 보낸다. 사용자가 이메일 속 링크를 클릭하는 순간 로그인돼있는 사용자의 패스워드를 해커가 요청한 패스워드로 변경한다. 해커는 변경된 패스워드로 쇼핑몰을 이용할 수 있다. 우리가 알고 있는 2008년 옥션 1000만 회원 정보 유출 사건도 CSRF(Cross-Site-Request-Forgery) 공격 방법이 사용되..

서버/Express 2022.06.19

ExpressJS Sequelize transaction

ExpressJS Sequelize transaction 데이터베이스 상태를 변화시키기 위해 수행하는 작업 또는 한 번에 실행되어야 할 연산 이미 MySQL 사용법을 포스팅했었지만 ORM에서의 사용법을 기록하지 않아 작성한다. 트랜잭션을 설명할 경우 단골 예로 등장하는 예시가 있다. A와 B가 있다. A의 통장에서 B의 통장으로 돈을 송금한다. 송금 과정에서 A의 통장에서 출금은 되었지만 알 수 없는 오류로 B의 통장에 입금 처리가 되지 않았다. 이 예시로 쉽게 이해했었다. 데이터베이스의 상태를 변환시키는 쿼리이므로 즉 여러 개의 쿼리를 한 단위로 묶는다. MySQL은 방법이 하나지만 Sequelize transaction은 2가지 방법을 지원한다. User와 유저의 세부 정보를 담고 있는 Info 모델..

서버/Express 2022.06.17