하나의 글에 배웠던 모든 내용과 코드를 작성할 경우 글이 너무 길어지기 때문에 핵심적인 내용만 요약해서 정리할 예정입니다. 과정을 마무리하는 단계에서 지금(현재 6주차)까지 배웠던 내용을 주제별로 나눈다면 다음과 같습니다.
week1: Django가 무엇인지, 가상환경, 프로젝트 세팅에 관하여
week2: Model, View, Template, 템플릿 상속
week3: ORM,
week4: FBV, CBV
week5: Authentication
week6: AWS 배포
User
Django는 User를 관리하고 생성할 User 모델을 기본으로 제공합니다.
Django의 user 모델은 username
, password
, 그리고 옵션으로 email
, first_name
, last_name
을 사용할 수 있습니다.
from django.contrib.auth.models import User
ithingv = User('ithingv', password='password')
OR
ithingv = User(
'ithingv',
email='ithing43@gmail.com',
password='password',
first_name='ithing',
last_name='43',
)
이메일 주소로 User를 식별하는 경우 사용자 이름에 이메일 주소를 입력하고 이를 이용해 사용자 인증을 실시할 수 있으며 Django에서 이메일 주소를 취급하는 빌트인 기능을 사용할 수도 있습니다.
Django는 password
에 대한 보안을 제공합니다. 기본으로 제공하는 password validators가 있습니다. 원하는 경우 커스텀하여 자체적으로 비밀번호 검증을 할 수 있겠지만 비밀번호 규칙이 많을 때 보안 수준이 저하되는 경우도 종종 있습니다. Django의 비밀번호 관리에 대한 더 자세한 설명은 이곳을 참고해주세요.
또한 User 모델의 객체를 조회하고 필터링할 수 있습니다.
User.objects.filter(first_name='ithingv')
User objects
에는
Django의 features에서 context에 맞는 fields, attributes 및 method가 있습니다. 먼저 Group
을 살펴봅시다.
Group
Django Group은 User의 집합입니다. User는 여러개의 Group에 속할 수 있지만 Group은 다른 Group에 속할 수 없습니다. 그룹은 웹 사이트의 기능에 대한 특정 그룹 액세스 권한 부여와 같은 다양한 작업에 대해 사용자의 "카테고리"를 작성하는 데 유용합니다. 사용자 그룹에 이름을 붙이는 것만으로 사용자 그룹을 만들 수 있습니다.
from django.contrib.auth.models import Group
commento_users = Group.objects.create(name='commento_users')
User objects가 groups과 many-to-many 관계인 경우 add
를 사용해 그룹을 추가할 수 있습니다.
ithingv.groups.add(commento_users)
Permissions
사용자, 그룹에 대해 권한을 설정하지 않는다면 사용자가 자기 게시물외의 다른 사용자의 게시글을 무단으로 삭제하는 상황이 발생할 수 있습니다. 권한은 Django 사용자가 특정 작업을 수행할 수 있는지 여부를 판단하는 방법입니다. 사용자(혹은 사용자가 속한 그룹)이 특정 개체 또는 개체 속성에 대해 작업할 수 있는 권한이 있는지 확인하기 위해 has_perm
을 사용할 수 있습니다.
from member.models import Commento
if ithingv.has_perm('member.join'):
Commento.objects.create(name='ithingv')
Authentication
Django는 기존에 등록된 사용자들에 대해 몇 가지 제공된 Credentials
을 통해 사용자를 인증할 수 있습니다. 만약 사용자가 일치하면 해당 사용자 개체를 반환하며 그렇지 않으면 None
을 리턴합니다.
from django.contrib.auth import authenticate
user = authenticate(
username='ithingv',
password='password'
)
이를 통해 사용자가 유효한 자격을 가졌는지 확인할 수 있지만 사용자가 로그인한 상태로 유지되지는 않습니다. 그러기 위해 사용자 인증과 더불어 Django의 로그인 기능을 사용해야 합니다. 다음 메서드는 현재 요청 개체와 인증된 사용자 개체를 받아들이고 성공하면 사용자를 로그인 성공 페이지로 리다이렉션합니다.
from django.contrib.auth import login
...
if user:
login(request, user)
else:
# invalid login, redirect to some kind of error page
Sessions
사용자가 서버에 페이지를 요청할 때마다 브라우저에서 전송된 HTTP Request는 여러 계층에 의해 처리되고 최종적으로 Django Server에 도착합니다.
Request가 들어온 경우 Application Program 및 MiddleWare에 Django Authentication 기능이 설치되어 있는 경우 사용자에 대한 참조가 요구됩니다. Django는 Session
(사용자의 브라우저에 설정된 쿠키에 기반하여 데이터베이스로 부터 가져온 데이터비트)를 사용하여 이 작업을 수행합니다. 사용자가 페이지를 방문하면 cookie값이 데이터베이스에 활성 세션이 있는지 확인하기 위해 사용됩니다. 이런 경우 사용자가 인증됩니다. 만약 세션이 만료되었거나 존재하지 않는 경우 사용자는 재로그인을 해야합니다.
user.is_authenticated
request 객체는 항상 사용자에 대한 참조를 가지므로 어떤 유형의 사용자인지 구별될 필요가 있습니다. 이때 request.user.is_authenticated
속성을 사용할 수 있습니다. 이 속성은 유저가 로그인했는지 여부에 대해 True/False
를 반환합니다.
만약 인증되지 않은 경우 request.user
는 AnonymousUser object
가 됩니다. 이는 사용자가 아직 로그인하지 않은 경우 혹은 첫 방문자일 경우에 나타납니다. 로그인한 사용자에 대한 로직을 사용할 경우 사용자 구별을 위해 request.user.is_authenticated
을 사용하면 됩니다.