Django 로그인 / 로그아웃

Happy_JG·2023년 7월 2일
0

Django

목록 보기
17/32

HTTP (Hyper Text Transfer Protocol)

HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜이다. 웹에서 이루어지는 모든 데이터 교환의 기초로 클라이언트 - 서버 프로토콜이라고도 부른다.

비 연결 지향(connectionless)
서버는 요청에 대한 응답을 보낸 후 연결을 끊는 것을 말한다. 예를 들어 우리가 네이버 메인 페이지를 보고 있을 때 우리는 네이버 서버와 연결되어 있는 것이 아니다. 네이버 서버는 우리에게 메인 페이지를 응답하고 연결을 끊은 것이다.

무상태(stateless)
연결을 끊는 순간 클라이언트와 서버 간의 통신이 끝나며 상태 정보가 유지되지 않는다. 클라이언트와 서버가 주고받는 메시지들은 서로 완전히 독립적이다.

어떻게 로그인 상태를 유지할까?
보통 우리가 어느 사이트에 로그인을 한 번 하고나면 웹 사이트를 사용할 때 페이지를 이동해도 로그인 "상태"가 유지된다. 서버와 클라이언트 간 지속적인 상태 유지를 위해 쿠키와 세션 을 사용한다.

쿠키(Cookie)

서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각 이다. 사용자가 웹 사이트를 방문할 경우 해당 웹사이트의 서버를 통해 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일이다.

  • 브라우저(클라이언트)는 쿠키를 로컬에 KEY-VALUE의 데이터 형식으로 저장
  • 동일한 서버에 재요청시 저장된 쿠키를 함께 전송
    쿠키는 서로 다른 요청이 동일한 브라우저로부터 발생한 것인지 판단할 때 주로 사용된다.

쿠키 사용 목적
1. 세션관리(Session management)

  • 로그인, 아이디 자동완성, 공지 하루 안 보기, 팝업 체크, 장바구니 등의 정보 관리
  1. 개인화(Personalization)
  • 사용자 선호, 테마 등의 설정
  1. 트래킹(Tracking)
  • 사용자 행동을 기록 및 분석

쿠키 수명
내 경험으로 의류를 구매할 때는 kasina와 nike공식홈페이지를 이용한다. kasina는 매번 로그인을 해야하지만 nike공식홈페이지는 계~~~속 접속이 되어있다. 이는 쿠키의 수명 차이인 것이다.
Session cookie

  • 현재 세션이 종료되면 삭제된다.

Persistent cookies

  • Expires 속성에 지정된 날짜 혹은 Max-Age 속성에 지정된 기간이 지나면 삭제된다.

세션(Session)

사이트와 특정 브라우저 사이의 state(상태)를 유지시키는 것 으로 클라이언트가 서버에 접속하면 서버가 특정 session id를 발급하고, 클라이언트는 session id를 쿠키에 저장한다. 클라이언트가 다시 동일한 서버에 접속하면 요청과 함께 쿠키(session id가 저장된)를 서버에 전달한다. 쿠키는 요청 때마다 서버에 함께 전송되므로 서버에서 session id를 확인해 알맞은 로직을 처리한다. session id는 세션을 구별하기 위해 필요하며, 쿠키에는 session id만 저장한다.


Session in Django

Django는 database-backed sessions 저장 방식을 기본 값으로 사용한다. session 정보는 Django DB의 Django_session 테이블에 저장한다.

Django는 특정 session id를 포함하는 쿠키를 사용해서 각각의 브라우저와 사이트가 연결된 session을 확인한다.

django에서 제공되는 session을 확인해보자.

이미 database에 로그인 한 session정보가 저장되어 있다.

로그아웃을 해보면 database에 저장된 정보가 삭제되어있다. settings.py INSTALLED_APPS을 잘 살펴보면 'django.contrib.sessions' django는 이미 세션관리를 제공해주고 있다.


로그인 기능

url, 함수, template을 만들어 보도록 하자.

views.py


우리는 현재 모델폼과 모델을 수 차례 이용해 보았기에 다음과 같은 형식으로 쓸 수 있다.

회원가입에서도 Form을 상속받아 쓴 경험이 있기에 login도 분명히 django에서 제공하는 Form을 쓸 것만 같은 기분이다. 그렇다. django에서는 login기능도 역시 내장되어 있어 간편하게 로그인 기능을 생성할 수 있다.

urls.py

views.py

django에서 제공하는 login 모듈 import!

views.py

천천히 해석해보자. 많이 다뤄왔던 형식이다. 요청 형태가 POST라면, 즉 html에서 POST로 넘겨주었다면 form이라는 변수에 import했던 AuthenticationForm을 대입한다. form의 유효성을 검사해주고 auth_login이라는 별칭을 써서 import한 login함수를 적용하자.


templates(로그인,회원가입)

여태까지 templates에서 정보를 이동시킬 때는 form태그를 써서 이동시켰다. 그러나 이번 accouts에서 로그인과 회원가입은 둘 다 django에서 제공하고 있는 폼을 적용시켜서 따로 form태그를 쓰지 않아도 된다.

signup.html & login.html


로그인 로직

일반적인 ModelForm 기반의 Create 로직과 동일하지만, ModelForm이 아닌 Form으로 필수 인자 구성 이 다르다. 게다가 DB에 저장하는 것 대신 세션에 유저를 기록하는 함수를 호출하였다.

만약 로그인 URL이 '/accounts/login/' 에서 변경되는 경우 setting.py LOGIN_URL을 변경해야한다.

사용자가 로그인이 되었는 지 확인하기 위해서 'base.html'에 표시해보도록 하고 회원가입페이지, 로그인페이지로 바로 이동할 수 있게 설정해보자

다음과 같은 화면에 문제가 보인다. 보통 사이트에서 로그인을 하면 로그인, 회원가입기능은 굳이 보여줄 필요가 전혀 없으며 로그아웃 기능만 필요하다. 반대로 로그인을 하지 않았을 경우에는 로그아웃 기능이 필요하지 않고 로그인, 회원가입 기능만 필요할 뿐이다. if문을 써서 설정해보자.

base.html

다음과 같이 작성한다.

    {% if request.user.is_authenticated %} 
    <a href="">로그아웃</a>
    {% else %}
    <a href="{% url 'accounts:signup' %}">회원가입</a>
    <a href="{% url 'accounts:login' %}">로그아웃</a>
    {% endif %}

accounts/views.py

우리는 accounts/login에서 유효성 검사까지 해서 로그인을 했다면, dashboards:new로 이동을 하도록 설계되어있다.


login required

만약 로그인을 했을 경우에만 dashboards 애플리케이션을 통해 글쓰기를 하고 싶다면 어떻게 해야할까? base.html에서 if문을 통해 인증이 된 경우에만 화면에 출력하는 방식으로 작성할까? 그렇지 않다. 서버에서 반드시 처리를 해주어야한다.

dashboards/views.py

역시 django에서 제공해주는 모듈을 이용하자.

다음과 같이 login_required annotation을 작성하자. 그렇다면 현재 dashboards의 글쓰기 기능은 로그인을 반드시 해야만한다.


업데이트 하는 기능도 마찬가지로 로그인을 해야만한다.


next


쿠팡을 예를 들어보자. 우리가 쿠팡을 이용하면서 로그인을 하지 않고도 물건을 볼 수 있다. 물건을 로그인 하지 않고 보다가 구매를 결정했을 때 쿠팡에서는 로그인을 하라고 한다. 로그인 절차를 거치면 기본 root페이지로 이동하는가? 그렇지 않다. 로그인 하기 전 물건을 구매할 수 있도록 바로 연결을 해줄것이다. url에서 next=? 등과 같은 형태로 볼 수 있다. 이러한 기능을 적용해보자.

천천히 해석해보자. 만약 요청 방식이 POST라면 폼을 적용시키고 유효성 검사를 진행한 뒤 import한 auth_login함수를 이용하고 마지막으로 redirect를 하는데... 처음보는 형식이다.

return redirect(request.Get.get('next') or 'dashboards:new')

이것은 django의 기능이 아니라 파이썬만의 기능이다. redirect함수 안에는 or 가 있다. 둘 중에 하나만 참이면 즉 request.Get.get('next')가 참이라면 request.Get.get('next')를 반환하고 그렇지 않으면 new로 이동한다. 즉 url에서 next뒤에 무슨 정보가 있으면 그 곳으로 redirect한다는 말이다. 따라서 순서가 중요하다.


로그아웃

로그아웃 역시 django에서 제공해주고있다.

끝!!!

profile
hello!

0개의 댓글