본문 바로가기

clone toy projects

사용량 제한 구현하기 일차적으로 인증된 사용자 (토큰을 발급받은 사용자) 만 API를 사용할 수 있게 필터를 두긴 했지만, 아직 충분하지는 않습니다. 인증된 사용자라고 해도 지나치게 API를 사용하면 API 서버에 부하가 갈 수 있습니다. 따라서 일정 기간 내에 API를 사용할 수 있는 횟수를 제한하여 서버의 트래픽을 줄이는 것이 좋습니다. 유료 서비스라면 과금 체계 별로 횟수에 차이를 둘 수도 있습니다. 예를 들면 무료로 이용하는 사람은 1시간에 열 번을 허용하고, 유료로 이용하는 사람은 1시간에 100번을 허용하는 식입니다. 이러한 기능 또한 npm에 패키지로 만들어져 있습니다. 이 기능을 제공하는 express-rate-limit 패키지를 소개합니다. nodebird-api 서버에 다음 패키지를 설치합시다. npm in.. 더보기
SNS API 서버 만들기 다시API 제공자(no debird- api)의 입장으로 돌아와서 나머지API 라우터를 완성해봅시다. GET /posts/my 라우터와 GET /posts/hashtag/:title 라우터를 추가했습니다. 내가 올린 포스트와 해시태그 검색 결과를 가져오는 라우터입니다. 이렇게 사용자에게 제공해도 되는 정보를 API로 만들면 됩니다. 사용하는 측 (NodeCat) 에서는 위의 API를 이용하는 코드를 추가합니다. 토큰을 발급받는 부분이 반복되므로, 이를 함수로 만들어 재사용하는 것이 좋습니다. routes/index.js와 controllers/index.js를 통째로 바꾼다. request 함수는 NodeBird API에 요청을 보내는 함수입니다. 자주 재사용되므로 함수로 분리했습니다. 먼저 요청의 헤더.. 더보기
다른 서비스에서 호출하기 API 제공 서버를 만들었으니 API를 사용하는 서비스도 만들어봅시다. 이 서비스는 다른 서버에게 요청을 보내므로 클라이언트 역할을 하게 됩니다. API 제공자가 아닌 API 사용자의 입장에서 진행하는 것이며, 바로 NodeBird 앱의 데이터를 가져오고 싶어하는 사용자입니다. 이 사용자는 주로 데이터를 가공해 2차적인 서비스를 제공하는 회사나 개인일 수 있습니다. 예를 들어 쇼핑몰들의 최저가를 알려주는 서비스가 2차 서비스가 될 수 있습니다. 이제 우리의 2차 서비스 이름은 "NodeCat"이라고 해보겠습니다. nodebird-api 폴더와 같은 위치에 nodecat이라는 새로운 폴더를 만듭니다. 이는 별도의 서버이므로 nodebird-api와 코드가 섞이지 않도록 주의합니다. 이 서버의 주 목적은 n.. 더보기
JWT 토큰으로 인증 하기 다시 API 서비스를 제공하는 입장 (localhost:8002) 이 되어봅시다. NodeBird 앱이 아닌 다른 클라이언트가 NodeBird의 데이터를 가져갈 수 있게 해야하는 만큼 별도의 인증 과정이 필요합니다. 이 책은 JWT 토큰으로 인증하는 방법을 사용합니다. JWT는 JSON Web Token의 약어로, JSON 형식의 데이터를 저장하는 토큰입니다. JWT는 다음과 같이 세 부분으로 구성되어 있습니다. • 헤더 (HEADER): 토큰 종류와 해시 알고리즘 정보가 들어있습니다. • 페이로드 (PAYLOAD): 토큰의 내용물이 인코딩된 부분입니다. • 시그니처 (SIGNATURE): 일련의 문자열이며, 시그니처를 통해 토큰이 변조되었는지 여부를 확인할 수 있습니다. 시그니처는 JWT 비밀키로 만들.. 더보기
프로젝트 구조 갖추기 이번 프로젝트는 NodeBird 서비스와 데이터베이스를 공유합니다. 다른 서비스가 NodeBird의 데이터나 서비스를 이용할 수 있도록 창구를 만드는 것이 목표로, 프론트 쪽은 거의 루즈하지 않습니다. 우리는 다른 서비스에 NodeBird 서비스의 게시글, 해시태그, 사용자 정보를 JSON 형식으로 제공할 것입니다. 단, 인증을 받은 사용자에게만 일정량 안에서 API를 호출할 수 있도록 허용할 것입니다. package.json NodeBird에서 config, models, passport 폴더와 그 내용물들을 모두 복사해서 nodebird-api 폴더에 붙여넣습니다. routes 폴더에 서는 auth.js와 middlewares.js 만 그대로 사용합니다. 마지막으로 .env 파일을 복사합니다. 다른 .. 더보기
API 서버 이해 NodeBird 앱의 REST API 서버를 만들어보겠습니다. 노드는 자바스크립트 문법을 사용하므로 웹 API 서버에서 데이터를 전달할 때 사용하는 JSON을 100% 활용하기에 좋습니다. API 서버는 프론트엔드와 분리되어 운영되므로 모바일 서버로도 사용할 수 있습니다. 노드를 모바일 서버로 사용하려면 이번 장과 같이 서버를 REST API 구조로 구성하면 됩니다. 사용자 인증, 사용량 제한 등의 기능을 구현하여 NodeBird의 웹 API 서버를 만들어봅시다. 이번 장을 위해 NodeBird 앱에 게시글을 다양하게 올려 두세요. 웹 API는 다른 웹 서비스의 기능을 사용하거나 자원을 가져올 수 있는 창구입니다. "API를 열었다" 또는 "만들었다"라는 표현은 다른 프로그램에서 현재 기능을 사용할 수 .. 더보기
팔로잉과 해시태그 다른 사용자를 팔로우 하는 기능을 만들기 위해 routes/user.js와 controllers/user.js를 작성합니다. POST /user/:id/follow 라우터입니다. :id 부분이 req.params.id가 됩니다. 먼저 팔로우할 사용자를 데이터베이스에서 조회한 후, Sequelize에서 추가한 addFollowing 메서드로 현재 로그인한 사용자와의 관계를 지정합니다. 팔로잉 관계가 생겼으므로 req.user에도 팔로워와 팔로잉 목록을 저장합니다. 앞으로 사용자 정보를 불러올 때는 팔로워와 팔로잉 목록도 같이 불러오게 됩니다. req.user를 바꾸려면 deserializeUser를 아래와 같이 조작해야 합니다 세션에 저장된 아이디로 사용자 정보를 조회할 때 팔로잉 목록과 팔로워 목록도 같.. 더보기
multer 패키지로 이미지 업로드 구현하기 npm install multer 이미지를 어떻게 저장할 것인지는 서비스의 특성에 따라 달라집니다. NodeBird 서비스는 input 태그를 통해 이미지를 선택할 때 바로 업로드를 진행하고, 업로드된 사진 주소를 다시 클라이언트에 알릴 것입니다. 게시글을 저장할 때는 데이터베이스에 직접 이미지 데이터를 넣는 대신 이미지 경로만 저장합니다. 이미지는 서버 디스크에 저장됩니다. 그럼 post 라우터와 컨트롤러를 작성해보겠습니다. POST /post/img 라우터에서는 이미지 하나를 업로드 받은 뒤 이미지의 저장 경로를 클라이언트로 응답합니다. static 미들웨어가 /img 경로의 정적 파일을 제공하므로 클라이언트에서 업로드한 이미지에 접근할 수 있습니다. POST /post 라우터는 게시글 업로드를 처리.. 더보기