Guards
Last updated
Was this helpful?
Last updated
Was this helpful?
κ°λλ @Injectable()
λ°μ½λ μ΄ν°λ‘ μ£Όμμ΄ λ¬λ¦° ν΄λμ€μ
λλ€. κ°λλCanActivate
μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌν©λλ€.
κ°λλ λ¨λ
μ±
μμ΄ μμ΅λλ€. λ°νμμ μ‘΄μ¬νλ νΉμ 쑰건 (μ: κΆν, μν , ACL λ±)μ λ°λΌ μ§μ λ μμ²μ΄ λΌμ°νΈ νΈλ€λ¬μ μν΄ μ²λ¦¬λ μ§ μ¬λΆλ₯Ό κ²°μ ν©λλ€. μ΄λ₯Ό μ’
μ’
κΆνμ΄λΌκ³ ν©λλ€. μΈμ¦ (λ° μΌλ°μ μΌλ‘ 곡λ μμ
μΈ μΈμ¦)μ μΌλ°μ μΌλ‘ κΈ°μ‘΄ Express μμ© νλ‘κ·Έλ¨μ λ―Έλ€μ¨μ΄μ μν΄ μ²λ¦¬λμμ΅λλ€. ν ν° μ ν¨μ± κ²μ¬ λ° μμ±μ μμ²(Request)
κ°μ²΄μ μ°κ²°νλ κ²κ³Ό κ°μ κ²μ νΉμ κ²½λ‘ μ»¨ν
μ€νΈ (λ° ν΄λΉ λ©ν λ°μ΄ν°)μ κ°λ ₯νκ² μ°κ²°λμ΄ μμ§ μκΈ° λλ¬Έμ λ―Έλ€μ¨μ΄λ μΈμ¦μ μ ν©ν μ νμ
λλ€.
κ·Έλ¬λ λ―Έλ€μ¨μ΄λ λ³Έμ§μ μΌλ‘ λ°λ³΄μ
λλ€. next()
ν¨μλ₯Ό νΈμΆν ν μ΄λ€ νΈλ€λ¬κ° μ€νλ μ§ μ μ μμ΅λλ€. λ°λ©΄μ Guardsλ ExecutionContext
μΈμ€ν΄μ€μ μ‘μΈμ€ν μ μμΌλ―λ‘ λ€μμ 무μμ΄ μ€ν λ μ§ μ νν μ μ μμ΅λλ€. μμ²/μλ΅ μ£ΌκΈ°μ μ νν μμ μ μ²λ¦¬ λ‘μ§μ μ½μ
νκ³ μ μΈμ μΌλ‘ μ²λ¦¬ν μ μλλ‘ μμΈ νν°, νμ΄ν λ° μΈν°μ
ν°μ κ°μ΄ μ€κ³λμμ΅λλ€. μ΄λ κ² νλ©΄ μ½λλ₯Ό 건쑰νκ³ μ μΈμ μΌλ‘ μ μ§ν μ μμ΅λλ€.
info ννΈ κ°λλ κ° λ―Έλ€μ¨μ΄ νμ μ€νλμ§λ§, μΈν°μ ν° λ νμ΄νλ μ μ μ€νλ©λλ€.
μΈκΈ ν λ°μ κ°μ΄ κΆνμ λ°μ μ (μΌλ°μ μΌλ‘ νΉμ μΈμ¦λ μ¬μ©μ)μκ² μΆ©λΆν κΆνμ΄ μλ κ²½μ°μλ§ νΉμ κ²½λ‘λ₯Ό μ¬μ©ν μ μμ΄μΌ νκΈ° λλ¬Έμ Guardsμ νλ₯ν μ¬μ© μ¬λ‘μ
λλ€. μ°λ¦¬κ° κ΅¬μΆ ν AuthGuard
λ μ΄μ μΈμ¦λ μ¬μ©μλ₯Ό κ°μ ν©λλ€ (λ°λΌμ ν ν°μ΄ μμ² ν€λμ 첨λΆλμ΄ μμ). ν ν°μ μΆμΆνκ³ μ ν¨μ±μ κ²μ¬νκ³ μΆμΆλ μ 보λ₯Ό μ¬μ©νμ¬ μμ²μ μ§νν μ μλμ§ μ¬λΆλ₯Ό κ²°μ ν©λλ€.
validateRequest()
ν¨μ λ΄λΆμ λ
Όλ¦¬λ νμν λ§νΌ κ°λ¨νκ±°λ μ κ΅ν μ μμ΅λλ€. μ΄ μμ μμ μ 보νΈμκ° μμ²/μλ΅ μ£ΌκΈ°μ μ΄λ»κ² λ§λμ§ λ³΄μ¬μ€λλ€.
λͺ¨λ κ°λλ canActivate()
ν¨μλ₯Ό ꡬνν΄μΌν©λλ€. μ΄ ν¨μλ νμ¬ μμ²μ΄ νμ©λλμ§ μ¬λΆλ₯Ό λνλ΄λ 쑰건κ°μ λ°νν΄μΌ ν©λλ€. μλ΅μ λκΈ°μ λλ λΉλκΈ°μμΌλ‘ λ°ν ν μ μμ΅λλ€ (Promise
λλ Observable
μ ν΅ν΄). Nestλ λ¦¬ν΄ κ°μ μ¬μ©νμ¬ λ€μ μ‘°μΉλ₯Ό μ μ΄ν©λλ€.
trueλ₯Ό λ°ννλ©΄ μμ²μ΄ μ²λ¦¬λ©λλ€.
'false'λ₯Ό λ°ννλ©΄ Nestλ μμ²μ κ±°λΆν©λλ€.
canActivate()
ν¨μλ ExecutionContext
μΈμ€ν΄μ€λΌλ λ¨μΌ μΈμλ₯Ό μ·¨ν©λλ€. ExecutionContext
λ ArgumentsHost
μμ μμλ°μ΅λλ€. μμΈ νν° μ±ν°μμ μμ ArgumentsHost
λ₯Ό 보μμ΅λλ€. μ¬κΈ°μλ original νΈλ€λ¬λ‘ μ λ¬λ μΈμλ₯Ό κ°μΈλ λνΌμ΄λ©° μμ© νλ‘κ·Έλ¨μ μ νμ λ°λΌ λ€λ₯Έ μΈμ λ°°μ΄μ ν¬ν¨ν©λλ€. μ΄ μ£Όμ μ λν μμΈν λ΄μ©μ μμΈ νν° μ±ν°μ λ€μ μ°Έμ‘°νμμμ€.
ExecutionContext
λ ArgumentsHost
λ₯Ό νμ₯νμ¬ νμ¬ μ€ν νλ‘μΈμ€μ λν μΆκ° μ 보λ₯Ό μ 곡ν©λλ€. κ·Έ λͺ¨μ΅μ λ€μκ³Ό κ°μ΅λλ€.
getHandler()
λ©μλλ νΈμΆλ νΈλ€λ¬μ λν μ°Έμ‘°λ₯Ό 리ν΄ν©λλ€. getClass()
λ©μλλ μ΄ νΉμ νΈλ€λ¬κ° μνλ Controller
ν΄λμ€μ μ νμ 리ν΄ν©λλ€. μλ₯Ό λ€μ΄, νμ¬ μ²λ¦¬ λ μμ²μ΄ CatsController
μμ create()
λ©μλλ‘ μ§μ λ POST
μμ² μΈ κ²½μ°, getHandler()
λ create()
λ©μλμ λν μ°Έμ‘°λ₯Ό 리ν΄νκ³ getClass()
λ CatsController
type (μΈμ€ν΄μ€ μλ)μ λ°νν©λλ€.
νΉμ μν μ κ°μ§ μ¬μ©μλ§ μ‘μΈμ€ ν μ μλ λ³΄λ€ κΈ°λ₯μ μΈ λ³΄νΈ κΈ°λ₯μ ꡬμΆν΄ λ³΄κ² μ΅λλ€. κΈ°λ³Έ κ°λ ν νλ¦ΏμΌλ‘ μμνμ¬ λ€μ μΉμ μμ μμ±ν©λλ€. νμ¬λ‘μλ λͺ¨λ μμ²μ μ§νν μ μμ΅λλ€.
νμ΄ν λ° μμΈ νν°μ λ§μ°¬κ°μ§λ‘ κ°λλ 컨νΈλ‘€λ¬ λ²μ(controller-scoped), λ°©λ² λ²μ(method-scoped) λλ μ μ λ²μ(global-scoped) μΌ μ μμ΅λλ€. μλλ @UseGuards()
λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ μ»¨νΈλ‘€λ¬ λ²μμ 보νΈλλ₯Ό μ€μ νμ΅λλ€. μ΄ λ°μ½λ μ΄ν°λ λ¨μΌ μΈμ λλ μΌνλ‘ κ΅¬λΆλ μΈμ λͺ©λ‘μ μ¬μ©ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ ν λ²μ μ μΈμΌλ‘ μ μ ν κ°λ μΈνΈλ₯Ό μ½κ² μ μ©ν μ μμ΅λλ€.
info ννΈ
@UseGuards()
λ°μ½λ μ΄ν°λ@nestjs/common
ν¨ν€μ§μμ κ°μ Έμ΅λλ€.
μμμ μ°λ¦¬λ μΈμ€ν΄μ€ λμ μ λ‘€ κ°λ (RolesGuard) μ νμ μ λ¬νμ¬ νλ μ μν¬μ μΈμ€ν΄μ€νμ μμ‘΄μ± μ£Όμ μ κ°λ₯νκ² νμ΅λλ€. νμ΄ν λ° μμΈ νν°μ λ§μ°¬κ°μ§λ‘ λ΄λΆ μΈμ€ν΄μ€λ₯Ό μ λ¬ν μλ μμ΅λλ€.
μμ ꡬμ±μμ΄ μ»¨νΈλ‘€λ¬κ° μ μΈν λͺ¨λ νΈλ€λ¬μ κ°λλ₯Ό μ°κ²°ν©λλ€. κ°λκ° λ¨μΌ λ©μλμλ§ μ μ©λλλ‘ νλ €λ©΄ λ©μλ μμ€μμ @UseGuards()
λ°μ½λ μ΄ν°λ₯Ό μ μ©ν©λλ€.
μ μ κ°λλ₯Ό μ€μ νλ €λ©΄ Nest μ ν리μΌμ΄μ
μΈμ€ν΄μ€μ useGlobalGuards()
λ©μλλ₯Ό μ¬μ©νμμμ€.
warning μλ¦Ό νμ΄λΈλ¦¬λ μ±μ κ²½μ°
useGlobalGuards()
λ©μλλ κ²μ΄νΈμ¨μ΄ λ° λ§μ΄ν¬λ‘ μλΉμ€μ λν 보νΈλ₯Ό μ€μ νμ§ μμ΅λλ€. "νμ€"(νμ΄λΈλ¦¬λκ° μλ) λ§μ΄ν¬λ‘ μλΉμ€ μ±μ κ²½μ°useGlobalGuards()
λ κ°λλ₯Ό μ μμΌλ‘ λ§μ΄νΈν©λλ€.
μ μ κ°λλ λͺ¨λ 컨νΈλ‘€λ¬μ λͺ¨λ κ²½λ‘ μ²λ¦¬κΈ°μ λν΄ μ 체 μμ© νλ‘κ·Έλ¨μμ μ¬μ©λ©λλ€. μμ‘΄μ± μ£Όμ
μ κ΄μ μμ, λͺ¨λ μΈλΆμμ λ±λ‘λ μ μ κ°λ (μμ μμμμ κ°μ΄ useGlobalGuards()
λ‘)λ μμ‘΄μ±μ΄ μ£Όμ
λ μ μμ΅λλ€. μ΄λ λͺ¨λμ 컨ν
μ€νΈ λ°μμ μνλκΈ° λλ¬Έμ
λλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ€μ ꡬμ±μ μ¬μ©νμ¬ λͺ¨λ λͺ¨λμμ μ§μ κ°λλ₯Ό μ€μ ν μ μμ΅λλ€.
info ννΈ κ°λμ λν μμ‘΄μ± μ£Όμ μ μννκΈ° μν΄μ΄ μ κ·Ό λ°©μμ μ¬μ©ν λ, μ΄ κ΅¬μ±μ΄ μ¬μ©λλ λͺ¨λμ κ΄κ³μμ΄, κ°λλ μ€μ λ‘ μ μμ λλ€. μ΄λμμ ν΄μΌ ν©λκΉ? κ°λ (μ μμμ
RolesGuard
)κ° μ μλ λͺ¨λμ μ ννμμμ€. λν 컀μ€ν νλ‘ λ°μ΄λ λ±λ‘μ λ€λ£¨λ μ μΌν λ°©λ²μuseClass
κ° μλλλ€. μ¬κΈ°μ λν΄ μμΈν μμ보μμμ€.
μ°λ¦¬μ RolesGuard
κ° μλνκ³ μμ§λ§ μμ§ λλνμ§λ μμ΅λλ€. μ°λ¦¬λ μμ§ κ°μ₯ μ€μν λ³΄νΈ κΈ°λ₯μΈ μ€ν 컨ν
μ€νΈ(execution context)λ₯Ό νμ©νμ§ μμ΅λλ€. μμ§ μν μ΄λ κ° μ²λ¦¬κΈ°μ νμ©λλ μν μ λν΄μλ μμ§ μμ§ λͺ»ν©λλ€. μλ₯Ό λ€μ΄ CatsController
λ κ²½λ‘λ§λ€ λ€λ₯Έ κΆν 체κ³λ₯Ό κ°μ§ μ μμ΅λλ€. μΌλΆλ κ΄λ¦¬μλ§ μ¬μ©ν μ μκ³ λ€λ₯Έ μΌλΆλ λͺ¨λ μ¬λμκ² κ³΅κ°λ μ μμ΅λλ€. μ μ°νκ³ μ¬μ¬μ© κ°λ₯ν λ°©μμΌλ‘ μν κ³Ό κ²½λ‘λ₯Ό μ΄λ»κ² μΌμΉμν¬ μ μμ΅λκΉ?
μ¬μ©μ μ§μ λ©ν λ°μ΄ν°κ° μ¬μ©λλ κ³³μ
λλ€. Nestλ @SetMetadata()
λ°μ½λ μ΄ν°λ₯Ό ν΅ν΄ νΈλ€λ¬λ₯Ό λΌμ°νΈνκΈ° μν΄ μ»€μ€ν
λ©ν λ°μ΄ν°λ₯Ό 첨λΆνλ κΈ°λ₯μ μ 곡ν©λλ€. μ΄ λ©ν λ°μ΄ν°λ μ€λ§νΈ κ°λκ° κ²°μ μ λ΄λ €μΌ νλ λλ½λ μν λ°μ΄ν°λ₯Ό μ 곡ν©λλ€. @SetMetadata()
λ₯Ό μ¬μ©νμ¬ λ΄
μλ€ :
info ννΈ
@SetMetadata()
λ°μ½λ μ΄ν°λ@nestjs/common
ν¨ν€μ§μμ κ°μ Έμ΅λλ€.
μμ ꡬμ±μμ μ°λ¦¬λ roles
λ©ν λ°μ΄ν° (roles
κ° ν΅μ¬μ΄κ³ ['admin']
μ΄ νΉμ κ°μ)λ₯Ό create()
λ©μλμ 첨λΆνμ΅λλ€. μ΄κ²μ΄ μλνλ λμ κ²½λ‘μμ μ§μ @SetMetadata()
λ₯Ό μ¬μ©νλ κ²μ μ’μ§ μμ΅λλ€. λμ μλμ κ°μ΄ μμ λ§μ λ°μ½λ μ΄ν°λ₯Ό λ§λμμμ€.
μ΄ μ κ·Ό λ°©μμ ν¨μ¬ κΉ¨λνκ³ μ½κΈ° μ½κ³ κ°λ ₯νκ² μ
λ ₯λ©λλ€. μ΄μ 컀μ€ν
@Roles()
λ°μ½λ μ΄ν°κ° μμΌλ―λ‘ μ΄λ₯Ό μ¬μ©νμ¬ create()
λ©μλλ₯Ό μ₯μ ν μ μμ΅λλ€.
μ΄μ λμκ°μ μ΄κ²μ RolesGuard
μ ν¨κ» λ¬Άμ΄ λ΄
μλ€. νμ¬λ λͺ¨λ κ²½μ°μ λ¨μν trueλ₯Ό λ°ννμ¬ λͺ¨λ μμ²μ μ§νν μ μμ΅λλ€. νμ¬ μ¬μ©μμκ² ν λΉ λ μν μ μ²λ¦¬μ€μΈ νμ¬ κ²½λ‘μ νμν μ€μ μν κ³Ό λΉκ΅νμ¬ λ°ν κ°μ 쑰건λΆλ‘ λ§λ€κ³ μΆμ΅λλ€. κ²½λ‘μ μν (컀μ€ν
λ©ν λ°μ΄ν°)μ μ‘μΈμ€νκΈ° μν΄ νλ μ μν¬μ μν΄ μ 곡λκ³ @nestjs/core
ν¨ν€μ§μμ μ 곡λλ Reflector
ν¬νΌ ν΄λμ€λ₯Ό μ¬μ©ν©λλ€.
info ννΈ node.js μΈκ³μμλ κΆνμ΄ μλ μ¬μ©μλ₯Ό
request
μ€λΈμ νΈμ 첨λΆνλ κ²μ΄ μΌλ°μ μ λλ€. λ°λΌμ μμ μν μ½λμμrequest.user
μ μ¬μ©μ μΈμ€ν΄μ€μ νμ©λ μν μ΄ ν¬ν¨λμ΄ μλ€κ³ κ°μ ν©λλ€. μ±μμ μλ§λ μ¬μ©μ μ§μ μΈμ¦ κ°λ(authentication guard) (λλ λ―Έλ€μ¨μ΄)μμ ν΄λΉ μ°κ²°μ λ§λ€ κ²μ λλ€.
Reflector
ν΄λμ€λ₯Ό μ¬μ©νλ©΄ μ§μ λ keyμ μν΄ λ©ν λ°μ΄ν°μ μ½κ² μ‘μΈμ€ν μ μμ΅λλ€ (μ΄ κ²½μ° ν€λ roles
μ
λλ€. roles.decorator.ts
νμΌκ³Ό κ±°κΈ°μμ λ§λ€μ΄μ§ SetMetadata()
νΈμΆμ λ€μ μ°Έμ‘°νμμμ€). μμ μμμ νμ¬ μ²λ¦¬ λ μμ² λ©μλμ λ©ν λ°μ΄ν°λ₯Ό μΆμΆνκΈ° μν΄ context.getHandler()
λ₯Ό μ λ¬νμ΅λλ€. getHandler()
λ κ²½λ‘ νΈλ€λ¬ ν¨μμ μ°Έμ‘°λ₯Ό μ 곡νλ€λ κ²μ κΈ°μ΅νμμμ€.
컨νΈλ‘€λ¬ λ©ν λ°μ΄ν°λ₯Ό μΆμΆνκ³ μ΄λ₯Ό μ¬μ©νμ¬ νμ¬ μ¬μ©μ μν μ κ²°μ ν¨μΌλ‘μ¨ μ΄ κ°λλ₯Ό λ³΄λ€ μΌλ°μ μΌλ‘ λ§λ€ μ μμ΅λλ€. 컨νΈλ‘€λ¬ λ©ν λ°μ΄ν°λ₯Ό μΆμΆνκΈ° μν΄ μ°λ¦¬λ context.getHandler()
λμ context.getClass()
λ₯Ό μ λ¬ν©λλ€:
κΆνμ΄ μΆ©λΆνμ§ μμ μ¬μ©μκ° μλ ν¬μΈνΈλ₯Ό μμ²νλ©΄ Nestλ λ€μ μλ΅μ μλμΌλ‘ λ°νν©λλ€.
λ€μμ κ°λκ° false
λ₯Ό λ°ννλ©΄ νλ μ μν¬μμ ForbiddenException
μ΄ λ°μν©λλ€. λ€λ₯Έ μ€λ₯ μλ΅μ 리ν΄νλ €λ©΄ κ³ μ ν μμΈλ₯Ό μ²λ¦¬ν΄μΌ ν©λλ€. μλ₯Ό λ€λ©΄ λ€μκ³Ό κ°μ΅λλ€.
κ°λμ μν΄ λ°μ λ μμΈλ μμΈ κ³μΈ΅(μ μ μμΈ νν° λ° νμ¬ μ»¨ν μ€νΈμ μ μ©λλ λͺ¨λ μμΈ νν°)μ μν΄ μ²λ¦¬λ©λλ€.