node교과서 정리

송은우·2022년 1월 14일
0

morgan('combined') 로 하기
express session은 option을 분리해서 proxy=true같은 것들로 처리하는 방식으로 session의 옵션을 변경해야 함.
https는 secure true.
https 적용시 session.Option.cookie.secure=true 쓰기

프록시 적용시

app.enable('trust proxy');
if (process.env.NODE_ENV === 'production') {
  sessionOption.proxy = true;
  // sessionOption.cookie.secure = true; //https 사용시
}

helmet, hpp이 2개를 그냥 습관처럼 넣는 것이 좋음
보안용임.
app.use(helmet({ contentSecurityPolicy: false }));
외부 css 로딩시 에러가 많이 남 이거는 기본적으로 하는게 좋음.

config.js 라는 걸로 config.json을 바꿔서 dotenv를 이용해서 가져오는 걸로 비밀번호를 한 번 더 숨김.
NODE_ENV=production PORT=80 node server 이런 걸로 start명령어를 바꿔서 nodemon을 이제 없앰 이러면 process.env안에 들어가는데 windows는 안 들어가기에 corss-env로 설치하는 방식으로 저 명령어가 작동하게 할 수 있음.
XSS 공격 방어. npm i santize-html 같은 걸로 허용되지 않은 html입력이나 js스크립트들을 방어함. 그런 것들을 막아줌.
db에는 santize-html 로 걸러진 문자열만 저장하면 됨.

CSRF 공격은 csurf 모듈로 설치가 가능함. 다른 사람이 요청을 보낸 것 처럼 숨기는 공격
토큰을 발행해서 미들웨어로 처음 get할때 심고, 이후에 마지막 작업에 같은 토큰이 있는지를 볼 수 있음.

sql injection은 sequelize가 얼추 막아줌.
이런식으로 보안도 생각해 보는게 좋음.

cross-env 라는 것. 에러가 발생하면 서버가 바로 종료한다는 문제가 있기에 pm2(Process Manager)를 이용해 해결을 함
클러스터링도 다 해줌.
graceful reloading(기존 서버 동시에 2번 서버와 켜서 2번에 다 갔다는 것들을 확인한 이후에, 2번 서버를 매끄럽게 넘겨줌. )
프로세스간 서버 메모리 자원 공유가 불가능 하다는 문제가 있음.(node의 문제임. 노드의 스레드를 써야 되는 것)
memcashed, redis같은 메모리 공유 db를 사용함.
session을 redis같은 메모리 디비에 저장해 서버별로 공유해 로그인 유지 같은 것들을 해줌.

cross-env NODE_ENV=production PORT=80 pm2 start server.js -i -1이나 -i -0 해서 함.

를 처리함.
npx pm2 list 로 여러 정보를 알게 됨.

linux나 mac 은 sudo를 붙혀줌.
-i -0은 코어 갯수만큼 함. -i -1은 코어-1개 씀
하나 남기는 거는 노드 외에 작업 수행을 하도록 함. fs, crypto같은 것들을 위해서 남겨둠.

npx pm2 kill/reload/monit/(logs --err) 이런 걸로 죽이기, 재시작, 실시간 서버별 로그 확인, 과거 로그

winston
console.log, console.error 가 서버가 꺼지면 바로 날아가기에 winston은 로그를 알아서 해주는 장점이 있음.
요즘은 aws나 stack driver같은 여러가지 것들이 알아서 해주기에 필요성을 줄어들긴 함.
console.log
console.info
console.warn
console.error

const logger = createLogger({
  level: 'info',
  format: format.json(),
  transports: [
    new transports.File({ filename: 'combined.log' }),
    new transports.File({ filename: 'error.log', level: 'error' }),
  ],
});

if (process.env.NODE_ENV !== 'production') {
  logger.add(new transports.Console({ format: format.simple() }));
}

이런 것들을 이용해 레벨별로 할 수 있음
winston-daily-rotae-file을 쓰면 알아서 날짜별로 해줌.

개발용일때는 콘솔에다가 표시해라 가 됨.
logger를 module exports해서 app같은 곳에서 console.log대신 logger.log로 쓰면 됨.
format:format.json()과 format:format.simple() 각각 배포용, 개발용 이렇게 나누는 것이 가능함.

redis labs가 공짜.
connect-redis redis npm에 있는 redis랑, redis labs랑 차이가 있음 여기 redis는 그냥 드라이버 역할
window는 redis설치가 힘듦. memurai가 그나마 있는 대안일 것임.
redis db를 사용할 거면 문법이 있기에 따로 배워야 함.
redis는 단순한 배열, 캐싱 용도로 쓰는 것들임. 자주 접근 데이터, session 데이터 같은 것들만 씀.
저기 connect-redis, redis는 문법을 몰라도 조금 편하게 접근 가능.

const redisClient = redis.createClient({
  url: `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}`,
  password: process.env.REDIS_PASSWORD,
});
//밑에꺼를 session에다 넣음.
store: new RedisStore({ client: redisClient }),

이렇게 express-rate-limit 같은 것도 rate-limit-redis패키지로 redis로 옮김. 사용량을 메모리에 기록하기에 서버를 재시작 하면 사용량이 초기화 됨.

npm i -g npm 으로 업데이트가 가능하지만
node update는 nvm installer
nvm install 버전 으로 업데이트가 됨.

실무는 mysql 서버, node 서버를 따로 두는게 좋음

이미지 파일 같은 것들은 AWS 의 S3같은 따로 두는 것이 좋음. 아니면 서버 용량을 늘릴 때 모든 서버에 다 이미지가 복사됨

이미지 리사이징 같은 경우는 이미지 용량을 줄여서 저장하는 것이고,노드 서버로는 cpu연산이 과하게 필요해

lightsale => S3 <=> 람다
(nodebird) (1. 이미지 업로드) (2.람다 트리거) (3. 리사이징 된 이미지 S3에 저장)
서버리스에
https://를 쓰려면 proxy설정 해야되고, 도메인이 필요함.
sudo npm start && sudo npx pm2 monit

http://54.180.126.117/ 노드버드 웹사이트
서버리스 웹사이트란 서버가 없다는 뜻이지만 실제 서버는 있어야 하고, 서버를 직접 운영할 필요가 없다는 것.
코드 업로드 후 사용량에 따라 요금 지불을 하면 됨.
24시간 작동될 필요가 없는 경우 이 효과가 더 커짐.

aws secret key같은 키들을 받을 수 있음. aws 보안정책
실무에서는 이 키 권한까지는 필요 없어서 iam 키를 받아 권한을 축소해 사용
s3는 region은 상관이 없지만 람다 같은 것들은 상관이 있기에 제대로 해주는 게 좋음

게시글 삭제할 때 이미지는 삭제 안 하는 방식으로 자산으로 남겨두는 경우도 있음

profile
학생의 마음가짐으로 최선을 다하자

0개의 댓글