728x90

분류 전체보기 175

구글 Play Integrity API로 안드로이드 악성 사용자 차단하기

배경모바일 리워드 앱은 사용자 보상 구조상 “정상 사용자 vs 자동화/매크로/다계정 유저 등의 어뷰저” 간의 싸움이 항상 존재한다.특히 글로벌 시장(예: 미국, 캐나다 등)에서는한국과 달리 본인 인증 수단이 약하기 때문에 디바이스 단위의 보안 중요하다. 구글 Play Integrity API는 구글에서 제공하는 안드로이드 보안 도구로, 앱과 디바이스의 무결성을 확인해 악성 사용자(루팅 디바이스, 클론 앱 사용자 등)를 식별하고 차단하는 데 활용할 수 있다.서비스에 이 API를 어떻게 활용해 어뷰저를 차단하고, 어떤 값들을 어떤 방식으로 활용할 수 있는지 알아보자.Play Integrity API란?Play Integrity API는 사용자의 디바이스와 앱이 정상적인 환경에서 실행되고 있는지 확인할 수 있..

어뷰징 방지 2025.10.12

Promise.all() VS Promise.allSettled() 비동기 작업 실행하기

배경배치 작업에 작업 실패 시 경보를 추가하는 작업을 진행했다.그런데 Promise.allSettled() 메서드를 실행하면서 이 구문을 try catch로 묶어 처리하는 코드를 발견했다.Promise.allSettled()는 병렬 작업 중 에러가 발생하더라도 호출부에서 에러가 throw 되지 않는다.비동기 작업 처리를 위해 흔히 사용되는 Promise.all()과 Promise.allSettled()에 대해 알아보자. Promise.all()Promsie.all()은 일반적으로 다음 코드를 실행하기 전에, 서로 연관된 비동기 작업 여러 개가 모두 실행되어야 할 때 사용된다. 결과값으로 실행된 프로미스들의 결과값을 담은 배열을 반환한다.결과값의 순서는 매개변수로 전달된 프로미스 순서와 동일하다.// 비동..

Node.js/JavaScript 2025.09.14

HTTP ETag 응답 헤더 (+ If-Match, If-None-Match 요청 헤더)

ETag란?Etag는 http 응답 헤더의 일종으로,특정 버전의 리소스를 식별하는 식별자이다. ETag는 리소스의 지문과 같은 역할로,만약 특정 URL 의 리소스가 변경된다면, 새로운 ETag 가 생성된다.ETag를 비교하면 리소스가 동일한지 빠르게 판단할 수 있다. 리소스가 변동 없고 ETag가 동일하다면 서버는 새로운 응답을 보낼 필요가 없기 때문에캐쉬를 더 효율적으로 사용할 수 있고, 대역폭 사용량을 줄일 수 있다. 만약 리소스가 변경되었다면,"mid-air collisions"라는 리소스 간의 동시 다발적 수정 및 덮어쓰기 현상을 막는데 유용하다.문법ETag: W/""ETag: "" Weak ETag(W/) 는 리소스가 실질적으로 같은 의미를 가진다면 동일하다고 간주하는 방식이다.비트 단위로는 달..

Prisma 컬럼 삭제 에러 & Select문 동작 방식

이슈 발생NestJS, Prisma, MySQL 환경의 프로젝트에서 MySQL 테이블의 컬럼을 삭제하는 작업을 진행했다.(이하에서는 해당 컬럼을 "컬럼a"라고 칭하겠다.)애플리케이션 코드에서도 컬럼a를 참조하는 모든 코드를 확인하고,컬럼a를 사용하지 않도록 수정했다.수정된 코드가 포함된 API들은 배치 작업 용이었어서,배포 도중 실시간 트래픽이 없어DB 스키마 변경과 애플리케이션 코드 배포 사이 시간 동안의 이슈는 고려하지 않았다. 그런데 컬럼a를 전혀 참조하지 않는 실시간 트래픽이 많은 API에서해당 시간 동안 에러가 발생했다. 원인처음엔 컬럼a를 명시적으로 사용하는 곳이 없는 API라 에러가 발생한 이유를 이해할 수 없었다.그런데 Prisma가 생성하는 쿼리를 확인해보니,원인을 알 수 있었다. 이슈의..

Node.js 2025.08.17

Github Actions로 EC2 배포 자동화하기 (feat. NestJS, prisma)

이슈 발생사이드 프로젝트 배포를 수동으로 진행하고 있었다.코드 변경 사항이 발생한다면 EC2 인스턴스에 접속하여 git pull origin main으로 코드를 내려 받아서,npx prisma generate, npm run build를 실행하여 빌드하고, pm2로 restart 시켰다. 어느날 평소와 같이 변경 사항을 pull 받고, build를 실행하는데cpu 사용량이 100%에 도달하여 인스턴스가 먹통이 됐다.인스턴스를 재부팅해야 했다. 사용 중인 인스턴스 유형은 t2.micro인데, 비용 상 인스턴스 유형을 업그레이드 하고 싶지는 않았다. 결국 build는 다른 서버에서 하고,build 산출물을 EC2 인스턴스에 업로드하여 EC2에서는 서버 실행만 하는 것이 옳다고 판단했다.이를 Github Ac..

MySQL 복제(레플리카) 설정하기

복제란?복제는 한 서버에서 다른 서버로 데이터가 동기화되는 것을 말한다.소스(Source) 서버: 원본 데이터를 가진 서버레플리카(Replica) 서버: 복제된 데이터를 가지는 서버소스 서버에서 데이터 및 스키마에 대한 변경이 최초로 발생한다. 레플리카 서버에서는 이러한 변경 내역을 소스 서버로부터 전달 받아 자신이 가지고 있는 데이터에 반영함으로써 소스 서버에 저장된 데이터와 동기화 시킨다. 복제의 목적은 주로 다음 4가지이다.스케일 아웃(Scale-out)데이터 백업레플리카 서버를 데이터 분석용 서버로 사용데이터의 지리적 분산복제 아키텍처복제 아키텍처를 이해하기 위해서두 가지 로그를 알아두어야 한다.바이너리 로그(Binary Log): MySQL 서버에서 발생하는 모든 변경 사항을 순서대로 기록한다...

DataBase/MySQL 2025.07.20

TypeScript enum (VS as const)

개발 중 type을 명확히 하고,코드의 예측 가능성을 높이기 위해 enum을 자주 사용한다. TypeScript enum에 대해 자세히 알아보자. 개념enum(열거형)은 TypeScript가 제공하는 기능(문법) 중 하나다.enum으로 이름이 있는 상수들의 집합을 정의할 수 있다.enum을 사용하면 코드의 의도를 전달하기 용이하고,여러 값들을 하나로 묶어 그 집합의 의미를 전달하기 쉽다. enum에는 숫자 enum과 문자 enum이 있다. 숫자 열거형(Numeric enums)enum은 "enum" 키워를 사용해 정의한다.enum Direction { Up = 1, Down, Left, Right,} 위 코드에서 Up이 1로 초기화됐다.그 외 값은 초기화하지 않아도, 자동으로 1씩 증가된 값을 갖..

Node.js/TypeScript 2025.07.06

MySQL 콜레이션 (feat. 정렬, 비교)

회사 업무 중 MySQL5.7을 사용하던 당시 생성된 테이블과 이후 생성된 테이블의 COLLATION이 일치하지 않아,두 컬럼의 JOIN 시 에러가 발생하는 상황이 있었다. 둘 중 하나의 컬럼의 COLLATION을 명시적으로 변경하여야 JOIN이 가능했다. 이러한 이슈가 다시 발생하지 않도록 콜레이션에 대해 알아보자.콜레이션이란콜레이션은 문자열 컬럼의 값에 대한 비교나 정렬 순서를 위한 규칙을 의미한다.비교나 정렬 작업에서영어 대소문자를 같은 것으로 처리할지더 크거나 작은 것으로 판단할지에 대한 규칙을 정의하는 것이다. 따라서 각 문자열 컬럼의 값을 비교하거나 정렬할 때는문자 집합뿐 아니라 콜레이션의 일치 여부에 따라 결과가 달라지며쿼리의 성능 또한 상당한 영향을 받는다. 콜레이션의 특징하나의 문자 집합..

DataBase/MySQL 2025.06.22

ESLint, Prettier 알아보기

NestJS를 사용하면 eslint, prettier의 설정 파일을 자동으로 생성해주기 때문에깊이 생각하지 않고 사용하곤 했다. 그러나 두 기능의 설정을 조정하여 코드의 퀄리티를 높이고동료들과의 협업을 원할하게 할 수 있다. ESLint, Prettier에 대해 알아보자. PrettierPrettier(프리티어)는 코드 포매터(Code Formatter)로,코드의 스타일(모양)을 자동으로 정리해주는 도구이다.사람이 아닌 도구가 포맷팅을 맡도록 하여 개발자 간 코딩 스타일 충돌을 없애는 데 큰 도움을 준다. Prettier는JS, TS, CSS, HTML, JSON, YAML 등 다양한 언어를 지원한다.VsCode와 같은 코드 에디터와 연동하여 저장 시 자동으로 포맷팅 되게 할 수 있다.주로 ESLint와..

Node.js 2025.06.08

Docker ECR buildspec.yml 태그의 중요성

최근 ECR Docker 이미지를 사용해, code pipeline으로 배포 자동화해둔 서버에서상용 인스턴스 추가 시 테스트 도커 이미지를 사용될 수 있는 이슈가 발견됐다. 아래가 이슈가 있던 buildspec.yml 이다.( 참고로 이 buildspec은 아래와 같은 조건 하에서 사용된다. )코드파이프라인, 코드빌드, ECR, 빈스톡을 사용하여 배포할 때 사용ECR 리전과 코드빌드 리전이 동일해야 함코드빌드 환경변수에 DATABASE_URL 설정 필요Dockerfile 별도 작성 필요version: 0.2phases: pre_build: commands: - export AWS_ACCOUNT=$(aws sts get-caller-identity --query Account --outpu..

환경 2025.05.25
728x90