설명.Django(장고) - session의 이해

JungSik Heo·2024년 12월 9일

Http

장고에서 View를 작성할때도 나오는 Http란 인터넷에서 서버와 클라이언트가 데이터를 주고 받을 때 사용하는 통신규약(Protocol)이다.

Stateless, Connectionless

  • Http의 특징중 하나로 Stateless(connectionless)가 있는데, 클라이언트(사용자)가 요청을 보내고 서버(Django)가 request를 주면 그대로 연결이 끊긴다는 뜻이다.
  • 웹서버의 특성상 다수의 사용자가 정보를 요구하는 경우가 많은데, 이에 대해 사용자와 연결을 유지하려면 서버에 많은 리소스 낭비가 생기게 된다.
  • 하지만 Http Protocol의 경우 응답을 주고 곧바로 연결을 끊기에 리소스 낭비를 줄인다는 장점이 있다.

쿠키는 클라이언트 측에서 로컬 웹 브라우저(Chrome, IE, ...)가 저장하는 데이터다.

인증을 하기위한 과정에서 처음에 서버는 쿠키를 생성해서 클라이언트에게 보내게된다면, 클라이언트는 쿠키를 웹 브라우저에 저장한다.

이후 클라이언트가 데이터 요청시 Http헤더에 쿠키를 실어서 서버에 보내게된다.

따라서 로그인 정보가 쿠키에 담겨져있다면 더이상의 인증은 필요없게된다.

Session

세션도 쿠키와 동일하게 클라이언트의 인증 상태 정보를 저장할 수 있게되는데, 쿠키와 상이한 점은 데이터를 서버에 저장되며 Session id와 쿠키를 이용한다는 점이다.

쿠키에 세션의 ID를 함께 보냄으로써 세션ID를 통해 서버는 각 사용자를 구별 할 수 있게된다.

또한 이러한 세션의 ID는 랜덤 문자열로 부여하기 때문에 외부에서 세션 정보를 열람하여도 개인 로그인 정보와 매칭이 불가능하다는 특징이 있다.


Django - Session

장고의 세션 프레임 워크를 사용하면 사이트 방문자별로 임의의 데이터를 저장하고 검색 할 수 있다.
보다 자세한 내용은 공식 문서를 참고하길 바란다.

추가 설정

settings 파일에 다음과 같이 세션쿠키의 만료 시점을 설정할 수 있다.

  • SESSION_COOKIE_AGE = 600 # 세션쿠키의 유효기간 설정(default: 2주)
  • SESSION_SAVE_EVERY_REQUEST = True # 서버에게 Request를 보낼 경우 시간 초기화

View - Session

실질적으로 사용하기 위한 View에서 session을 다루는 법이다.

생성

from django.contrib.sessions.backends.db import SessionStore

def index(request):
	...
	# 방법 1
	s = SessionStore()
	s['key'] = 'value'
	s.create()
    
	# 방법 2
	request.session['key'] = value
   	...
	return render(request, 'index.html')

접근

request.session 으로 접근 할 수 있다.

from django.contrib.sessions.models import Session

def index(request):
	...
	request.session['key'] = 'value'	# 세션에 {"key":"value"} 데이터 추가
	request.session.get('key', False)	# 데이터에 'key'의 값 반환 없으면 False
	request.session.clear_expired()		# 만료된 세션 삭제
	request.session.session_key		# session ID(session key) 반환
	if(request.session.session_key):	# 사용자의 session이 만들어져있는지 확인
		s = Session.objects.get(pk = request.session.session_key)
		print(s.get_decoded())		# session의 데이터를 디코딩해서 반환
	return render(request, 'index.html')

session의 타입
reuqest.session : django.contrib.sessions.backends.db.SessionStore
reuqest.session['key'] : dict
s : django.contrib.sessions.models.Session
s.get_decoded() : dict

profile
쿵스보이(얼짱뮤지션)

0개의 댓글