목록개발/nest.js (18)
![](http://i1.daumcdn.net/thumb/C400x400/?fname=https://blog.kakaocdn.net/dn/wvFNw/btsGVfWZFPr/akG8pk8RH4w3NIvwcJt1qK/img.png)
GCP 버킷을 세팅하는 방법은 구글에 많이 나와 있으니, Nest.js 환경에서 GCP storage keyFile 을 활용하여 파일을 업로드 하는 방법을 다룬다.필요한 라이브러리yarn add multer @nestjs/platform-express @google-cloud/storageyarn add -D @types/multermulter // 파일 업로드 처리 미들웨어 라이브러리@nestjs/platform-express // nest.js 환경에서 express의 모든 기능을 사용하게 해주는 라이브러리 소스 코드 길이가 짧지 않으므로, 필요한 설명은 주석으로 대체한다. // file.controller.tsimport { Controller, Post, UploadedFiles, Us..
![](http://i1.daumcdn.net/thumb/C400x400/?fname=https://blog.kakaocdn.net/dn/bQFoja/btsARWvkPCp/BjVRLfJAJ7mk5BP4KMz1c0/img.png)
먼저 class-validator란, 자바스크립트 또는 타입스크립트에서, 객체의 유효성을 검사하고 검증하는데 도움을 주는 라이브러리다. 이를 사용하면 다양한 유효성 검사 규칙을 정의하고 이를 객체에 적용할 수 있다는 장점이 있다. (예를 들어, 이메일 주소가 올바른 형식인지 확인하거나 비밀번호가 일치하는지 확인하는 등의 검증 규칙을 정의할 수 있다.) 아래는 class-validator를 사용하여, user DTO인 nickname의 길이가 1에서 50 사이인지 검증하는 것을 보여준다. nickname의 길이가 규정한 1보다 작거나, 50보다 클 경우 'Bad Request' 에러를 자동적으로 반환한다. import { Field, InputType } from '@nestjs/graphql'; impo..
![](http://i1.daumcdn.net/thumb/C400x400/?fname=https://blog.kakaocdn.net/dn/nNuWX/btr0aVTJBOF/eMXqayMcxE3pF6ceuchIEk/img.png)
미래의 나에게 yarn add redis yarn add cache-manager@4.1.0 yarn add cache-manager-redis-store@2.0.0 yarn add --dev @types/cache-manager-redis-store yarn add jsonwebtoken 기존에 만들어 둔 로그인 프로세스의 경우, refreshToken 이 만료되지 않으면 로그아웃이 되지 않는다는 단점이 있었다. 따라서 이번에는 제대로 된 로그아웃 프로세스를 구현하려고 하는데, 이번에는 redis 를 이용하여 API 를 만들어 보도록 한다. about redis 2023.02.13 - [코딩/알쓸코잡] - Redis Redis Redis Redis(REmote DIctionary Server) 란, 비..
![](http://i1.daumcdn.net/thumb/C400x400/?fname=https://blog.kakaocdn.net/dn/beFUA5/btrZkRv8XaB/VYP0mOcvNKCfFzeqGcqxUk/img.png)
미래의 나에게 포트원 SDK PG사 & 카드사 프로세스에 대한 간단한 이해 웹 결제에 대한 프로세스는 다음과 같이 이루어진다. 1. 구매자가 구매할 상품에 대한 정보와 금액을 판매자에게 전달 2. 판매자는 전달받은 금액을 PG사에게 결제해줄 것을 요청 3. PG사는 요청받은 정보를 은행사에게 다시 결제 요청 4. 은행사는 요청받은 금액을 구매자의 계좌에서 출금 후 PG사로 전달 5. PG사는 판매자에게 금액을 전달 (일정량의 수수료를 제외) 6. 판매자는 금액 확인 후, 구매자에게 상품 배송 **PG사 : Payment Gateway 의 준말로, 구매자와 판매자 사이의 결제를 대행해주는 역할을 담당한다. 대표적으로 KG이니시스 / NHN / KCP , 모바일 환경으로는 KG모빌리언스, 다날, 카카오페이 ..
![](http://i1.daumcdn.net/thumb/C400x400/?fname=https://blog.kakaocdn.net/dn/cOOvAa/btrYWapzw1t/AHgkNEKDb2Y7fgokApKfF0/img.png)
2023.02.11 - [코딩/알쓸코잡] - 소셜 로그인 프로세스 미래의 나에게 구글 passport-oauth 설치 // 구글 yarn add passport-google-oauth20 yarn add --dev @types/passport-google-oauth20 // 카카오 yarn add --dev @types/passport-kakao yarn add passport-kakao // 네이버 yarn add passport-naver-v2 yarn add --dev @types/passport-naver 오늘은 소셜 로그인 구현에 대해 포스팅한다. 구현에 대한 구체적인 과정은 위에 링크를 남겨두었다. 먼저, 내가 직접 구글로그인이 정상실행되는지 확인할 수 있도록 프론트엔드에서 보여지는 html ..
![](http://i1.daumcdn.net/thumb/C400x400/?fname=https://blog.kakaocdn.net/dn/EAbiW/btrYSDGqfbP/UeSRkOTBKoO4PjNcIhApKK/img.png)
이전 포스팅에서는 accessToken 발급을 구현하여 인가하는 방법까지 다뤘다. 허나, accessToken 만으로는 사실 부족한데, accessToken 은 해킹을 당했을 경우 보안에 취약할 뿐더러 유효기간이 짧은 토큰의 경우 그만큼 사용자에게 로그인(accessToken)을 강요하여 불편하다는 단점이 있기 때문이다. 따라서 이러한 점들을 보안하기 위해서 만들어진 것이 refreshToken. refreshToken 은 로그인을 완료했을 때 accessToken 과 함께 발급되며 accessToken 보다 유효기간이 길다. refreshToken 의 유효기간이 만료되면 사용자는 새로 로그인을 하게 되는데 이 또한 해킹의 가능성이 있기 때문에 적절한 유효기간 설정이 필요하다. accessToken : ..
![](http://i1.daumcdn.net/thumb/C400x400/?fname=https://blog.kakaocdn.net/dn/DRutY/btrYLtCxWXo/idvzeDRBhVu4tTlwSV4rh0/img.png)
미래의 나에게 jwt 패키지 설치 / bcrypt 패키지 설치 yarn add @nestjs/jwt passport-jwt yarn add @nestjs/passport yarn add --dev @types/passport-jwt yarn add bcrypt yarn add --dev @types/bcrypt 2023.02.10 - [코딩/알쓸코잡] - 인증(Authentication) & 인가(Authorization) 2023.01.30 - [코딩/알쓸코잡] - JWT (JSON Web Token) 이전 포스팅과 연결고리가 많은 포스팅이다. JWT (Jason Web Token) JWT 는 유저를 인증 / 식별하기 위한 토큰 기반의 인증이라고 볼 수 있다. JWT 는 토큰 자체에 [사용자의 권한 정..
![](http://i1.daumcdn.net/thumb/C400x400/?fname=https://blog.kakaocdn.net/dn/bK22TL/btrYINu9zn7/hQANbzpeKbhNhmxSngsHd1/img.png)
미래의 나에게 bcrypt 라이브러리 설치 yarn add bcrypt yarn add --dev @types/bcrypt 이번 포스팅에서는 이전에 포스팅했던 product API 구현과 다른 부분에 대해 다룬다. Create // Hashing & ConflictException // users.service.ts async create({ createUserInput }: IUsersServiceCreate): Promise { const { password, email, ...rest } = createUserInput; const user = await this.findOneByEmail({ email }); if (user) throw new ConflictException('이미 등록된 이메일..