๋ชฉ๋ก๐ฉโ๐ป ๋ฐฑ์๋(Back-End)/Nest js (38)
๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?

=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ Passport, JWT ๋ฅผ ์ด์ฉํด์ ํ ํฐ ์ธ์ฆ ํ ์ ์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ JWT ์ด์ฉํด์ ์ ์ ๊ฐ ๋ก๊ทธ์ธ ํ ๋ ํ ํฐ ์์ฑ ์ ์ ๊ฐ ์์ฒญ ๋ณด๋ผ ๋ ์์ฒญ ์์ ์๋ Header ์ ํ ํฐ ๋ฃ์ (์์ฒญ ์์ Payload ์์) ํ ํฐ์ด ์ ํจํ ํ ํฐ์ธ์ง ์๋ฒ์์ secret text ์ด์ฉํ์ฌ ์์๋ด๋ฉด, Payload ์์ ์ ์ ์ด๋ฆ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ด => ์ด๋ฌํ ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ํด์ฃผ๋ ๋ชจ๋์ด Passport ๐งธ Passport //passport-jwt ๋ชจ๋์ ์ํ ํ์ ์ ์ ๋ชจ๋ @types/passport-jwt npm install @types/passport-jwt --save ๐ jwt.strategy.ts import { Injectable,..

=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ JWT (JSON Web Token) ๋ก๊ทธ์ธํ ๊ณ ์ ์ ์ ๋ฅผ ์ํ ํ ํฐ์ ์์ฑํด์ผ ํจํ ํฐ์ ์์ฑํ ๋ JWT ๋ชจ๋์ ์ฌ์ฉํจ ๋น์ฌ์๊ฐ์ ์ ๋ณด๋ฅผ json ๊ฐ์ฒด๋ก ์์ ํ๊ฒ ์ ์กํ๊ธฐ ์ํ ์ปดํฉํธํ๊ณ ๋ ๋ฆฝ์ ์ธ ๋ฐฉ์์ ์ ์ํ๋ ๊ฐ๋ฐฉํ ํ์ค (RFC 7519) ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ์ ํ ๋ OR ์ ์ ์ ๊ถํ ๊ฐ์ ๊ฒ์ ์ฒดํฌํ ๋ ์ฌ์ฉํจ ๐งธ JWT ๊ตฌ์กฐ ๐ Header ํ ํฐ์ ๋ํ ๋ฉํ ๋ฐ์ดํฐ ํฌํจ (ํ์ , ํด์ฑ ์๊ณ ๋ฆฌ์ฆ, SHA256, RSA ..) ๐ Payload ์ ์ ์ ๋ณด, ๋ง๋ฃ๊ธฐ๊ฐ, ์ฃผ์ ๋ฑ ๐ Verify Signature ํ ํฐ์ด ๋ณด๋ธ ์ฌ๋์ ์ํด ์๋ช ๋์์ผ๋ฉฐ ์ด๋ค ์์ผ๋ก๋ ๋ณ๊ฒฝ๋์ง ์์๋์ง ํ์ธํ๋ ์๋ช ํค๋ ๋ฐ ํ์ด๋ก๋ ์ธ๊ทธ๋จผํธ, ์๋ช ์๊ณ ๋ฆฌ์ฆ, ๋น๋ฐ ๋๋ ๊ณต๊ฐํค๋ฅผ ์ฌ์ฉํ..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ ํ์ ๊ฐ์ ํ๊ณ , ๋น๋ฐ๋ฒํธ ์ํธํ ์๋ฃ! ๊ฐ์ ํ ์์ด๋๋ก ๋ก๊ทธ์ธ ํ๊ธฐ ๐ ๊ธฐ๋ฅ ๊ตฌํ ์์ 1) ํด๋ผ์ด์ธํธ์์ ์ ๊ณต ๋ฐ์ ์์ด๋๋ฅผ ์ด์ฉํด ํด๋น ์์ด๋๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ ์์ด๋์ธ์ง ํ์ธ 2) ์๋ ์์ด๋๋ผ๋ฉด ์ ๊ณต ๋ฐ์ ๋น๋ฐ๋ฒํธ์ ์๋ ์์ด๋์ ๋น๋ฐ๋ฒํธ์ ๋น๊ตํ๊ธฐ ๐ user.service.ts import { Injectable, UnauthorizedException } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { UserRepository } from './user.repository'; import { AuthCredentialsDto ..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ๋น๋ฐ๋ฒํธ ์ํธํ ํ๊ธฐ ์ ์ ๋ฅผ ์์ฑํ ๋ ๋น๋ฐ๋ฒํธ๊ฐ ๊ทธ๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋จ ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํํด์ ์ ์ฅํ๊ธฐ ๐ bcryptjs bcrypt ๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํ ํ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ธฐ npm install bcryptjs --save ๐งธ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ 1) ์๋ณธ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ทธ๋๋ก ์ ์ฅ 2) ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํ ํค์ ํจ๊ป ์ํธํ (์๋ฐฉํฅ) 3) SHA256 ๋ฑ hash ๋ก ์ํธํํด์ ์ ์ฅ (๋จ๋ฐฉํฅ) ๐ user.repository.ts import { EntityRepository, Repository } from "typeorm"; import { User } from "./user.entity"; import { AuthCredentialsDto..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ์ ์ ์ด๋ฆ์ ์ ๋ํฌํ ๊ฐ ์ฃผ๊ธฐ ์ ์ ์์ฑํ ๋ ์ ์ ์ด๋ฆ์ด ์ด๋ฏธ ์ฌ์ฉ๋๋ ์ ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ ค ํ๋ค๋ฉด ์๋ฌ ๋ณด๋ด๊ธฐ 1) repository ์์ findOne ๋ฉ์๋ ์ด์ฉํ์ฌ ์ด๋ฏธ ๊ฐ์ ์ ์ ์ด๋ฆ์ ๊ฐ์ง ์์ด๋๊ฐ ์๋์ง ํ์ธ ์๋ค๋ฉด ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ -> ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฒ๋ฆฌ๋ฅผ ๋๋ฒ ํด์ผ ํจ 2) ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๋ฒจ์์ ๋ง์ฝ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์ ์ ๊ฐ ์๋ค๋ฉด ์๋ฌ ๋์ง๊ธฐ ๐งธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๋ฒจ์์ ๋ง์ฝ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์ ์ ๊ฐ ์๋ค๋ฉด ์๋ฌ ๋์ง๊ธฐ ๐ user.entity.ts import { BaseEntity, Column, Entity, PrimaryColumn, PrimaryGeneratedColumn, Unique } from "typeorm"; @Entity() //..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ์ ์ ๋ฐ์ดํฐ ์ ํจ์ฑ ์ฒดํฌ ์ ์ ๋ฅผ ์์ฑํ ๋ ์ํ๋ ์ด๋ฆ์ ๊ธธ์ด, ๋น๋ฐ๋ฒํธ ๊ธธ์ด ๋ฑ ์ ํจ์ฑ ์ฒดํฌํ ์ ์๋๋ก Column์ ์กฐ๊ฑด ๋ฃ๊ธฐ ๐ Class-validator ์ ํจ์ฑ ์ฒดํฌ๋ฅผ ํ๊ธฐ ์ํด์๋ class-validator ๋ชจ๋ ์ฌ์ฉ Dto ์์ Request๋ก ๋ค์ด์ค๋ ๊ฐ์ ์ ์ํจ -> Dto ํ์ผ ๊ฐ๋ค ํ๋ํ๋์ class-validator ์ด์ฉํด์ ์ ํจ์ฑ ์กฐ๊ฑด ๋ฃ๊ธฐ ๐ auth-credentials.ts import { IsString, Matches, MinLength, MaxLength } from "class-validator"; export class AuthCredentialsDto { @IsString() @MinLength(4) @MaxLength(..

=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ํ์ ๊ฐ์ ๊ธฐ๋ฅ ๊ตฌํ ๐ user.repository.ts import { EntityRepository, Repository } from "typeorm"; import { User } from "./user.entity"; import { AuthCredentialsDto } from "./dto/auth-credential.dto"; @EntityRepository(User) export class UserRepository extends Repository { async createUser(authCredentialsDto: AuthCredentialsDto): Promise { const { username, password } = authCredentia..

=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ์ธ์ฆ ๊ธฐ๋ฅ ๊ตฌํ์ ์ํ ์ค๋น ๐CLS ๋ฅผ ์ด์ฉํ ๋ชจ๋, ์ปจํธ๋กค๋ฌ, ์๋น์ค ์์ฑ // auth ๋ชจ๋ ์์ฑ nest g module auth // auth ์ปจํธ๋กค๋ฌ ์์ฑ nest g controller auth --no-spec // auth ์๋น์ค ์์ฑ nest g service auth --no-spec ๐งธ User๋ฅผ ์ํ Entity ์์ฑ ์ ์ ์ ๋ํ ์ธ์ฆ์ ํด์ผํ๋ฏ๋ก, ์ ์ ๊ฐ ํ์ํจ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ํ ์ ์ Entity ์์ฑํ๊ธฐ ๐ user.entity.ts import { BaseEntity, Column, PrimaryColumn, PrimaryGeneratedColumn } from "typeorm"; export class User extends Base..