๋ชฉ๋ก์ „์ฒด ๊ธ€ (1005)

๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[Nest JS ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ] (31) ์œ ์ €์™€ ๊ฒŒ์‹œ๋ฌผ์˜ ๊ด€๊ณ„ ํ˜•์„ฑ ํ•ด์ฃผ๊ธฐ

=> ๋”ฐ๋ผํ•˜๋ฉด์„œ ๋ฐฐ์šฐ๋Š” NestJS ๐Ÿงธ ์œ ์ €์™€ ๊ฒŒ์‹œ๋ฌผ์˜ ๊ด€๊ณ„ ํ˜•์„ฑ ํ•ด์ฃผ๊ธฐ ํ˜„์žฌ ์œ ์ €๋‚˜ ๊ฒŒ์‹œ๋ฌผ์— ์ƒ์„ฑํ•  ๋Œ€ ๊ทธ ๋‘˜์˜ ๊ด€๊ณ„ ์„ค์ •์ด ์—†์Œ ๊ฒŒ์‹œ๋ฌผ ์ƒ์„ฑ ์‹œ, ์–ด๋–ค ์œ ์ €๊ฐ€ ์ƒ์„ฑํ–ˆ๋Š”์ง€ ์ •๋ณด ๋„ฃ์–ด์•ผ ํ•จ ๐ŸŽ€ ์œ ์ €์™€ ๊ฒŒ์‹œ๋ฌผ ๋ฐ์ดํ„ฐ์˜ ๊ด€๊ณ„ ํ˜•์„ฑ 1) ๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์—”ํ‹ฐํ‹ฐ์— ์„œ๋กœ ๊ฐ„์˜ ํ•„๋“œ๋ฅผ ๋„ฃ์–ด์•ผ ํ•จ 2) ํŒŒ๋ผ๋ฏธํ„ฐ - Type - InverseSide (board ์—์„œ ์œ ์ €๋กœ ์ ‘๊ทผํ•˜๋ ค๋ฉด board.user ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•จ) - Option (eager : true ์ผ ๋•Œ user ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ board ๋„ ๊ฐ™์ด ๊ฐ€์ ธ์˜ด) user (OneToMany) => board (ManyToOne) ๐Ÿงธ ๊ฒŒ์‹œ๋ฌผ ์ƒ์„ฑํ•  ๋•Œ ์œ ์ € ์ •๋ณด ๋„ฃ์–ด์ฃผ๊ธฐ ๊ฒŒ์‹œ๋ฌผ ์ƒ์„ฑ ์š”์ฒญ -> ํ—ค๋” ์•ˆ์— ์žˆ๋Š” ํ† ํฐ์œผ๋กœ ์œ ์ € ์ •๋ณด-> ์œ ์ € ์ •๋ณด์™€ ๊ฒŒ์‹œ๋ฌผ..

[Nest JS ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ] (30) ์ธ์ฆ๋œ ์œ ์ €๋งŒ ๊ฒŒ์‹œ๋ฌผ ๋ณด๊ณ  ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ

=> ๋”ฐ๋ผํ•˜๋ฉด์„œ ๋ฐฐ์šฐ๋Š” NestJS ๐Ÿงธ ์ธ์ฆ๋œ ์œ ์ €๋งŒ ๊ฒŒ์‹œ๋ฌผ ๋ณด๊ณ  ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ๐ŸŽ€ ์œ ์ €์—๊ฒŒ ๊ฒŒ์‹œ๋ฌผ ์ ‘๊ทผ ๊ถŒํ•œ ์ฃผ๊ธฐ ์ธ์ฆ์— ๊ด€ํ•œ ๋ชจ๋“ˆ์„ board ๋ชจ๋“ˆ์— ์“ธ ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ, board module ์—์„œ ์ธ์ฆ ๋ชจ๋“ˆ imports ํ•˜ ๐ŸŽ€ UseGuards (AuthGuard()) ์‚ฌ๋žŒ์ด ์š”์ฒญ์„ ์ค„ ๋•Œ ์˜ฌ๋ฐ”๋ฅธ ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ์š”์ฒญ์„ ์ฃผ๋Š”์ง€ ๋ณธ ํ›„์— ๊ฒŒ์‹œ๋ฌผ์— ์ ‘๊ทผ ํ•  ๊ถŒํ•œ ์คŒ AuthGuard (์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด) ๋Š” ๊ฐ๊ฐ์˜ ๋ผ์šฐํŠธ ๋ณ„๋กœ ์ค„ ์ˆ˜ ์žˆ๊ณ , ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ปจํŠธ๋กค๋Ÿฌ ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ชจ๋“  ๋ผ์šฐํ„ฐ ์ค„ ์ˆ˜ ์žˆ์Œ ๐ŸŽ€ boards.controller.ts // ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•จ // @Controller ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ํด๋ž˜์Šค๋ฅผ ๋ฐ์ฝ”๋ ˆ์ด์…˜ํ•˜์—ฌ ์ •์˜ํ•จ // Handler : @Get..

[Nest JS ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ] (28) Passport, JWT ๋ฅผ ์ด์šฉํ•ด์„œ ํ† ํฐ ์ธ์ฆ ํ›„ ์œ ์ € ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

=> ๋”ฐ๋ผํ•˜๋ฉด์„œ ๋ฐฐ์šฐ๋Š” 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,..

[Nest JS ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ] (27) JWT ๋ฅผ ์ด์šฉํ•ด์„œ ํ† ํฐ ์ƒ์„ฑํ•˜๊ธฐ

=> ๋”ฐ๋ผํ•˜๋ฉด์„œ ๋ฐฐ์šฐ๋Š” NestJS ๐Ÿงธ JWT (JSON Web Token) ๋กœ๊ทธ์ธํ•œ ๊ณ ์œ  ์œ ์ €๋ฅผ ์œ„ํ•œ ํ† ํฐ์„ ์ƒ์„ฑํ•ด์•ผ ํ•จํ† ํฐ์„ ์ƒ์„ฑํ•  ๋•Œ JWT ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•จ ๋‹น์‚ฌ์ž๊ฐ„์— ์ •๋ณด๋ฅผ json ๊ฐœ์ฒด๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ์ปดํŒฉํŠธํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋Š” ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ (RFC 7519) ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „ํ•  ๋•Œ OR ์œ ์ €์˜ ๊ถŒํ•œ ๊ฐ™์€ ๊ฒƒ์„ ์ฒดํฌํ•  ๋•Œ ์‚ฌ์šฉํ•จ ๐Ÿงธ JWT ๊ตฌ์กฐ ๐ŸŽ€ Header ํ† ํฐ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ํฌํ•จ (ํƒ€์ž…, ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜, SHA256, RSA ..) ๐ŸŽ€ Payload ์œ ์ € ์ •๋ณด, ๋งŒ๋ฃŒ๊ธฐ๊ฐ„, ์ฃผ์ œ ๋“ฑ ๐ŸŽ€ Verify Signature ํ† ํฐ์ด ๋ณด๋‚ธ ์‚ฌ๋žŒ์— ์˜ํ•ด ์„œ๋ช…๋˜์—ˆ์œผ๋ฉฐ ์–ด๋–ค ์‹์œผ๋กœ๋“  ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•—๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์„œ๋ช… ํ—ค๋” ๋ฐ ํŽ˜์ด๋กœ๋“œ ์„ธ๊ทธ๋จผํŠธ, ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๋น„๋ฐ€ ๋˜๋Š” ๊ณต๊ฐœํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜..

[Nest JS ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ] (25) ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ํ•˜๊ธฐ

=> ๋”ฐ๋ผํ•˜๋ฉด์„œ ๋ฐฐ์šฐ๋Š” 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..

[Nest JS ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ] (24) ์œ ์ € ์ด๋ฆ„์— ์œ ๋‹ˆํฌํ•œ ๊ฐ’ ์ฃผ๊ธฐ

=> ๋”ฐ๋ผํ•˜๋ฉด์„œ ๋ฐฐ์šฐ๋Š” NestJS ๐Ÿงธ ์œ ์ € ์ด๋ฆ„์— ์œ ๋‹ˆํฌํ•œ ๊ฐ’ ์ฃผ๊ธฐ ์œ ์ € ์ƒ์„ฑํ•  ๋•Œ ์œ ์ € ์ด๋ฆ„์ด ์ด๋ฏธ ์‚ฌ์šฉ๋˜๋Š” ์œ ์ € ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ ค ํ•œ๋‹ค๋ฉด ์—๋Ÿฌ ๋ณด๋‚ด๊ธฐ 1) repository ์—์„œ findOne ๋ฉ”์†Œ๋“œ ์ด์šฉํ•˜์—ฌ ์ด๋ฏธ ๊ฐ™์€ ์œ ์ € ์ด๋ฆ„์„ ๊ฐ€์ง„ ์•„์ด๋””๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ ์—†๋‹ค๋ฉด ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ -> ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฒ˜๋ฆฌ๋ฅผ ๋‘๋ฒˆ ํ•ด์•ผ ํ•จ 2) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ๋ฒจ์—์„œ ๋งŒ์•ฝ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์œ ์ €๊ฐ€ ์žˆ๋‹ค๋ฉด ์—๋Ÿฌ ๋˜์ง€๊ธฐ ๐Ÿงธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ๋ฒจ์—์„œ ๋งŒ์•ฝ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์œ ์ €๊ฐ€ ์žˆ๋‹ค๋ฉด ์—๋Ÿฌ ๋˜์ง€๊ธฐ ๐ŸŽ€ user.entity.ts import { BaseEntity, Column, Entity, PrimaryColumn, PrimaryGeneratedColumn, Unique } from "typeorm"; @Entity() //..