[TIL_Carrotww] 73 - 22/12/15

μœ ν˜•μ„Β·2022λ…„ 12μ›” 16일
0

TIL

λͺ©λ‘ 보기
86/138
post-thumbnail

πŸ“Carrotww의 μ½”λ”© 기둝μž₯

🧲 Session

πŸ” session μ΄λž€ ν΄λΌμ΄μ–ΈνŠΈλ³„ 정보λ₯Ό λΈŒλΌμš°μ €κ°€ μ•„λ‹Œ μ›Ήμ„œλ²„μ— μ €μž₯ν•˜λŠ” 것이닀.

ν΄λΌμ΄μ–ΈνŠΈμ˜ 정보λ₯Ό μ›ΉλΈŒλΌμš°μ €μ— μ €μž₯ν•˜λŠ” 것을 cookie라 ν•œλ‹€.
django session은 쿠킀에 session id λ₯Ό μ €μž₯ν•œλ‹€.
ν΄λΌμ΄μ–ΈνŠΈμ™€ μ›Ήμ„œλ²„μ˜ 연결성을 ν™•μΈν•œ ν›„ session idλ₯Ό 톡해 μ‹€ν–‰λœλ‹€.
session id λŠ” λΈŒλΌμš°μ €λ₯Ό λ‹«μœΌλ©΄ 사라진닀.

🧲 Session 원리

  1. μœ μ €κ°€ μ›Ήμ‚¬μ΄νŠΈ 접속
  2. μ›Ήμ‚¬μ΄νŠΈμ˜ μ„œλ²„κ°€ μœ μ €μ—κ²Œ session id λΆ€μ—¬
  3. μœ μ €μ˜ λΈŒλΌμš°μ €κ°€ session id cookie에 보쑴
  4. ν†΅μ‹ ν• λ•Œ session idλ₯Ό μ›Ήμ„œλ²„μ— 전솑
  • request 에 session idκ°€ λ“€μ–΄κ°€ 있음

πŸ” cookieλŠ” μ ‘μ†ν•œ μ›Ήμ‚¬μ΄νŠΈμ— μ˜ν•΄ μž‘μ„±λ˜λ©° μ‚¬μ΄νŠΈμ—μ„œ cookieλ₯Ό μ‚¬μš©ν•΄ μœ μ €μ˜ 둜그인 μƒνƒœλ₯Ό μœ μ§€ν•˜κ±°λ‚˜ μœ μ €μ˜ μ‚¬μ΄νŠΈ 이용 섀정을 κΈ°μ–΅μ‹œν‚¨λ‹€.

μ›Ήμ„œλ²„μ—μ„œ μ›ΉλΈŒλΌμš°μ €λ‘œ http 헀더λ₯Ό μ΄μš©ν•΄μ„œ 정보λ₯Ό 보내고 μΏ ν‚€λŠ” μ„œλ²„μ— μ ‘μ†ν• λ•Œλ§ˆλ‹€ μžλ™ μ „μ†‘λœλ‹€.
μΏ ν‚€λŠ” κ³΅μœ λ˜μ§€ μ•Šμ•„ λ‹€λ₯Έ μ›Ήμ‚¬μ΄νŠΈλŠ” λ‹€λ₯Έ μ›Ήμ‚¬μ΄νŠΈμ—μ„œ λ§Œλ“  μΏ ν‚€λ₯Ό λ³Ό 수 μ—†λ‹€.

🧲 django cookie둜 쑰회수 쀑볡 방지

πŸ” django session을 λ¨Όμ € 이해해야 ν•œλ‹€.
django viewμ—μ„œ ν…ŒμŠ€νŠΈλ‘œ 일단 μ•„λž˜ μ½”λ“œλ₯Ό μ°μ–΄λ³΄μ•˜λ‹€.

print(request.session)
print(request.session.session_key)


request session 은 μ–΄λ– ν•œ 객체가 였고
처음 μ ‘μ†ν•˜λŠ” λΈŒλΌμš°μ €μ— session keyλŠ” μ—†κΈ° λ•Œλ¬Έμ— none 값이 였게 λœλ‹€.
μ½”λ“œ

class ArticleDetailView(APIView):
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    def get(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        # 당일날 λ°€ 12μ‹œμ— μΏ ν‚€ μ΄ˆκΈ°ν™”
        tomorrow = datetime.replace(datetime.now(), hour=23, minute=59, second=0)
        expires = datetime.strftime(tomorrow, "%a, %d-%b-%Y %H:%M:%S GMT")

        serializer = ArticleDetailSerializer(article)
      
        response = Response(serializer.data, status=status.HTTP_200_OK)

        print(request.COOKIES)
        # μΏ ν‚€ 읽기 & 생성
        if request.COOKIES.get('hit'):
            cookies = request.COOKIES.get('hit')
            cookies_list = cookies.split('|')
            if str(article_id) not in cookies_list:
                response.set_cookie('hit', cookies+f'|{article_id}', expires=expires) # μΏ ν‚€ 생성
                with transaction.atomic(): # λͺ¨λΈ ν•„λ“œμΈ views에 1 μΆ”κ°€
                    article.views += 1
                    article.save()
        else:
            response.set_cookie('hit', article_id, expires=expires)
            article.views += 1
            article.save()

        serializer = ArticleDetailSerializer(article)
        response = Response(serializer.data, status=status.HTTP_200_OK)

        return response
  1. μΏ ν‚€ λ§Œλ“€κΈ°
    set_cookie(name, value, max_age)
    name : 쿠킀이름
    value : κ°’
    max_age : expires

  2. μΏ ν‚€ 데이터 읽기
    request.COOKIES.get(cookie name)

profile
Carrot_hyeong

0개의 λŒ“κΈ€