내 서버는 지금도 해킹 시도 당하고 있다 – 집에서 운영한 우분투 서버의 보안 로그 분석기
·
개발 이야기
1. 서론 – 왜 집에 서버를 띄웠는가집에 미니 PC로 개인 서버를 구성해 다양한 서비스를 운영 중이다.nginx로 열려 있는 서비스는 총 3가지가 있다:1. n8n self hosted2. coupon system (nestjs)3. coupon system (vite)2. 사건의 발단 – 이상한 로그 발견어느날 문득 혹시 내 서버에 접속한 사람이 있을까? 하는 궁금증이 생겼다. Nginx는 접속 및 에러 로그를 모두 남긴다./var/log/nginx/access.log/var/log/auth.log우연히 /var/log/nginx/access.log 또는 /var/log/auth.log 등을 보다가 이상한 요청 감지접속한 IP의 지역 (중국, 러시아, 미국 등)요청 패턴 예시 (admin/login...
[nestjs] Swagger 설정
·
깜지
설치$ npm install --save @nestjs/swagger설정const docConfig = new DocumentBuilder() .setTitle('Coupon Service') .setVersion('0.1') .addServer('/couponsystem/back') .build();const document = SwaggerModule.createDocument(app, docConfig);SwaggerModule.setup('/docs', app, document, { swaggerOptions: { docExpansion: 'list', defaultModelsExpandDepth: 99, // Schemas 섹션 펼침 defaultModel..
NestJS, MongoDB, Redis로 만드는 안전한 쿠폰 발급 시스템 (feat. Lua 스크립트)
·
카테고리 없음
한정 수량의 쿠폰을 뿌리는 이벤트를 할 때, 지정된 수량만큼만 풀리게 하려면 어떻게 해야할까? 단순히 db에 있는 데이터의 숫자를 줄이거나 하는 방법으로는 올바르게 처리하지 않으면 쿠폰이 중복 발급되거나 수량이 음수가 되는 문제가 발생할 수 있다. NestJS, MongoDB, Redis를 활용하여 동시성 이슈 없이 한정 수량 쿠폰을 발급하는 시스템 설계 및 구현 과정을 공유하고자 한다. 관련 코드는 GitHub 저장소 링크에서 확인할 수 있습니다!도메인 설계시스템은 크게 두 도메인으로 나뉜다:1. Coupon (쿠폰 정의): 발급 가능한 쿠폰의 종류와 총 수량을 정의{ "couponId": "WELCOME2025", "quantity": 100,} 2. UserCoupon (실제 발급 내역): 어떤..
AWS S3 Presigned URL: 쉽고 빠르게 파일 업로드/다운로드하기
·
AWS
AWS S3를 사용할 때 Presigned URL을 활용하면, 별도의 서버 프로세싱 없이도 안전하게 파일을 업로드하거나 다운로드할 수 있다. 이번 글에서는 Presigned URL이 무엇이고, 어떻게 구현하는지 파일 업로드로 예를 들어 간단히 정리해보려고 한다.Presigned URL이란?Presigned URL이란 특정 객체에 대해 일정 시간 동안만 유효한 접근 권한을 임시로 부여하는 URL을 말한다. 예를 들어, 파일 업로드를 위해 서버에서 생성한 Presigned URL을 클라이언트에게 넘겨주면, 클라이언트는 이 URL을 통해 S3 버킷에 직접 파일을 업로드할 수 있다. 이를 통해 서버는 파일 전송 업무를 맡지 않고 S3와 클라이언트를 바로 연결해주기만 하면 되므로, 트래픽과 서버 부하를 크게 줄일..
Unity Addressable : MissingMethodException 해결법
·
Unity 3D
유니티에서 Addressable Assets을 사용한 앱을 빌드하고 iOS에서 실행했을 때 다음과 같은 에러가 발생했다.MissingMethodException: Default constructor not found for type UnityEngine.ResourceManagement.ChainOperation...처음에는 리소스 이슈인줄 알고, 몇 번이고 재빌드를 했지만 해결이 안됐다. 다행히도 비슷한 문제를 겪고 있는 사람들이 있어서 오랜 삽질 끝에 해결방법을 찾아냈다. 어드레서블 리소스를 원격으로 로드하는 과정에서 발생했으며, 원인은 Code stripping이었다. Code stripping은 사용하지 않는 코드를 제거하여 앱 용량을 줄이는 유용한 기능이지만, asset을 외부에서 로드하여 사용..
디바운싱과 쓰로틀링: 이벤트 핸들링 기법
·
기타
프론트엔드 개발에서 자주 마주치는 문제 중 하나는 사용자의 연속적인 이벤트를 어떻게 효율적으로 처리할 것인가 하는 것이다. 검색창에 텍스트를 입력할 때마다 API를 호출하거나, 창 크기 조절할 때마다 무거운 계산을 수행한다면 어떻게 될까? 이러한 상황에서 디바운싱(Debouncing)과 쓰로틀링(Throttling)이 해결책이 될 수 있다.1. 디바운싱이란?디바운싱은 연속적으로 발생하는 이벤트를 그룹화하여 마지막 또는 첫 이벤트만 처리하는 기법이다.디바운싱에는 두 가지 방식이 있다:Leading Debounce연속된 이벤트의 첫 번째 이벤트만 처리설정된 대기 시간 동안 추가 이벤트는 무시대기 시간이 지난 후 다시 새로운 이벤트를 받을 수 있음이벤트가 발생했을 때 먼저 실행시킨 후, 일정 시간 동안 추가 ..
[Unity] Advanced Inputfield 사용기
·
Unity 3D
예전에 텍스트 채팅 서비스를 만들면서 생긴 일을 글로 쓴 적이 있는데(텍스트 채팅을 구현하며 생긴 일), 그 당시에는 TMPro에 내장된 Inputfield를 사용했었다. 그 이후 얼마 안돼서 기능이 추가되면서, 더 이상 기존 Inputfield를 사용할 수 없다는 판단을 했다. 일단 사용은 해야되니 방법은 세 가지가 있다:그냥 TMPro Inputfield를 쓴다.유니티로 앱을 만드는게 흔한 일은 아니지만, 소셜 서비스를 만들면 Inputfield의 중요성이 높다. 그런 의미에서 깔끔하면서 좋은 UX를 만들기 위해선 TMPro는 논외이다. 안드로이드 / iOS 각각 네이티브 개발부터 하나하나 만든다.내가 원하는대로 네이티브 개발을 하면 가장 베스트이지만, 시간도 오래걸리고, 각 플랫폼 별 언어 / 플러..
코드 리뷰를 놓치지 않는 방법: GitLab과 Slack을 연동한 자동화 봇 구축기
·
개발 이야기
최근에 회사에 사람이 많아지다 보니, MR(Merge Request) 리뷰 하는 걸 자꾸 까먹게 된다...ㅎㅎ Merge Request(MR)이 쌓이다 보니 마지막쯤에 몰아서 하다 보니 병합 이슈가 생기기도 하고, 스트레스가 장난이 아니었다. 팀 프로젝트를 진행할 때, 병합되지 않은 MR을 추적하는 것은 매우 중요하다. 특히 여러 명이 다양한 브랜치에서 작업할 때는 MR이 누락되지 않도록 관리해야 한다. 이를 자동화하기 위해, GitLab에서 병합되지 않은 MR 목록을 매일 아침 9시에 Slack 채널로 보내주는 봇을 만들었다. 예전에 배민 기술블로그에서 코드리뷰에 관한 글을 읽은 적이 있는데, 이번 기회에 한 번 적용시켜 보면 어떨까 싶어서 만들어봤다.개발 환경SlackNode.jsGitLab자동화 봇..
[Unity] Swift로 네이티브 플러그인 만들기 (feat. AVAudioSession)
·
Unity 3D
회사에서 아고라라는 음성 SDK를 사용하는데, iOS에서 블루투스 이어폰이 제대로 안 되는 현상이 생겼다. 보통은 Object-C로 네이티브 플러그인을 만드는데, Object-C 자료도 점점 노후화되는 것 같아, 이번 기회에 Swift로 네이티브 플러그인을 만들어 봤다. 프로세스의 각 단계에 대한 코드 예제를 참고하여 이해에 도움이 됐으면 한다. 오류가 있거나 더 좋은 방법이 있으면 언제나 피드백해주시면 감사하겠습니다:) 저는 Swift나 Object-C에 대한 전문가가 아닌, Unity를 사용하는 클라이언트 프로그래머로서 Swift를 사용하여 네이티브 플러그인을 구현하는 방법을 연구하고 적용해 본 결과를 공유하기 위해 이 글을 작성했습니다. 유니티는 Swift를 지원하는가 ? 지원하지 않는다. 공식적으..
[Notion API] 리소스 업로더 만들어보기 - 1 (API 연결, Database Query)
·
개발 이야기
나는 이렇게 처음 노션API를 접했다. 회사에 프론트엔드 엔지니어가 없어서, 데이터를 관리할 수 있는 툴이 없었다. 그렇다고 매번 리소스 변경할 때마다 앱 업데이트를 할 수도 없었기 때문에, 뭔가를 만들어야 했다. 몇 가지 방법이 있긴하다. 1. Winform 윈폼은 윈도우에서 제공하는 애플리케이션 생성 환경이다. 이걸로 리소스 업로더를 만들자니, 맥에서는 실행할 수 없고, 깔끔하게 만들기도 쉽지 않다. 윈폼 프로젝트 구성 자체도, 물론 내가 몰라서 그런거겠지만, 상당히 불편하고 관리하기 쉽지않게 만들어져있다. 2. 웹 제작 어차피 node.js를 사용할거라면, 웹을 제작하는 방법도 있다. 하지만 이것도 윈폼과 비슷한 문제가 있다. 웹을 만들기 위해 많은 공부를 해야하고, 결국 나밖에 할줄 모른다면, 프..