[Tistory] [내일배움캠프] 타입스크립트 개인 과제 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

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다