본문 바로가기

Node.js

(23)
익스프레스의 각 라우트에 자동으로 예외처리를 해주는 모듈 클라이언트의 요청을 처리해주지 못하거나 예외적인 상황이 발생해 서버가 죽는 경우가 생길 수 있다. 사람들이 안 쓰는 앱이야 상관 없지만 인스타와 같은 앱의 서버가 멈춘다면 막대한 손해가 발생한다. 이를 막기 위해서 쉽게 떠올릴 수 있는 게 try, catch 문이다. try로 감싼 코드가 실행되다가 오류나 예외적인 상황이 발생하면 catch로 빠져 이에 따른 대처를 할 수 있게 된다. 그러나 아래의 코드가 더 들어가 지저분해진다는 단점이 있다. try { } catch (ex) { } 더군다나 모든 라우트에 이를 적용해야 한다면 중복해서 지저분한 코드를 사용하는 꼴이 된다. 신기하게도 라우트에 따라오는 콜백 함수에 try, catch 문을 자동으로 감싸주는 모듈이 있다고 한다. express-async-..
JSON Web Token이란? 노드에서의 사용 예제 JSON Web Token, 줄여서 jwt는 서버에서 사용자를 식별할 수 있는 정보를 담아 클라이언트에 내려줄 때 쓰는 토큰이다. 서버가 한 번 인증한 사용자에게 카드키를 준 거라고 생각하면 쉽다. 토큰을 받은 클라이언트는 다음에 따로 인증을 하지 않아도 토큰을 이용해 로그인한 상태로 웹에 접근할 수 있다. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c 참고 : https://jwt.io/ jwt는 세 부분으로 나뉜다. 빨간색 부분은 헤더로 어떤 알고리즘이 적용됐는지 등의 정..
bcrypt의 작동원리와 노드에서 사용하는 방법 1. 간단한 원리 bcrypt를 사용하면 매번 솔트가 달라지기 때문에 해시 역시도 달라지고 데이터베이스에 특정한 해시를 저장하더라도 보안에 문제가 되지 않는다. 해시가 그때그때마다 달라져 해시를 이용해 비밀번호를 찾아내기 어렵기 때문이다. 그럼 데이터베이스의 해시가 달라지는데 어떻게 비밀번호가 일치하는지 확인할 수 있을까? bcrypt는 단순히 사용자가 입력한 비밀번호를 해싱해 데이터베이스에 저장된 해시와 비교하는 방식으로 돌아가지 않는다. 대신 사용자가 입력한 비밀번호와 데이터베이스에 저장된 해시 둘에, 어떤 해싱(로직?)을 적용해서 비교한다고 한다. 이것이 가능한 이유는 저장된 해시 앞부분에 솔트 정보가 들어 있고 이를 추론해서 사용자가 입력한 비밀번호의 해시와 비교할 수 있기 때문인 것 같다. (자..
회원 가입시 복잡한 패스워드만 등록 가능하게 해주는 노드 모듈 - joi 대부분 웹에서는 보안을 위해 비밀번호를 복잡하게 설정하라고 권한다. 다음 모듈을 쓰면 이를 손쉽게 설정할 수 있다. joi.dev
express의 router 사용 예제 const user = require('./user'); const express = require('express'); const app = express(); app.use('api/user', user); app.listen(3000, () => console.log('서버가 가동 중입니다.')); // app.js const express = require('express'); const router = express.Router(); router.get('/', (req, res) => { res.send('user를 요청했습니다.'); }); module.exports = router; // user.js
express의 유용한 미들 웨어 express.json은 request의 payloads에 json이 들어왔을 경우 json 객체로 파싱해 request.body에 넣어주는 역할을 한다. app.use(express.json()); helmets은 HTTP 헤더를 설정해 express 앱을 보호한다. https://expressjs.com/ko/advanced/best-practice-security.html#use-helmet app.use(helmets()); morgan은 HTTP 요청 로그를 뿌려준다. http://expressjs.com/en/resources/middleware/morgan.html app.use(morgan('tiny')); 그밖의 미들 웨어 : https://expressjs.com/ko/resources..
npm 유용한 명령어들 // 특정 버전의 모듈을 설치할 때 (최신 버전부터는 --save라는 키워드를 넣지 않아도 된다.) npm i mongoose@2.4.2 // i 뒤에 -D 옵션을 추가하면 devDependencies에 설치된다. npm i -D webpack // node_modules에 실제로 설치 되어 있는 모듈들의 버전을 확인할 때 npm list --depth=0 // 모듈(mongoose)에 들어 있는 모듈들의 버전을 보고 싶을 때 npm view mongoose dependencies // 모듈(mongoose)의 모든 버전 리스트를 보고 싶을 때 npm view mongoose versions // 설치된 모듈이 최신 버전인지 확인할 때 npm outdated // devDependencies에 설치할 때..
비동기로 작동하는 node.js의 메소드 원리 node.js의 기본 모듈에는 보통 동기 메소드와 비동기 메소드가 패어로 준비돼 있다. 예를 들어 fs 모듈에는 비동기로 readdir이라는 메소드가 있고 readdirSync라는 메소드가 있다. 자바스크립트는 싱글 스레드이기 때문에 만약 서버에서 동기 메소드인 readdirSync를 쓰면 여러 클라이언트의 요청에 대한 응답을 바로바로 보내줄 수 없기 때문에 절대 써서는 안 된다. 또한 비동기 메소드의 두 번째 인자에는 콜백 함수가 들어오고 비동기가 완료됐을 때 호출된다. fs.readdir('./', function(err, files) { if (err) console.log(err); else console.log(files); }); 만약 비동기 과정에서 오류가 발생하면 첫 번째 인자에는 오류가 ..