[TIL] 내일배움캠프 52일차_[Django] 쿠키(Cookie)와 세션(Session)
👀Today I Learn
HTTP의 특징
- HTTP는 상태를 유지하지 않는(stateless) 프로토콜
- 따라서, 사용자가 로그인 시 입력한 아이디와 비밀번호 정보는 HTTP 통신 중 POST 방식으로 서버에 전달되지만, 이 정보는 저장되지 않음
- 이를 해결하기 위해 로그인 유지 기능이 필요하며, 이를 구현하는 방법으로 쿠키(Cookie)와 세션(Session)을 사용
🍪쿠키(Cookie)
쿠키란?
- 쿠키는 클라이언트(웹 브라우저) 로컬에 저장되는 키-값 쌍으로 이루어진 작은 데이터 파일
- 이를 통해 서버와 클라이언트 간 상태 정보를 유지할 수 있음
쿠키의 특징
- 만료 시점
- 쿠키에는 유효기간을 설정할 수 있음
- 브라우저가 종료되더라도 유효기간이 남아 있으면 쿠키는 유지
- 구성 요소
- 이름: 각 쿠키를 식별하는 고유 이름
- 값: 쿠키와 관련된 데이터
- 유효시간: 쿠키의 유지 시간
- 도메인: 쿠키를 전송할 도메인
- 경로: 쿠키를 전송할 경로
- 용량 제한
- 하나의 쿠키는 최대 4KB
- 한 도메인당 최대 20개
- 전체 브라우저에서 최대 300개
- 동작 방식
- 클라이언트가 페이지 요청
- 서버가 쿠키 생성
- HTTP 응답 헤더에 쿠키 포함
- 브라우저가 쿠키를 저장
- 같은 요청 시 HTTP 헤더에 쿠키 포함
- 서버는 쿠키를 읽어 상태를 업데이트
쿠기의 활용 예시
- 로그인 시 “아이디와 비밀번호 저장” 여부
- 로그인하지 않은 상태에서 장바구니에 담긴 품목 유지
세션(Session)
세션이란?
- 세션은 일정 시간 동안 같은 사용자로부터 들어오는 일련의 요청을 하나의 상태로 보고, 그 상태를 유지하는 기술
- 서버에서 정보를 관리하며, 클라이언트를 식별하기 위해 세션 ID를 사용
세션의 특징
- 만료 시점
- 브라우저가 종료되거나 세션 유효시간이 끝날 때
- 장단점
- 장점 : 클라이언트 정보가 서버에 저장되어 보안에 강함
- 단점 : 사용자가 많아지면 서버 메모리 사용량이 증가하여 성능 저하 발생 가능
- 동작 방식
- 클라이언트가 서버에 접속 시 세션 ID 발급
- 클라이언트는 세션 ID를 쿠키에 저장
- 이후 요청 시 세션 ID를 서버로 전달
쿠키와 세션의 비교
항목 | 쿠키 | 세션 |
---|---|---|
저장 위치 | 클라이언트 | 서버 |
보안 | 상대적으로 낮음 | 상대적으로 높음 |
속도 | 빠름 | 느림 |
유효 시간 | 설정된 만료 시간까지 유지 | 브라우저 종료 시 삭제 가능 |
활용 : 로그인 유지 기능 구현
쿠키 생성
set_cookie(name, value, max_age=None)
- 인수
name
: 쿠키 이름(필수)value
: 저장할 값(필수)max_age
: 쿠키 유효시간(초, 선택)
쿠키 읽기
request.COOKIES[name]
- 쿠키는 딕셔너리와 비슷한 속성을 가지며, 쿠키 데이터를 문자열로 반환
Django 예제 코드
로그인
def login(request):
# 이미 로그인 쿠키가 있는 경우 처리
if request.COOKIES.get('username') is not None:
username = request.COOKIES.get('username') # 쿠키에서 저장된 사용자 이름을 가져옴
password = request.COOKIES.get('password') # 쿠키에서 저장된 비밀번호를 가져옴
# 사용자 인증
user = auth.authenticate(request, username=username, password=password)
if user is not None: # 인증 성공 시
auth.login(request, user) # 사용자 세션 생성 및 로그인
return redirect("account:home") # 홈 페이지로 리다이렉트
# POST 요청 처리: 로그인 폼 제출 시
elif request.method == 'POST':
username = request.POST['username'] # 입력받은 사용자 이름
password = request.POST['password'] # 입력받은 비밀번호
# 사용자 인증
user = auth.authenticate(request, username=username, password=password)
if user is not None: # 인증 성공 시
auth.login(request, user) # 사용자 세션 생성 및 로그인
response = redirect("account:home") # 홈 페이지로 리다이렉트
# 로그인 유지 체크박스가 선택된 경우 쿠키 설정
if request.POST.get('keep_login') == 'TRUE':
response.set_cookie('username', username) # 쿠키에 사용자 이름 저장
response.set_cookie('password', password) # 쿠키에 비밀번호 저장
return response
else: # 인증 실패 시
return render(request, 'account/login.html', {'error': 'Invalid credentials'})
# 기본 로그인 페이지 렌더링
return render(request, 'account/login.html')
로그아웃
def logout(request):
# 홈 페이지 렌더링
response = render(request, 'account/home.html')
# 쿠키 삭제
response.delete_cookie('username') # 사용자 이름 쿠키 삭제
response.delete_cookie('password') # 비밀번호 쿠키 삭제
# 사용자 로그아웃
auth.logout(request)
return response # 홈 페이지 응답 반환
💡Today I Thought
오늘의 체크리스트
- 알고리즘 코드카타 191-200
- SQL 코드카타 82-83
- 백준 코딩테스트 1문제
- 장고 심화 강의 13-14강
- TIL 작성
- WIL 작성
회고
오늘은 동생 생일이었다. 영국에 가는 중이라고…🥹 부러워.. 나는 12시간 앉아서 공부하고 있는데.. 나도 언능 취뽀해서 해외여행 다녀야지😁!! 이번주도 마무리!! 내일은 조금 쉬엄쉬엄 공부해야지😭 이번주는 유독 컨디션도 안좋고 잠도 잘 못깨는 일주일이었다. 다시 영양제 잘 챙겨야지..💊
댓글남기기