Django ์ธ์ฆ(Authentication)๊ณผ ๊ถํ(Authorization)
1. Django์ ์ธ์ฆ๊ณผ ๊ถํ ์์คํ ๊ฐ์
Django๋ ์ฌ์ฉ์ ์ธ์ฆ(Authentication)๊ณผ ๊ถํ ๊ด๋ฆฌ(Authorization) ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ์ฌ ๋ณด์์ด ํ์ํ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์๋๋ก ๋๋๋ค.
์ด ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด ๋ก๊ทธ์ธ, ๋ก๊ทธ์์, ์ฌ์ฉ์ ๊ทธ๋ฃน ๊ด๋ฆฌ, ์ ๊ทผ ์ ์ด ๋ฑ์ ๊ตฌํํ ์ ์๋ค.
2. ์ธ์ฆ(Authentication)
์ธ์ฆ์ด๋?
์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ํ์ธํ๋ ๊ณผ์ . ์ผ๋ฐ์ ์ผ๋ก ์์ด๋ & ๋น๋ฐ๋ฒํธ ๊ธฐ๋ฐ์ ๋ก๊ทธ์ธ ๊ณผ์ ์ด ํฌํจ๋จ.
1๏ธโฃ Django ๊ธฐ๋ณธ ์ธ์ฆ ์์คํ
Django๋ `django.contrib.auth`์ฑ์ ํตํด ๊ธฐ๋ณธ์ ์ธ ์ธ์ฆ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- `User` ๋ชจ๋ธ (`django.contrib.auth.models.User`)
- `authenticate()` ํจ์
- `login()` / `logout()` ํจ์
2๏ธโฃ ์ฌ์ฉ์ ์ธ์ฆ ์์
- ์ฌ์ฉ์ ์ธ์ฆ (๋ก๊ทธ์ธ)
from django.contrib.auth import authenticate, login
def user_login(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return HttpResponse("๋ก๊ทธ์ธ ์ฑ๊ณต")
else:
return HttpResponse("๋ก๊ทธ์ธ ์คํจ")
- `authenticate(request, username, password)`: ์ฌ์ฉ์ ์ธ์ฆ ์ํ
- `login(request, user)`: ์ธ์ ์ ์์ฑํ์ฌ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ
3๏ธโฃ ๋ก๊ทธ์์ ๊ตฌํ
from django.contrib.auth import logout
def user_logout(request):
logout(request)
return HttpResponse("๋ก๊ทธ์์ ์๋ฃ")
- `logout(request)`: ์ธ์ ์ ์ญ์ ํ๊ณ ๋ก๊ทธ์์ ์ฒ๋ฆฌ
4๏ธโฃ Django ๊ธฐ๋ณธ `User` ๋ชจ๋ธ
Django๋ ๊ธฐ๋ณธ์ ์ผ๋ก `User`๋ชจ๋ธ์ ์ ๊ณตํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ํ๋๋ฅผ ํฌํจํ๋ค.
from django.contrib.auth.models import User
user = User.objects.create_user(username="testuser", password="securepassword")
print(user.username) # testuser
- `username`, `password`, `email`, `first_name`, `last_name` ๋ฑ์ ํ๋ ํฌํจ
- `is_staff`, `is_active`, `is_superuser` ์์ฑ์ผ๋ก ๊ถํ ๊ด๋ฆฌ ๊ฐ๋ฅ
3. ๊ถํ(Authorization)
๊ถํ์ด๋?
์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ํน์ ์์
์ ์ํํ ์ ์๋์ง ๊ฒ์ฌํ๋ ๊ณผ์ .
1๏ธโฃ Django์ ๊ธฐ๋ณธ ๊ถํ ์์คํ
Django๋ ๊ธฐ๋ณธ์ ์ผ๋ก 3๊ฐ์ง ๊ธฐ๋ณธ ๊ถํ์ ์ ๊ณตํ๋ค.
๊ถํ | ์ค๋ช |
`add_<modelname>` | ๊ฐ์ฒด ์ถ๊ฐ ๊ถํ |
`change_<modelname>` | ๊ฐ์ฒด ์์ ๊ถํ |
`delete_<modelname>` | ๊ฐ์ฒด ์ญ์ ๊ถํ |
- ๊ถํ ํ์ธ ์์
if request.user.has_perm('app_name.change_modelname'):
print("์์ ๊ฐ๋ฅ")
else:
print("์์ ๋ถ๊ฐ")
- `has_perm('app_name.change_modelname')` → ํน์ ๊ถํ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธ
2๏ธโฃ ๊ทธ๋ฃน (`Group`) ๊ธฐ๋ฐ ๊ถํ ๊ด๋ฆฌ
Django์ `Group`์ ์ด์ฉํ๋ฉด ์ฌ๋ฌ ์ฌ์ฉ์์๊ฒ ๋์ผํ ๊ถํ์ ๋ถ์ฌํ ์ ์๋ค.
- ๊ทธ๋ฃน ์์ฑ ๋ฐ ์ฌ์ฉ์ ์ถ๊ฐ
from django.contrib.auth.models import Group, User
group = Group.objects.create(name="Editors") # "Editors" ๊ทธ๋ฃน ์์ฑ
user = User.objects.get(username="testuser")
user.groups.add(group) # ์ฌ์ฉ์ ์ถ๊ฐ
- ํน์ ๊ทธ๋ฃน์ ์ํ ์ฌ์ฉ์๋ ํด๋น ๊ทธ๋ฃน์ ๋ชจ๋ ๊ถํ์ ์๋์ผ๋ก ์์
3๏ธโฃ `@permission_required` ๋ฐ์ฝ๋ ์ดํฐ
๋ทฐ์์ ํน์ ๊ถํ์ด ์๋ ์ฌ์ฉ์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ์ค์ ๊ฐ๋ฅ
from django.contrib.auth.decorators import permission_required
@permission_required('app_name.view_modelname')
def my_view(request):
return HttpResponse("๊ถํ์ด ์๋ ์ฌ์ฉ์๋ง ์ ๊ทผ ๊ฐ๋ฅ")
4. Django ์ธ์ฆ & ๊ถํ ํ์ฉ ๋ฐฉ๋ฒ
1๏ธโฃ `LoginRequiredMixin` (๋ก๊ทธ์ธ ํ์)
๋ก๊ทธ์ธ์ด ํ์ํ ๋ทฐ์ ์ ์ฉํ ์ ์๋ Mixin
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import View
class MyView(LoginRequiredMixin, View):
def get(self, request):
return HttpResponse("๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ง ์ ๊ทผ ๊ฐ๋ฅ")
- `LoginRequiredMixin`์ ์์ํ๋ฉด ๋น๋ก๊ทธ์ธ ์ฌ์ฉ์๋ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋๋ ํธ๋จ
2๏ธโฃ `UserPassesTestMixin` (์ฌ์ฉ์ ๊ถํ ๊ฒ์ฌ)
ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฌ์ฉ์๋ง ์ ๊ทผ ๊ฐ๋ฅ
from django.contrib.auth.mixins import UserPassesTestMixin
class AdminOnlyView(UserPassesTestMixin, View):
def test_func(self):
return self.request.user.is_superuser # ๊ด๋ฆฌ์๋ง ์ ๊ทผ ๊ฐ๋ฅ
- `test_func()`์์ True๋ฅผ ๋ฐํํ๋ฉด ์ ๊ทผ ๊ฐ๋ฅ
3๏ธโฃ `@login_required` ๋ฐ์ฝ๋ ์ดํฐ
๋ก๊ทธ์ธ์ด ํ์ํ ํจ์ํ ๋ทฐ
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
return HttpResponse("๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ง ์ ๊ทผ ๊ฐ๋ฅ")
์ธ์ฆ๊ณผ ๊ถํ ์ ๋ฆฌ:
โ๏ธ ์ธ์ฆ(Authentication) → ์ฌ์ฉ์๊ฐ ๋๊ตฌ(์ธ์ฆ๋ ์ ์ )์ธ์ง ํ์ธ (๋ก๊ทธ์ธ/๋ก๊ทธ์์) ํ๋ ์์ ์ด๋ค~
โ๏ธ ๊ถํ(Authorization) → ์ฌ์ฉ์๊ฐ ํน์ ์์ ์ ์ํํ ์ ์๋์ง ํ์ธํ๋ ์์ ์ด๋ค~
โ๏ธ Django๋ ๊ธฐ๋ณธ `User` ๋ชจ๋ธ๊ณผ `Group`, `Permission` ์์คํ ์ ์ ๊ณตํ๋ค~
โ๏ธ `@login_required`, `@permission_required`, `LoginRequiredMixin` ๋ฑ์ ํ์ฉํ์ฌ ๋ณด์ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค~
'Back End ๐ฒ > Django โ๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250305] Soft Delete๋? (0) | 2025.03.05 |
---|---|
[250219] Json Web Token์ ๋ํ์ฌ,,, (1) | 2025.02.19 |
[250210] Django Admin ์ ๋ฆฌ~ (1) | 2025.02.10 |
[250205] Postman?? (1) | 2025.02.05 |
[250205] CRUD ์์ธ ์ ๋ฆฌ~ (1) | 2025.02.05 |