๋ชฉ๋ก์ ์ฒด ๊ธ (1005)
๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ์ ์ ์ ๊ฒ์๋ฌผ์ ๊ด๊ณ ํ์ฑ ํด์ฃผ๊ธฐ ํ์ฌ ์ ์ ๋ ๊ฒ์๋ฌผ์ ์์ฑํ ๋ ๊ทธ ๋์ ๊ด๊ณ ์ค์ ์ด ์์ ๊ฒ์๋ฌผ ์์ฑ ์, ์ด๋ค ์ ์ ๊ฐ ์์ฑํ๋์ง ์ ๋ณด ๋ฃ์ด์ผ ํจ ๐ ์ ์ ์ ๊ฒ์๋ฌผ ๋ฐ์ดํฐ์ ๊ด๊ณ ํ์ฑ 1) ๊ด๊ณ๋ฅผ ํ์ฑํ๊ธฐ ์ํด์ ์ํฐํฐ์ ์๋ก ๊ฐ์ ํ๋๋ฅผ ๋ฃ์ด์ผ ํจ 2) ํ๋ผ๋ฏธํฐ - Type - InverseSide (board ์์ ์ ์ ๋ก ์ ๊ทผํ๋ ค๋ฉด board.user ๋ก ์ ๊ทผํด์ผ ํจ) - Option (eager : true ์ผ ๋ user ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ๋ board ๋ ๊ฐ์ด ๊ฐ์ ธ์ด) user (OneToMany) => board (ManyToOne) ๐งธ ๊ฒ์๋ฌผ ์์ฑํ ๋ ์ ์ ์ ๋ณด ๋ฃ์ด์ฃผ๊ธฐ ๊ฒ์๋ฌผ ์์ฑ ์์ฒญ -> ํค๋ ์์ ์๋ ํ ํฐ์ผ๋ก ์ ์ ์ ๋ณด-> ์ ์ ์ ๋ณด์ ๊ฒ์๋ฌผ..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ์ธ์ฆ๋ ์ ์ ๋ง ๊ฒ์๋ฌผ ๋ณด๊ณ ์ธ ์ ์๊ฒ ํ๊ธฐ ๐ ์ ์ ์๊ฒ ๊ฒ์๋ฌผ ์ ๊ทผ ๊ถํ ์ฃผ๊ธฐ ์ธ์ฆ์ ๊ดํ ๋ชจ๋์ board ๋ชจ๋์ ์ธ ์ ์์ด์ผ ํ๋ฏ๋ก, board module ์์ ์ธ์ฆ ๋ชจ๋ imports ํ ๐ UseGuards (AuthGuard()) ์ฌ๋์ด ์์ฒญ์ ์ค ๋ ์ฌ๋ฐ๋ฅธ ํ ํฐ์ ๊ฐ์ง๊ณ ์์ฒญ์ ์ฃผ๋์ง ๋ณธ ํ์ ๊ฒ์๋ฌผ์ ์ ๊ทผ ํ ๊ถํ ์ค AuthGuard (์ธ์ฆ ๋ฏธ๋ค์จ์ด) ๋ ๊ฐ๊ฐ์ ๋ผ์ฐํธ ๋ณ๋ก ์ค ์ ์๊ณ , ํ๋ฒ์ ํ๋์ ์ปจํธ๋กค๋ฌ ์์ ๋ค์ด์๋ ๋ชจ๋ ๋ผ์ฐํฐ ์ค ์ ์์ ๐ boards.controller.ts // ๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ํด๋ผ์ด์ธํธ์ ์๋ต์ ๋ฐํํจ // @Controller ๋ฐ์ฝ๋ ์ดํฐ๋ก ํด๋์ค๋ฅผ ๋ฐ์ฝ๋ ์ด์ ํ์ฌ ์ ์ํจ // Handler : @Get..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ NestJS ๐งธ ์ปค์คํ ๋ฐ์ฝ๋ ์ดํฐ ์์ฑํ๊ธฐ ๐ get-decorator.ts import { ExecutionContext, createParamDecorator } from "@nestjs/common"; import { User } from "./user.entity"; // ์ปค์คํ ๋ฐ์ฝ๋ ์ดํฐ ์์ฑํจ // req.user ๊ฐ ์๋ user ํ๋ผ๋งํฐ๋ก ๋ฐ๋ก ์ ์ ๊ฐ์ฒด ๊ฐ๊ณ ์ค๊ธฐ export const GetUser = createParamDecorator((data, ctx: ExecutionContext): User => { const req = ctx.switchToHttp().getRequest(); return req.user; }) ๐ auth.controller.ts ..
=> ๋ฐ๋ผํ๋ฉด์ ๋ฐฐ์ฐ๋ 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() //..