본문 바로가기

Coding/내일배움캠프

[내일배움캠프] 타입스크립트 개인 과제 3일차 | Node.js 4기 | Day 68 | 24.03.12.(화)

expose와 exclude의 차이?

  • expose : 특정 속성을 반환 목록에 노출한다.
  • exclude : 특정 속성을 반환 목록에서 제외한다.
Q. 회원가입 시 Userd와 Admin을 선택할 수 있도록 하고, 특정 api 요청에 대해서 Admin 권한을 가진
   사용자만 해당 작업을 수행할 수 있는 로직을 수행하기 위해서는 어떤 방식으로 코드를 구현해야 할까?
   미친 디테일로 설명해줬으면 좋겠어.
   
A. 회원가입 시 User와 Admin 구분 및 API 요청 권한 관리: 완벽 가이드
	
	목표:

	회원가입 시 사용자 유형을 User와 Admin으로 선택 가능하게 구현
	특정 API 요청에 대해 Admin 권한만 허용하는 로직 구현
	단계별 구현 방식:

	1. 회원 정보 모델 설계:
	
	User 모델:
	id: 고유 식별 번호 (필수)
	username: 사용자 이름 (필수)
	email: 이메일 주소 (필수)
	password: 비밀번호 (필수)
	type: 사용자 유형 (필수, 기본값: "user") - user 또는 admin
	created_at: 생성 날짜 (자동 생성)
	updated_at: 업데이트 날짜 (자동 생성)
	Role 모델 (선택 사항):
	id: 고유 식별 번호 (필수)
	name: 역할 이름 (필수, 예: "admin")
	permissions: 허용된 API 목록 (필수, JSON 형식)
	User_Role 연결 테이블 (선택 사항):
	user_id: User 모델의 id 참조 (필수)
	role_id: Role 모델의 id 참조 (필수)
	
	2. 회원가입 API 구현:
	
	username, email, password, type 정보를 받아 새로운 User 인스턴스 생성
	type 값에 따라 user 또는 admin 설정
	선택 사항: Role 모델 사용 시, User 생성 후 User_Role 연결 테이블에 레코드 추가
	
	3. API 요청 권한 검증 로직 구현:
	
	모든 API 요청에 Authorization 헤더 검사
	헤더에 유효한 JWT 토큰 존재 여부 확인
	토큰에서 사용자 정보 추출 (JWT 라이브러리 활용)
	추출된 사용자 정보의 type 값 검사
	admin 권한 필요한 API 요청 시 type 값이 admin인지 확인
	
	4. JWT 토큰 생성 및 유효성 검증:
	
	회원 로그인 시 username과 password 검증 후 유효한 JWT 토큰 생성
	토큰에는 사용자 정보 (예: id, username, type) 포함
	모든 API 요청에 토큰 포함 필수
	요청 처리 전 토큰 유효성 검증 (JWT 라이브러리 활용)
	토큰 만료 또는 유효하지 않을 경우 401 Unauthorized 응답 반환
	
	5. 추가 고려 사항:
	
	다양한 권한 수준 설정 가능 (예: 일반 관리자, 슈퍼 관리자)
	RBAC (Role-Based Access Control) 접근 제어 모델 활용
	API 요청 로그 기록 및 관리
	보안 강화: CSRF, XSS 공격 방지
	미친 디테일 코드 예시:
	
	Python
	# 회원가입 API
	@app.route("/signup", methods=["POST"])
	def signup():
	    data = request.get_json()
	    username = data["username"]
	    email = data["email"]
	    password = data["password"]
	    user_type = data["type"]
	
	    # 사용자 유형 검증
	    if user_type not in ["user", "admin"]:
	        return {"error": "Invalid user type"}, 400
	
	    # 사용자 생성
	    user = User(username=username, email=email, password=password, type=user_type)
	    db.session.add(user)
	    db.session.commit()
	
	    # 선택 사항: Role 모델 사용 시
	    if user_type == "admin":
	        admin_role = Role.query.filter_by(name="admin").first()
	        user_role = User_Role(user_id=user.id, role_id=admin_role.id)
	        db.session.add(user_role)
	        db.session.commit()
	
	    return {"success": True}, 201
	
	# API 요청 권한 검증
	@app.route("/api/admin", methods=["GET"])
	def admin_api():
	    # Authorization 헤더 검사
	    auth_header = request.headers.get

 

ENUM vs LITERAL

 

https://velog.io/@johnwi/enum-to-literal

 

[TypeScript] enum 👉 literal 타입 갈아타기(+class-validator, template literal 타입 활용)

enum 대신 template-literal과 Readonly, Record 유틸 타입을 활용해, 좀더 맘편한 타입 만들기

velog.io

 

로그인 / User / Admin

 

 

https://velog.io/@from_numpy/NestJS-Implementing-Scopes-for-Multiple-Routes-feat.-JWT-Auth

 

[NestJS] Implementing Scopes for Multiple Routes ( feat. JWT Auth )

어쩌면 되게 단순하지만 짚고 넘어가면 유용한 사용이 될 거 같기에 글을 남겨본다. 여태껏 nestjs에서 라우트 핸들러 함수를 작성할때 하나의 라우트 핸들러 함수안에 "하나의 Endpoint"만 두었었

velog.io

 

역할 기반 액세스 제어(RBAC)란?

 

https://www.cloudflare.com/ko-kr/learning/access-management/role-based-access-control-rbac/

 

Nest can’t resolve dependencies of the JwtStrategy (UserService, ?, ConfigService). Please make sure that the argument ConcertService at index [1] is available in the AuthModule context.

 

 

- Before

 

 

- After : “exports: [ConcertService]” 추가

 

 

QueryFailedError: Data truncated for column ‘role’ at row 1.

 

 

 

로깅은 왜 중요하고, 어떻게 찍히는 것일까?

 

https://velog.io/@cheesechoux/Nest.js-%EB%A1%9C%EA%B9%85%EC%9D%80-%EC%99%9C-%EC%A4%91%EC%9A%94%ED%95%98%EA%B3%A0-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%B0%8D%ED%9E%88%EB%8A%94-%EA%B1%B8%EA%B9%8C-%EB%82%B4%EC%9E%A5-%EB%A1%9C%EA%B1%B0-%EB%9C%AF%EC%96%B4%EB%B3%B4%EA%B8%B0-%EC%A7%81%EC%A0%91-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0

 

[Nest.js] 로깅은 왜 중요하고, 어떻게 찍히는 것일까? 내장 로거를 직접 만들어보며 알아보자!

Nest.js로 프로젝트를 하던 중,365/24로 관리하는 시스템에서 로그가 중요하다고 하는데, 왜 중요한 것이고? 어떻게 구성되어 있는지 궁금해졌다. @nestjs/common 패키지의 Logger 클래스를 직접 만들어

velog.io