Coding/내일배움캠프
[내일배움캠프] 타입스크립트 개인 과제 3일차 | Node.js 4기 | Day 68 | 24.03.12.(화)
_Woo_
2024. 3. 12. 23:57
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
로그인 / User / Admin
https://velog.io/@from_numpy/NestJS-Implementing-Scopes-for-Multiple-Routes-feat.-JWT-Auth
역할 기반 액세스 제어(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.
로깅은 왜 중요하고, 어떻게 찍히는 것일까?