λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⭐ Personal_Study/Vue

DFR Auth System

by ν¬μŠ€νŠΈμ‰μ΄ν¬ 2022. 11. 22.

DFR Auth System

Authentication & Authorization

Authentication - 인증, μž…μ¦

βœ” μžμ‹ μ΄λΌκ³  μ£Όμž₯ν•˜λŠ” μ‚¬μš©μžκ°€ λˆ„κ΅¬μΈμ§€ ν™•μΈν•˜λŠ” ν–‰μœ„
βœ” λͺ¨λ“  λ³΄μ•ˆ ν”„λ‘œμ„ΈμŠ€μ˜ 첫 번째 단계
βœ” 즉, λ‚΄κ°€ λˆ„κ΅¬μΈμ§€ ν™•μΈν•˜λŠ” κ³Όμ •
βœ” 401 Unauthorized

Authorizaion - κΆŒν•œ λΆ€μ—¬, ν—ˆκ°€

βœ” μ‚¬μš©μžμ—κ²Œ νŠΉμ • λ¦¬μ†ŒμŠ€ λ˜λŠ” κΈ°λŠ₯에 λŒ€ν•œ μ—‘μ„ΈμŠ€ κΆŒν•œμ„ λΆ€μ—¬ν•˜λŠ” κ³Όμ •(절차)
βœ” λ³΄μ•ˆ ν™˜κ²½μ—μ„œ κ΅¬λ„ˆν•œ λΆ€μ—¬λŠ” 항상 인증이 λ¨Όμ € ν•„μš”ν•¨

  • μ‚¬μš©μžλŠ” 쑰직에 λŒ€ν•œ μ—‘μ„ΈμŠ€ κΆŒν•œμ„ λΆ€μ—¬ λ°›κΈ° 전에 λ¨Όμ € μžμ‹ μ˜ IDκ°€ μ§„μ§œμΈμ§€ λ¨Όμ € 확인해야 ν•œλ‹€.

βœ” μ„œλ₯˜μ˜ λ“±κΈ‰, μ›Ή νŽ˜μ΄μ§€μ—μ„œ 글을 쑰회/μ‚­μ œ/μˆ˜μ • ν•  수 μžˆλŠ” 방법, μ œν•œκ΅¬μ—­(admin) λ“±λ“±

  • 인증이 λ˜μ—ˆμ–΄λ„ λͺ¨λ“  κΆŒν•œμ„ λΆ€μ—¬ λ°›λŠ” 것은 μ•„λ‹ˆλ‹€

βœ” 403 Forbidden

  • 401κ³Ό λ‹€λ₯Έ 점은 μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ λˆ„κ΅¬μΈμ§€ μ•Œκ³  있음

How to determine authentication

인증 μ—¬λΆ€ 확인 방법

βœ” settings.py에 기본적인 인증 절차λ₯Ό μ–΄λ– ν•œ λ°©μ‹μœΌλ‘œ λ‘˜ 것인지 μ„€μ •(κΈ€λ‘œλ²Œ)
βœ” μš°λ¦¬κ°€ μ‚¬μš©ν•  방법은 ToeknAuthentication


βœ” κ°œλ³„ viewν•¨μˆ˜λ§ˆλ‹€ decoratorλ₯Ό ν™œμš©ν•΄ λ‹€λ₯Έ 인증 방식을 μ μš©ν•  수 μžˆλ‹€.

λ‹€μ–‘ν•œ 인증 방식

βœ” BasicAuthentication

  • κ°€μž₯ 기본적인 μˆ˜μ€€μ˜ 인증방식
  • ν…ŒμŠ€νŠΈμ— 적합

βœ” SessionAuthentication

  • Django에 μ‚¬μš©ν•˜μ˜€λ˜ session 기반의 인증 μ‹œμŠ€ν…œ
  • DRF와 Djano session 인증 방식은 λ³΄μ•ˆμ  츑면을 κ΅¬μ„±ν•˜λŠ” 방법에 차이가 μžˆλ‹€.

βœ” RemoteUserAuthentication

  • Django의 Remote user 방식을 μ‚¬μš©ν•  λ•Œ ν™œμš©ν•˜λŠ” 인증 방식

βœ” ToeknAuthentication

  • κ°„λ‹¨ν•œ κ΅¬ν˜„
  • 기본적인 λ³΄μ•ˆ κΈ°λŠ₯ 제곡
  • λ‹€μ–‘ν•œ μ™ΈλΆ€ νŒ¨ν‚€μ§€

βœ” settings.pyμ—μ„œ DEFAULT_AUTHENTICATION_CLASSESλ₯Ό μ •μ˜ν•΄μ•Ό ν•œλ‹€!!

  • TokenAuthentication 인증 방식을 μ‚¬μš©ν•  κ²ƒμž„μ„ λͺ…μ‹œ

ToeknAuthentication μ‚¬μš© 방법

  1. INSTALLED_APPS에 rest_framework.authtoken 등둝
INSTALLED_APPS = [
    ...
    # Auth
    'rest_framework.authtoken',
]

βœ” λ“±λ‘ν•˜κ³  migrate ν•΄μ£ΌκΈ°

  1. 각 userλ§ˆλ‹€ 고유 Token 생성
  2. μƒμ„±ν•œ Toekn을 각 Userμ—κ²Œ λ°œκΈ‰
  3. UserλŠ” λ°œκΈ‰ 받은 Token을 headers에 λ‹΄μ•„ μš”μ²­κ³Ό ν•¨κ»˜ 전솑
  • 단 λ°˜λ“œμ‹œ Token λ¬Έμžμ—΄ ν•¨κ»˜ μ‚½μž…
  • Token λ¬Έμžμ—΄κ³Ό λ°œκΈ‰λ°›μ€ μ‹€μ œ token 사이λ₯Ό ' '(곡백)으둜 ꡬ뢄

토큰 생성 및 관리 문제점

  1. Token 생성 μ‹œμ 
  2. μƒμ„±ν•œ Token 관리 방법
  3. User와 κ΄€λ ¨λœ 각쒅 κΈ°λŠ₯ 관리 방법

dj-rest-auth

κ°œμš”

βœ” νšŒμš΄κ°€μž…, 인증(μ†Œμ…œλ―Έλ””μ–΄ 인증 포함), λΉ„λ°€λ²ˆν˜Έ μž¬μ„€μ •, μ‚¬μš©μž μ„ΈλΆ€ 검색, νšŒμ›μ •λ³΄ μˆ˜μ • 등을 μœ„ν•œ REST API end point 제곡
βœ” django-rest-authλŠ” 더 이상 지원x!!
βœ” dj-rest-auth μ‚¬μš©!!

μ‹œμž‘νžˆκΈ° 전에

βœ” μ‹œμž‘ν•˜κΈ° μ „, auth.Userλ₯Ό accounts.User둜 λ³€κ²½
βœ” auth.User둜 μ„€μ •λœ DB 제거
βœ” my_api/settings.py μ„€μ •

dj-rest-auth μ μš©ν•˜κΈ°

βœ” λ‹€μ‹œ migration ν•΄μ£ΌκΈ°!

βœ” νšŒμ› κ°€μž… κΈ°λŠ₯은 μ—†λ‹€!!

Registration

βœ” Registration κΈ°λŠ₯을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μΆ”κ°€ κΈ°λŠ₯ 등둝 및 μ„€μΉ˜ ν•„μš”

βœ” signup νŽ˜μ΄μ§€ 확인

Sign up & Login

βœ” νšŒμ› κ°€μž… μš”μ²­ ν›„ κ²°κ³Ό 확인

  • μš”μ²­μ— λŒ€ν•œ μ‘λ‹΅μœΌλ‘œ Token λ°œκΈ‰

βœ” 둜그인 μ‹œμ—λ„ λ™μΌν•œ 토큰 λ°œκΈ‰

Password Change

βœ” /accounts/password/change/ κΈ°λŠ₯ 확인

  • 둜그인 λ˜μ–΄ μžˆκ±°λ‚˜, 인증이 ν•„μš”ν•œ κΈ°λŠ₯
  • DRF 자체 제곡 HTML form μ—μ„œλŠ” 토큰을 μž…λ ₯ν•  수 μžˆλŠ” 곡간이 μ—†λ‹€.
  1. Postman으둜 POST μš”μ²­

βœ” body/form-data에 κ°’ μž…λ ₯

  1. headers에 Token μž…λ ₯

βœ” Authorization: Token { your token } ν˜•μ‹μ— 맞좰 μž…λ ₯ (띄어쓰기 주의!)

  1. 인증 방법 μž…μ¦
# settings.py

REST_FRAMEWORK = {
    # Authentication
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
}

βœ” settings.py에 token 기반 인증 방식 μ‚¬μš© μ„ μ–Έ

  1. μ΅œμ’… κ²°κ³Ό 확인

Permission Setting

drf: permissions 곡식 λ¬Έμ„œ

βœ” κΆŒν•œ μ„ΈλΆ€ μ„€μ •

  1. λͺ¨λ“  μš”μ²­μ— λŒ€ν•œ 인증을 μš”κ΅¬ν•˜λŠ” μ„€μ •
  2. λͺ¨λ“  μš”μ²­μ— λŒ€ν•΄ 인증이 없어도 ν—ˆμš©ν•˜λŠ” μ„€μ •

βœ” μ„€μ • μœ„μΉ˜: 인증 방법을 μ„€μ •ν•œ κ³³κ³Ό 동일

# my_api/settings.py

REST_FRAMEWORK = {
    # permission
    'DEFAULT_PERMISSION_CLASSES': [
        # 'rest_framework.permissions.IsAuthenticated',
        'rest_framework.permissions.AllowAny',
    ],
}

βœ” λͺ¨λ“  μš”μ²­μ— λŒ€ν•΄ ν—ˆμš© μ„€μ •

Article List Read

  1. articles/views.py
# articles/views.py

# permission Decorators
from rest_framework.decorators import permission_classes
from rest_framework.permissions import IsAuthenticated


@api_view(['GET', 'POST'])
@permission_classes([IsAuthenticated])
def article_list(request):
    if request.method == 'GET':
        # articles = Article.objects.all()
        articles = get_list_or_404(Article)
        serializer = ArticleListSerializer(articles, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            serializer.save()
            # serializer.save(user=request.user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)

βœ” κ²Œμ‹œκΈ€ 쑰회 및 생성 μš”μ²­ μ‹œ 인증된 경우만 ν—ˆμš©ν•˜λ„λ‘ κΆŒν•œ λΆ€μ—¬ -> decorator ν™œμš©

  1. 쑰회 μš”μ²­ 확인

βœ” κ²Œμ‹œκΈ€ 쑰회 μ‹œ 둜그인 ν•„μš”

Article Create

  1. Postman으둜 생성 μš”μ²­ 확인

βœ” 인증된 μ‚¬μš©μžμž„μ„ λ‚˜νƒ€λ‚΄λŠ” token을 μΆ”κ°€ ν•΄μ€€λ‹€.

  1. κ²°κ³Ό 확인

'⭐ Personal_Study > Vue' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

drf-spectacular  (0) 2022.11.24
DRF Auth with Vue  (0) 2022.11.23
Vue with DRF  (0) 2022.11.21
Cross - Origin Resource Sharing (CORS)  (0) 2022.11.20
Vue with DRF: Server & Client  (0) 2022.11.20

λŒ“κΈ€