Search

Auth

Django ์ธ์ฆ ์‹œ์Šคํ…œ(Auth)

1. ๊ธฐ๋ณธ ๊ฐœ์š”

Django๋Š” ๊ฐ•๋ ฅํ•œ ์ธ์ฆ/๊ถŒํ•œ ์‹œ์Šคํ…œ์„ ๊ธฐ๋ณธ ์ œ๊ณต
ํ•ต์‹ฌ ๊ธฐ๋Šฅ
์„ค๋ช…
๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ
authenticate(),login(),logout()ํ•จ์ˆ˜๋กœ ์ฒ˜๋ฆฌ
ํšŒ์›๊ฐ€์ž…
User ๋ชจ๋ธ๊ณผset_password()๋กœ ์•ˆ์ „ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅ
๋น„๋ฐ€๋ฒˆํ˜ธ ๊ด€๋ฆฌ
๋ณ€๊ฒฝ ๋ฐ ์žฌ์„ค์ • ๊ธฐ๋Šฅ (PasswordChangeView,PasswordResetView)
์„ธ์…˜ ๊ด€๋ฆฌ
๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€,request.sessionํ™œ์šฉ
๊ถŒํ•œ ๊ฒ€์‚ฌ
is_authenticated,@login_required, ๊ทธ๋ฃน/ํผ๋ฏธ์…˜ ์‹œ์Šคํ…œ

2. ๊ธฐ๋ณธ ์ธ์ฆ ํ๋ฆ„

[ํผ ์ž…๋ ฅ] โ†’ [view์—์„œ ์ธ์ฆ ์š”์ฒญ] โ†’ [์„ธ์…˜ ์ €์žฅ] โ†’ [ํŽ˜์ด์ง€ ์ด๋™]
Plain Text
๋ณต์‚ฌ

3. ๊ธฐ๋ณธ User ๋ชจ๋ธ

from django.contrib.auth.models import User
Python
๋ณต์‚ฌ
ํ•„๋“œ
์„ค๋ช…
username
์‚ฌ์šฉ์ž ์ด๋ฆ„ (unique)
email
์ด๋ฉ”์ผ
password
ํ•ด์‹œ ์ €์žฅ๋จ
first_name
์ด๋ฆ„
last_name
์„ฑ
is_active, is_staff, is_superuser
๊ถŒํ•œ ๊ด€๋ จ ํ•„๋“œ

4. ๋กœ๊ทธ์ธ ๋ทฐ ์˜ˆ์ œ

from django.contrib.auth import authenticate, login def login_view(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) if user: login(request, user) return redirect('home') else: messages.error(request, '๋กœ๊ทธ์ธ ์‹คํŒจ') return render(request, 'accounts/login.html')
Python
๋ณต์‚ฌ
<!-- templates/accounts/login.html --> <form method="post"> {% csrf_token %} <input name="username" type="text" placeholder="์•„์ด๋””"> <input name="password" type="password" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ"> <button type="submit">๋กœ๊ทธ์ธ</button> </form>
HTML
๋ณต์‚ฌ

5. ๋กœ๊ทธ์•„์›ƒ

from django.contrib.auth import logout def logout_view(request): logout(request) return redirect('login')
Python
๋ณต์‚ฌ

6. ์ธ์ฆ ์ƒํƒœ ํ™•์ธ ๋ฐ ์ ‘๊ทผ ์ œํ•œ

# ๋ทฐ ํ•จ์ˆ˜ ๋ณดํ˜ธ from django.contrib.auth.decorators import login_required @login_required def mypage(request): return render(request, 'accounts/mypage.html')
Python
๋ณต์‚ฌ
<!-- ํ…œํ”Œ๋ฆฟ์—์„œ ๋กœ๊ทธ์ธ ์ƒํƒœ ํ™•์ธ --> {% if user.is_authenticated %} {{ user.username }}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. <a href="{% url 'logout' %}">๋กœ๊ทธ์•„์›ƒ</a> {% else %} <a href="{% url 'login' %}">๋กœ๊ทธ์ธ</a> {% endif %}
HTML
๋ณต์‚ฌ

7. ์žฅ๊ณ  ๊ธฐ๋ณธ ์ธ์ฆ URL ์—ฐ๊ฒฐ

# settings.py LOGIN_URL = '/accounts/login/' LOGIN_REDIRECT_URL = '/' # urls.py from django.contrib.auth import views as auth_views urlpatterns = [ path('accounts/login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='login'), path('accounts/logout/', auth_views.LogoutView.as_view(), name='logout'), ]
Python
๋ณต์‚ฌ

8. ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ / ์žฌ์„ค์ • ๊ธฐ๋Šฅ

from django.contrib.auth import views as auth_views urlpatterns += [ path('password_change/', auth_views.PasswordChangeView.as_view(), name='password_change'), path('password_reset/', auth_views.PasswordResetView.as_view(), name='password_reset'), ]
Python
๋ณต์‚ฌ
ํ…œํ”Œ๋ฆฟ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ registration/password_change_form.html ๋“ฑ ๊ฒฝ๋กœ ์‚ฌ์šฉ

9. ์‹ค์Šต ์•„์ด๋””์–ด

์‹ค์Šต ์ฃผ์ œ
์„ค๋ช…
๋กœ๊ทธ์ธ / ๋กœ๊ทธ์•„์›ƒ ๊ตฌํ˜„
๊ธฐ๋ณธ ์ธ์ฆ ํ๋ฆ„ ์™„์„ฑ
๋กœ๊ทธ์ธ ํ›„ ์œ ์ € ์ •๋ณด ์ถœ๋ ฅ
request.user ์‚ฌ์šฉ
๋น„๋กœ๊ทธ์ธ ์‹œ ์ ‘๊ทผ ์ œํ•œ
@login_required ์‚ฌ์šฉ
ํšŒ์›๊ฐ€์ž… ์—ฐ๋™
์•ž์„  SignupForm ์‹ค์Šต๊ณผ ์—ฐ๊ฒฐ

10. ํ™•์žฅ ํŒ (๊ณ ๊ธ‰)

์ฃผ์ œ
์„ค๋ช…
์ปค์Šคํ…€ User ๋ชจ๋ธ
AbstractUser ์ƒ์†
์ด๋ฉ”์ผ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ
authenticate() ์ปค์Šคํ„ฐ๋งˆ์ด์ง•
์†Œ์…œ ๋กœ๊ทธ์ธ
django-allauth, social-auth-app-django ํ™œ์šฉ

Django Auth ์‹ค์Šต

1. Django ์ธ์ฆ ์‹œ์Šคํ…œ ๊ฐœ์š”

ํ•ญ๋ชฉ
์„ค๋ช…
User ๋ชจ๋ธ
Django ๋‚ด์žฅ ์‚ฌ์šฉ์ž ๋ชจ๋ธ (๊ธฐ๋ณธ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ์ œ๊ณต)
auth ์•ฑ
์ธ์ฆ, ๊ถŒํ•œ ๋ถ€์—ฌ, ์„ธ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ ํฌํ•จ
์ธ์ฆ ํ๋ฆ„
์‚ฌ์šฉ์ž โ†’ ๋กœ๊ทธ์ธ โ†’ ์„ธ์…˜ ๋ฐœ๊ธ‰ โ†’ ๊ถŒํ•œ ํ™•์ธ

2. ๊ธฐ๋ณธ User ๋ชจ๋ธ ๊ตฌ์กฐ

from django.contrib.auth.models import User
Python
๋ณต์‚ฌ
ํ•„๋“œ
์„ค๋ช…
username
์‚ฌ์šฉ์ž ID
password
ํ•ด์‹œ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ
email, first_name, last_name
ํ”„๋กœํ•„ ์ •๋ณด
is_staff, is_superuser, is_active
๊ถŒํ•œ ๊ด€๋ จ ํ•„๋“œ

3. ํšŒ์›๊ฐ€์ž… ํผ ์˜ˆ์ œ

# accounts/forms.py from django.contrib.auth.models import User from django import forms class SignupForm(forms.ModelForm): password = forms.CharField(widget=forms.PasswordInput) class Meta: model = User fields = ['username', 'email', 'password']
Python
๋ณต์‚ฌ
# views.py def signup(request): if request.method == "POST": form = SignupForm(request.POST) if form.is_valid(): user = form.save(commit=False) user.set_password(form.cleaned_data['password']) # ํ•ด์‹œํ™” user.save() return redirect('login') else: form = SignupForm() return render(request, 'accounts/signup.html', {'form': form})
Python
๋ณต์‚ฌ

4. ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ ์˜ˆ์ œ

from django.contrib.auth import authenticate, login def login_view(request): if request.method == 'POST': uname = request.POST['username'] pw = request.POST['password'] user = authenticate(request, username=uname, password=pw) if user is not None: login(request, user) return redirect('home') return render(request, 'accounts/login.html')
Python
๋ณต์‚ฌ

5. ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ

from django.contrib.auth import logout def logout_view(request): logout(request) return redirect('login')
Python
๋ณต์‚ฌ

6. ๋กœ๊ทธ์ธ ์ƒํƒœ ํ™•์ธ & ์ ‘๊ทผ์ œํ•œ

from django.contrib.auth.decorators import login_required @login_required def mypage(request): return render(request, 'accounts/mypage.html')
Python
๋ณต์‚ฌ
๋˜๋Š” settings.py์—์„œ ๋กœ๊ทธ์ธ URL ์„ค์ •
LOGIN_URL = '/accounts/login/'
Python
๋ณต์‚ฌ

7. ํ…œํ”Œ๋ฆฟ ๋‚ด ์‚ฌ์šฉ์ž ์ƒํƒœ ์ฒ˜๋ฆฌ

{% if user.is_authenticated %} <p>{{ user.username }} ๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค</p> <a href="{% url 'logout' %}">๋กœ๊ทธ์•„์›ƒ</a> {% else %} <a href="{% url 'login' %}">๋กœ๊ทธ์ธ</a> {% endif %}
HTML
๋ณต์‚ฌ

8. ์ปค์Šคํ…€ User ๋ชจ๋ธ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

# accounts/models.py from django.contrib.auth.models import AbstractUser class CustomUser(AbstractUser): nickname = models.CharField(max_length=30) phone = models.CharField(max_length=20)
Python
๋ณต์‚ฌ
# settings.py AUTH_USER_MODEL = 'accounts.CustomUser'
Python
๋ณต์‚ฌ

9. Admin์— ์‚ฌ์šฉ์ž ๋“ฑ๋ก

# accounts/admin.py from django.contrib.auth.admin import UserAdmin from .models import CustomUser @admin.register(CustomUser) class CustomUserAdmin(UserAdmin): fieldsets = UserAdmin.fieldsets + ( ('์ถ”๊ฐ€ ์ •๋ณด', {'fields': ('nickname', 'phone')}), ) list_display = ('username', 'nickname', 'phone')
Python
๋ณต์‚ฌ

10. ์‹ค์Šต ์˜ˆ์ œ

์‹ค์Šต๋ช…
๋ชฉํ‘œ
ํšŒ์›๊ฐ€์ž…
์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ, ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹ฑ ํ™•์ธ
๋กœ๊ทธ์ธ
authenticate์™€ login() ์‚ฌ์šฉ
๋กœ๊ทธ์•„์›ƒ
์„ธ์…˜ ์ข…๋ฃŒ ํ™•์ธ
๋งˆ์ดํŽ˜์ด์ง€
@login_required๋กœ ์ ‘๊ทผ ์ œ์–ด
ํ…œํ”Œ๋ฆฟ ์ƒํƒœ ํ‘œ์‹œ
๋กœ๊ทธ์ธ ์ƒํƒœ์— ๋”ฐ๋ฅธ ๋ฉ”๋‰ด ํ‘œ์‹œ
์ปค์Šคํ…€ User ๋ชจ๋ธ ์ ์šฉ
๋‹‰๋„ค์ž„, ์—ฐ๋ฝ์ฒ˜ ํ•„๋“œ ์ถ”๊ฐ€
admin ๋“ฑ๋ก
๊ด€๋ฆฌ์ž์—์„œ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•˜๊ฒŒ