본문 바로가기
JS/Node.js

Node.js 숙련

by 썸맨 2023. 6. 25.

★ 개념 정리

  • HTTP 쿠키 : 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각으로 브라우저는 그 조각들을 저장해 놓았다가 동일 서버에 재 요청 시, 저장된 데이터를 함께 전송(두 요청이 동일한 브라우저에서 들어왔는지 아닌지 판단할 때 주로 사용 - 로그인 상태 유지 가능), 쿠키는 문자열 형식으로 존재하며 쿠키 간에는 세미콜론으로 구분됨, express에서 사용하기 위해서는 cookie-parser라이브러리를 설치하고 실행 파일에 cookie-parser을 require해 app.use()안에 미들웨어를 선언해 두어야 사용이 가능하다. 쿠키의 주목적 : 세션 관리 / 개인화 / 트래킹
  • 세션 : 쿠키의 특성을 이용, 쿠키에는 모든 데이터가 노출이 된 채로 브라우저에 저장이 되기에 탈취당하기가 쉬움, 따라서 쿠키에 담는 데이터를 서버에 저장하고 데이터마다 고유한 세션 ID를 만들어 이 ID를 통해 서버가 세션 데이터에 접근하기에 쿠키의 보안 취약점을 해결 But) 모든 인증을 서버에서 처리하기에 사용자가 많아질 수록 서버에서 처리해야 하는 부하가 증가해 문제 발생가능(트래픽 증가에 따른)
  • 정적 파일(Static file) : 서버에서 파일 내용을 변형해 사용하지 않고 클라이언트에게 그대로 전달하기 위한 목적의 파일, express 라이브러리에 정적 파일을 쉽게 제공할 수 있게 해주는 미들웨어 있음
  • Schema.virtual : 가상의 컬럼을 만들어 MongoDB에는 존재하지 않지만 DB에 있는 속성값을 지정한 값으로 편리하게 사용하도록 설정(moongoose에서는 출력이 됨)
  • Schema.set("toJSON", {virtuals: true}); : JSON타입으로 스키마를 변환 시 가상값을 반환하도록 설정

 

★ JWT

  • JWT : JSON 형태의 데이터를 안전하게 교환해 사용할 수 있도록 해줌, 인터넷 표준으로 자리잡은 규격, 여러 암호화 알고리즘 사용가능, header.payload.signature 형식으로 3가지 데이터를 포함(변환된 데이터는 항상 2개의 .이 포함된 데이터여야 함)
  • JWT - header : signature에서 어떤 암호화를 사용해 생성된 데이터인지를 표현
  • JWT - payload : 개발자가 원하는 데이터를 저장
  • JWT - signature : 이 토큰이 변조되지 않은 정상적 토큰인지 확인 할 수 있도록 도와 줌
  • JWT 특성 : 비밀키를 모르더라도 decode(복호화)가 가능함 -> 변조만 불가능 하지 누구나 보는 것은 가능 => 따라서 민감한 정보(개인정보/비밀번호 등)는 담지 않도록 해야함 & 특정 언어에서만 사용 가능한 것 x(개념으로 존재)
  • 쿠키/세션과의 차이 : 쿠키와 세션은 데이터를 교환하고 관리하는 방식이지만 JWT는 단순히 데이터를 표현하는 방식이다, 변조가 거의 불가능하고 서버에 데이터를 저장하지 않기에 서버를 무상태(Stateless - 서버가 죽었다 살아나도 같은 동작을 할 때 // Stateful인 상태 보존(조금이라도 동작이 다른 경우)과 다름)로 관리 할 수 있기에 많이 사용함
  • 사용 : jsonwebtoken라이브러리 사용, JWT가 인증 서버에서 발급되었는지 위변조 여부(비밀 키 사용)를 확인 할 수 있음 & 누구든지 JWT내부에 들어있는 정보를 확인 할 수 있음 => 이러한 암호화된 데이터를 통해 로그인 된 정보를 확인하는 등의 인증을 시도하는 것이 가능
    const accessToken = jwt.sign({ userId: user.userId }, process.env.JWT_SECRET_KEY, {
      expiresIn: "1h",
    });

    res.cookie("accessToken", `Bearer ${accessToken}`);

=> accessToken변수에 만료시간이 1시간이고 비밀키는 환경변수에 설정된 JWT_SECRET_KEY로 할당했고 이 변수를 accessToken이라는 이름을 가진 쿠키에 Bearer 토큰 형식으로 할당 했음

 

★ 미들웨어

  • 웹 서버에서 요청을 받을 때 모든 요청에 대한 공통적 처리가 필요한 경우 미들웨어를 통해 공통적으로 관리가 가능(ex 요청의 로그 확인 등)  //Apache, Nginx 등과 같은 다른 서버에서는 모듈이라는 개념이 유사
  • express : express.urlencoded({extended:false}) => form-urlencoded 라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있도록 도와주는 미들웨어 // express.json() => JSON 규격의 body데이터를 손쉽게 코드에서 사용할 수 있도록 도와주는 미들웨어
  • 미들웨어는 만드려는 기능에 다양하게 사용할 수 있고 관리 측면에서도 이점이 큼
  • 여러 미들웨어가 겹치는 경우 첫번째 미들웨어부터 순차적으로 진입, 중간에 응답을 해서 종료되거나 다음 미들웨어로 넘어가는 식으로 실행(Router는 미들웨어 기반으로 구현된 객체이므로 Router도 동일한 방식으로 작동)

 

★ SQL(Structured Query Language)

  • SQL : DB에서 사용되는 생성, 삽입, 조회 명령문을 지칭
  • 종류 1) DDL(Definition) : 데이터 정의, CREATE / DROP / ALTER
  • 2) DML(Manipulation) : 데이터 조작, SELECT / INSERT / DELETE / UPDATE
  • 3) DCL(Control) : DB에 대한 권한 설정, COMMIT / ROLLBACK / GRANT / REVOKE
  • 제약 조건 : 각 컬럼들간의 제한사항을 관리하고 조건을 위반하는 데이터를 방지해 DB의 완전성을 보장하는 규칙, 무결성을 지키기 위해 만들어진 개념
  • 대표적 제약 조건의 종류 : Unique(중복 키 가질수 없음) 제약 조건 - 특정 컬럼에서 중복된 값이 허용되지 않도록 설정, NULL 제약 조건 - 특정 컬럼에서 NULL값을 허용하거나 허용하지 않도록 설정, 기본 키(Primary) 제약 조건 - 테이블에 있는 데이터를 고유하게 구분 할 수 있는 정보를 나타내기 위해 사용, 외래키(Foreign) 제약 조건 - 테이블과 다른 테이블간의 관계를 맺을 때 사용
  • 연계 참조 무결성 제약 조건 : 외래 키 경우 다른 테이블과 관계를 맺고 있는 참조 데이터가 삭제 시 어떤 행위를 해야하는지 설정이 가능한데 이러한 행위를 수행하는 조건
  • 연계 참조 무결성 제약 조건 종류 : CASCADE / NO ACTION(아무런 행위x, 에러발생) / SET NULL / SET DEFAULT

 

★Sequelize

  • ORM(Object Relational Mapping)으로써 JS객체와 DB의 관계를 연결해주는 도구(라이브러리) - TypeORM, Prisma, Sequelize 등의 여러 도구가 있는데 그 중에 하나
  • ORM 장점 1) ORM의 속성값만을 변경해 자유롭게 DB를 변경할 수 있어 개발 시 선택의 폭이 넓어짐(Raw Query로 작성된 코드를 프로덕션에서 사용하는 DB가 바뀌게 된다면!(ex) MySQL->Oracle) 전부 바꿔야하는 문제가 있음
  • 2) DB에서 사용하는 DB/Table의 속성이 변경 되었을 때 빠르게 수정이 가능함
  • Sequelize의 migration : Sequelize CLI를 이용해 MySQL에 테이블을 정의 및 생성하기 위해 사용
  • Sequelize의 model : 특정 Table과 Column의 속성 값을 입력해 MySQL과 express를 연결(Mapping)시켜줌
  • Sequelize CLI 종류 1) sequelize db:create - config/config.json에 설정한 db를 생성  2) sequelize db:drop - config/config.json에 설정한 db를 DROP 3) sequelize model:generate : migration과 model을 생성  4) sequelize db:migrate - migrations 폴더에 있는 migration 파일을 이용해 MySQL의 테이블을 생성 5) sequelize db:migrate:undo - 가장 최근에 실행된 db:migration 명령을 되돌림 6) sequelize seed:generate - seeder 폴더에 있는 seed 파일을 이용해 각 테이블에 데이터를 삽입
  • sequelize.sync() 사용 안하는 이유 : 이 명령어로 models에 생성된 model 파일을 이용해 테이블 생성이 가능하지만 INDEX, VIEW, SCHEDULER와 같은 명령들은 관리가 힘듬 - Production 환경에서 DB를 사용할 때는 서버의 실행 없이 MySQL에 대한 관리가 필요한 경우가 많이 존재하고 model 파일만으로 구체적인 DB설정을 하기가 어렵기 때문(Node.js Application에 의존적) & 또한 model의 설계가 변경될 경우 현재 서비스 중인 테이블이 삭제 된 후 생성됨(기존에 가입한 다른 사용자들의 정보는 삭제 된 깨끗한 테이블이 만들어지므로 치명적)