본문 바로가기

[Project] 프로젝트 삽질기31 (feat Rate Limiting 구성) 들어가며 NestJS로 개발하면서, 무차별적으로 API 요청을 하는 공격을 받은 경험이 있습니다. 이 경험을 통해 외부로부터 오는 해커들의 공격으로부터 방어하기 위해서는 Rate Limiting이 필요하다는 것을 알았습니다. 이 글은 NestJS에서 Rate Limit을 보다 잘 활용하려면 어떻게 해야 할지 고민하기 위해 작성된 글입니다. NestJS Rate Limiting 무차별 대입 공격으로부터 앱을 보호하기 위해 일종의 속도 제한을 구현하는 옵션입니다. 간혹 운영 중인 서버에 DoS(Denial of Service) 공격을 받게 된다면, 서버 인스턴스의 리소스가 MAX가 되고, 무응답 상태가 나타날 수 있습니다. 이때 express-rate-limit을 활용하면 허용 가능한 접근 횟수 및 간격을 ..
[Project] 프로젝트 삽질기30 (feat helmet 구성) 들어가며 NestJS로 개발하면서, 외부로부터 오는 해커들의 공격에 어떻게 대응할 수 있을지 고민하곤 했습니다. 그때 helmet이라는 라이브러리를 알 수 있었습니다. NestJS에서 helmet을 보다 잘 활용하려면 어떻게 해야 할지 고민하기 위해 작성된 글입니다. 이 글은 [NODE / 보안] 📚 helmet 모듈 사용법 - 웹 보안은 내가 👮 글을 참고했습니다. 해당 링크 글을 보시면 더 잘 이해되실 겁니다. NestJS Helmet helmet 모듈은 웹서버를 외부의 공격으로부터 보호해주는 대표적인 노드 보안 모듈입니다. helmet 모듈은 다양한 HTTP 헤더를 자동 설정해줘서 서버 애플리케이션의 보안을 강화해줍니다. helmet을 활용하려면 모듈을 설치해주고, 선언만 하면 됩니다. npm in..
[Project] 프로젝트 삽질기29 (feat Swagger 보안 구성) 들어가며 NestJS로 개발하면서, Swagger를 보다 잘 사용하려면 어떻게 해야 할까 고민했습니다. 그 과정에서, Swagger 문서가 혹여나 외부에 노출된다면, 한 번 더 보안에 신경 쓰기 위해 express-basic-auth라는 라이브러리를 활용한다는 것을 알았습니다. NestJS에서 express-basic-auth를 보다 잘 적용하려면 어떻게 해야 할지 고민하기 위해 작성된 글입니다. NestJS Swagger 보안 NestJS에서 Swagger의 보안을 조금 더 신경 쓰기 위해 express-basic-auth 라이브러리를 활용합니다. 라이브러리를 설치해서 활용하려면 다음의 명령어를 입력합니다. npm install express-basic-auth 그리고 기본 설정은 다음과 같이 할 수 ..
[Project] 프로젝트 삽질기28 (feat 푸시 메시지 구성) 들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 푸시 서버를 개발하면서, 참고할 수 있는 자료들이 많이 없었습니다. 이번에 푸시 서버를 개발하고, 제가 했던 고민을 공유한다면 많은 분들에게 도움이 될 수 있지 않을까 생각했습니다. 제가 어떤 문제를 겪었는지, 그리고 그 문제는 왜 나타났으며 문제를 해결하기 위해 했던 고민들은 무엇이었는지 공유하고자 합니다. 그 과정에서 생각하고 배웠던 점들을 하나씩 작성하고자 합니다. Push 로직 구성 제가 개발하고 있는 서비스 POG는 즐겨찾기 한 소환사의 전적이 갱신되면 푸시 알림을 받을 수 있고, 앱에서 바로 확인할 수 있는 서비스입니다. 그러다 보니, 소환사의 전적이 갱신되면 푸시 알림을 보내야 하는데, 이 기능을 개발할 때 많은 고..
[Project] 프로젝트 삽질기27 (feat Redis 활용) 들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 그 과정에서 생각하고 배웠던 점들을 하나씩 작성하고자 합니다. Queue를 활용한 푸시 알림 서버 구축을 하면서, Redis 자료구조를 활용해서, 캐시 활용 서비스를 구축해야 했습니다. 이를 위해 NestJS에서는 유용한 cache module을 제공하고 있었습니다. 하지만 이 모듈에서는 Redis를 활용하기 위한 기능상의 제약이 있었습니다. 그래서 Redis를 더 잘 활용하기 위해 cache module이 아닌, redis 클라이언트를 활용하는 방식에 대해 알아보겠습니다. Redis를 어떻게 활용할 것인가 POG는 즐겨찾기 한 소환사의 전적이 갱신될 때마다 푸시 알림을 보내주는 서비스입니다. 이는 서버 관점에서 보면, 데이터베..
[Project] 프로젝트 삽질기26 (feat Redis 설정) 들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 그 과정에서 생각하고 배웠던 점들을 하나씩 작성하고자 합니다. Queue를 활용한 푸시 알림 서버 구축을 하면서, Redis 자료구조를 활용해서, 캐시 활용 서비스를 구축해야 했습니다. 이를 위해 NestJS에서는 유용한 cache module을 제공하고 있었습니다. 하지만 이 모듈에서는 Redis를 활용하기 위한 기능상의 제약이 있었습니다. 그래서 Redis를 더 잘 활용하기 위해 cache module이 아닌, redis 클라이언트를 활용하는 방식에 대해 알아보겠습니다. Cache Module 설정하기 프로젝트를 진행하면서, Redis로 캐시를 잘 활용할 수 있도록, NestJS 공식 문서에서는 cache-manager를 활..
[Project] 프로젝트 삽질기25 (feat Transaction) 들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 개발한 API를 살펴보면서, 비효율적인 부분들이 눈에 보였습니다. 같은 조회 쿼리를 하나의 API에 두 번씩 도는 로직이 있었고, 처리 순서가 중요하지 않은 조회 쿼리를 동기적으로 처리하고 있었습니다. 마지막으로 데이터를 저장할 때 하나의 트랜잭션으로 처리하는 것이 아니라, 별도의 트랜잭션으로 처리하고 있었고, 만약 에러가 발생할 경우에도 별도의 트랜잭션으로 데이터를 저장하기에, 롤백되는 것이 아닌 커밋될 위험이 다분했습니다. 이 문제를 해결하기 위해 트랜잭션과 Promise.all을 활용했습니다. 이 글은 트랜잭션과 Promise.all을 어떻게 활용했는지에 관한 글입니다. 트랜잭션? API를 개발하면서, 에러가 났음에도 데이..
[Project] 프로젝트 삽질기24 (feat Sentry Slack 연동) 들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 서버를 개발하면서, 서버가 새벽에 박살이 나서 밤샘을 하며 서버를 고친 경험이 있습니다. 고치면서 이제는 서버에 문제가 생길 때 왜 문제가 생겼는지 분석해주는 툴을 도입해야겠다고 생각했습니다. 이번 기회에 로그를 분석하는 툴을 도입하고, 서버가 문제가 생길 시 슬랙으로 알림이 오도록 구성하고 싶었습니다. 이 글은 제가 어떻게 Sentry와 Slack을 활용하여 서비스 장애에 대처할 수 있게 설정했는지 설명하는 글입니다. Sentry Sentry는 애플리케이션에서 오류가 발생하면 알려주는 에러 트래킹 서비스입니다. (무료 혹은 유료) 클라이언트의 오류 발생 시 메일을 보내주고, 슬랙과 연동하면 슬랙 메시지를 통해 오류 발생과 해당..
[Project] 프로젝트 삽질기23 (feat Enum) 들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. 개발하는 과정에서, 팀원이 제게 Enum은 왜 사용했는지 물었습니다. 그 과정에서 관련된 대답을 제대로 할 수 없었습니다. 코드를 생각하지 않고 작성하고 있었다는 것을 깨달았습니다. 지금부터라도 코드를 생각하면서 작성하기 위해 노력하고자 합니다. 이 글은 Enum에 대한 생각을 정리하기 위해 작성됐습니다. Enum, 사용할까? 말까? 프로젝트를 개발하면서, Enum을 활용한 코드를 작성했습니다. 그러다 팀원이 Enum을 사용하면 Tree-Shaking 관점에서 비효율적이지 않나요라는 물음을 줬고, 이 물음에 대답할 수 없었습니다. Enum을 활용하면 키로 값을 얻을 수 있고, 값으로 키를 얻을 수 있어서 다양하게 활용할 수 있다..
[Project] 프로젝트 삽질기22 (feat Exception) 들어가며 사이드 프로젝트에서 푸시 알림을 활용한 서비스를 개발하고 있습니다. API를 개발하면서, 이유 모를 문제 때문에 API가 제대로 동작하지 않는 문제가 발생했습니다. API를 개발하면서, 에러를 처리하는 로직을 전혀 구성해두지 않았기에 생겼던 문제였습니다. 그럼 NestJS에서 에러를 핸들링하는 로직은 어떻게 작성해야 할지 궁금했습니다. 이 글은 NestJS에서 Exception을 처리하는 부분에 대한 노력의 흔적이 담겼습니다. 무지성 try-catch 활용하기 이미 개발해둔 API에서 문제가 생겼지만, 왜 문제가 생겼는지 로깅도 제대로 되지 않는 것을 보면서 API에서 에러 처리를 제대로 하지 않고 있다는 것을 깨달았습니다. 일단 에러 처리를 하기 위해 많이 사용하는 try-catch를 사용해야..