Auth
인증(Auth)은 웹 개발에서 필수 요소
Django 역시 이를 지원함
'django.contrib.auth' : 인증 관련 핵심 로직, 모델 제공
'django.contrib.contenttypes' : 사용자 모델과 권한을 연결
- 인증 (Authentication) : 사용자가 누구인지 확인하는 과정
- 권한 (Authorization) : 사용자가 특정 작업을 수행할 수 있는지 확인하는 과정
Auth == 인증(Authentication) + 권한(Authorization)
쿠키(cookie), 세션(session)
HTTP와 쿠키/세션의 필요성
HTTP의 특징
- 비연결지향(Connectionsless)
한 번 요청에 대한 응답 후 연결이 종료됨 - 무상태(Stateless)
이전 요청을 기억하지 못함
→ 쿠키와 세션이 없다면 로그인 상태가 유지되지 않음
쿠키(Cookie)
서버가 브라우저에 저장하는 데이터 조각(Key-Value 형태)
- 동일한 서버에 요청할 때마다 자동으로 함께 전송됨
- 장바구니, 최근 본 상품, 광고 추적 등에 사용
- 보안 취약점 존재 (로컬에서 변조 가능)
쿠키의 수명
세션쿠키(Session Cookie)
현재의 세션이 종료되면(브라우저가 닫히면) 삭제됨
지속쿠키(Persistent Cookie)
디스크에 저장되며 브라우저를 닫거나 컴퓨터를 재시작해도 남아있음
Max-Age를 지정하여 해당 기간이 지나면 삭제 가능
세션(Session)
서버에서 유지되는 사용자 정보 저장 방식
- 로그인 시, 서버가 세션 ID를 발급, 이를 쿠키에 저장
- 이후 요청 시 세션 ID를 이용해 사용자 확인
- 민감한 정보를 클라이언트에 저장할 필요 없이 서버에서 검증 가능
↓↓↓↓↓
- 클라이언트가 서버에 접속
- 서버가 특정 session id를 발급
- session id 전달받아 쿠키에 저장
- 클라이언트는 해당 쿠키를 이용해서 요청
- 서버는 쿠키에서 session id를 꺼내어 검증
- 검증 성공 시 알맞은 로직 처리
Django의 Session과 Auth
→ Django가 내부적으로 세션과 인증을 관리하므로 직접 구현 필요 없음
Django의 Authentication System
Django에서 인증 시스템 사용
로그인, 로그아웃 구현하기
로그인
Session을 Create하는 로직
'accounts' 앱 생성 및 프로젝트 'urls.py'와 연결
python manage.py startapp accounts
'accounts/urls.py' 설정
'accounts/views.py'에서 로그인 기능 구현
- request.mothod를 확인하여 POST요청이면 로그인 처리를 수행
- AuthenticationForm(data=request.POST)를 통해 사용자가 입력한 로그인 정보를 검증
- form.is_valid()를 통해 아이디/비밀번호가 올바르면 auth_login(request, form.get_user())를 실행
- → Django의 인증 시스템 활용, 실제 로그인 처리
- 로그인 성공 시 redirect("articles:index2")
- 아니면 accounts/login.html에 머무름
'articles.urls.py'
Authentication Form
Django의 Built-Form
- 로그인을 위한 기본 form 제공
- login()함수로 사용자 로그인 처리를 해주고, 내부적으로 session을 사용해서 user정보 저장
accounts/templates/accounts/login.html 생성
*Django auth_user
→user정의 필요 없음
*user에 대한 더 많은 정보를 필요로 한다면, 기본 user모델을 확장하면 됨
Django의 superuser
Django의 기본 인증 시스템에서 제공하는 사용자 유형 중 하나
모든 데이터와 기능을 제어할 수 있는 계정
최고 권관리자 권한을 가진 사용자를 의미함
- Django Admin 접근 가능
(/admin)에 로그인 가능
모든 모델 데이터를 추가, 수정, 삭제할 수 있음 - 모든 권한 보유 (is_superuser=True)
Django의 User모델에는 is_superuser라는 필드가 있는데, True로 설정된 사용자는 모든 권한을 가짐
보통 일반 유저는 특정 그룹에 속하거나 개별 권한을 받아야 함
☞superuser는 제한 없이 모든 기능을 사용할 수 있음 - is_staff=True 속성 포함
is_staff=True가 설정된 유저만 Django Admin에 접근 가능
Superuser는 자동으로 is_staff=True - 데이터베이스의 모든 데이터를 조회 및 변경 가능
일반 사용자 : 자신의 계정 정보나 특정 그룹의 정보만 볼 수 있도록 제한할 수 있음
Superuser : 모든 데이터에 대한 읽기/쓰기/삭제 권한 가짐
superuser 생성 (관리자 계정 등록)
python manage.py createsuperuser
*Superuser 삭제
User.objects.filter(is_superuser=True).delete()
'base.html'에 로그인 링크 추가
로그아웃 구현 하기
로그아웃
서버의 세션 데이터를 지우는 것
- 현재 request에서 가져온 session을 사용하여 DB에서 삭제
- 클라이언트 쿠키에서도 삭제
'accounts/urls.py' 설정
'accounts/views.py'에서 로그아웃 기능 구현
DB를 조작하는 요청이기 때문에 request.method = "POST"
로그아웃 버튼 추가('base.html')
HTTP 요청 처리 방법과 접근 제한
Django의 HTTP 요청 처리 방법
Django Shortcut Functions
- render() : 템플릿을 렌더링하여 응답
- redirect() : 특정 URL로 이동
- get_object_or_404() : 객체가 없으면 404 오류
- get_list_or_404() : 필터링된 객체 리스트가 없으면 404 오류 반환
/articles/없는pk/ - get_object_or_404() ver.
/articles/없는pk/ - 기존DoesNotExist
Django의 View Decorators
- require_http_methods() : 특정 HTTP 요청만 허용
- require_POST() : POST 요청만 허용
Template with Auth
Django 템플릿에서 인증 정보를 활용 가능
→ request.user 객체를 사용하여 현재 로그인한 사용자 정보 제공
→ auth.User 클래스의 인스턴스 또는 AnonymousUser 인스턴스를 반환
접근 제한 (로그인 필요)
- is_authenticated 속성 사용
로그인한 사용자만 특정 기능을 사용할 수 있도록 제한 가능 - @login_required 데코레이터 적용
로그인한 사용자만 특정 view에 접근할 수 있도록 제한
로그인되지 않은 경우 `LOGIN_URL`로 리디렉트됨
is_authenticated
@login_required
로그인이 되어있지 않은 상태에서 접근하면 settings.LOGIN_URL에 설정된 경로로 이동 (기본값은 /accounts/login)
로그인이 되어있으면 view로직 실행
로그인 성공시 이전 페이지로 자동 이동 → 쿼리스트링에 next로 저장(별도 처리 안해주면 지정한 경로로 이동)
articles/view.py update, delete모두 적용
Django의 Auth 활용하면 쉽게 로그인 및 로그아웃 기능을 구현할 수 있음
HTTP의 특징 (Stateless)을 보완하기 위해 쿠키와 세션 활용
Django가 기본적으로 제공하는 기능을 사용하면 보안성을 확보 + 간편한 인증 시스템 구축 가능
@login_required 및 is_authenticated를 활용해 접근 제한 적용 가능
'∟Framework > ∟Django' 카테고리의 다른 글
Django - URL Namespace (0) | 2025.02.02 |
---|---|
Django - Django Form과 ModelForm을 활용한 입력 폼 처리 (0) | 2025.01.31 |
Django - MTV 패턴을 활용한 RUD(Read, Update, Delete) 구현 (0) | 2025.01.22 |
Django - MTV패턴을 활용한 C(Create)와 R(Read) 구현 (0) | 2025.01.18 |
Django - ORM(Object-Relational Mapping) (1) | 2025.01.14 |