×

TODAY   20    TOTAL   2428   

 

Orca the Whale

Django 조회수 기능 구현하고 해커와의 싸움에서 승리했다. Django

조회수 : 162

작성일 : 2019-01-22 11:41

python django backend

때는 2019년...

2019년 첫 해가 밝은지 한 달도 안 되어 할 짓 없는 누리꾼이 내 서버에 공격을 가헀다.

서버를 지키기 위해 난 필사적으로 싸웠고, 결국 승리를 거머쥘 수 있었다.

지금 그 치열했던 상황을 기록으로 남기려 한다.



발단

원래 이 블로그는 게시글에 대한 모든 GET요청마다 조회수를 1씩 증가시켰다.

그래서 한 사람이 새로고침을 10번 하면 조회수가 10번 올라가는게 가능했었다.

그 문제를 해결하기 위해 각 분야의 전문가들과 토론을 하던 중이었다.

세상에 믿을 사람 없다는 사실을 망각해버린 나는 중요한 정보를 흘려버렸다.

심심한 사람 앞에서 이 어리석은 행동은 마치 하이에나 앞에서 생고기를 흔드는 것과도 같았다.



전개

잠시 후 이상한 연락을 받을 수 있었다.


접속자는 구글 크롤러와 나 밖에 없는 내 블로그가 인기라는 말에 난 본능적으로 뭔가 이상함을 느꼈다.

그리고 그 예상을 빗나가지 않았고..



준비되지 않은 성공은 독이라고 했던가.

아직 미숙한 내 서버는 갑작스런 관심에 울렁증을 보이는 듯 했다.


(빠르게 쌓여가는 접속 로그)

무심코 던진 돌에 개구리 맞아 죽듯, 친구의 장난이 내 저사양 서버에겐 디도스급의 성능 저하로 이어졌다.



절정

새로고침을 해도 조회수가 올라가지 않으면 공격이 끝날거라 판단, 빠르게 해결을 시작했다.

ip당 하루에 한 번 조회수가 올라가도록 설계를 했다.


~ 예상 시나리오 ~

1. 사용자가 게시글을 조회한다.

2. ip주소와 게시글 번호로 게시글 조회 기록을 저장하는 테이블에서 조회한다.

3. 조회 결과가 없거나 레코드의 날짜와 오늘 날짜가 다른 경우, 조회수를 1 올려주고 조회 기록을 갱신한다.

4. 레코드의 날짜가 오늘 날짜인 경우 조회수를 올리지 않는다.


먼저 사용자의 게시글 조회 기록을 저장하는 HitCount 테이블을 생성한다.

# Models.py
# 게시글 조회 기록 저장
class HitCount(models.Model):
    ip = models.CharField(max_length=15, default=None, null=True)  # ip 주소
    post = models.ForeignKey(SummerNote, default=None, null=True)  # 게시글
    date = models.DateField(default=timezone.now(), null=True, blank=True)  # 조회수가 올라갔던 날짜 

사용자가 게시글을 조회했을 때 처리만 해주면 끝.


# views.py
try:
    # ip주소와 게시글 번호로 기록을 조회함
    hits = HitCount.objects.get(ip=ip, post=post)
except Exception as e:
    # 처음 게시글을 조회한 경우엔 조회 기록이 없음
    print(e)
    hits = HitCount(ip=ip, post=post)
    SummerNote.objects.filter(attachment_ptr_id=post_id).update(hits=post.hits + 1)
    hits.save()
else:
    # 조회 기록은 있으나, 날짜가 다른 경우
    if not hits.date == timezone.now().date():
        SummerNote.objects.filter(attachment_ptr_id=post_id).update(hits=post.hits + 1)
        hits.date = timezone.now()
        hits.save()
    # 날짜가 같은 경우
    else:
        print(str(ip) + ' has already hit this post.\n\n')


테스트도 성공했다!



결말

해커는 도망쳤고, 서버는 평화를 되찾았다.

앞으로 큰 문제 없이 서버를 운영하면 좋겠으나..


해커는 조력자를 구해 다시 서버를 공격하겠다 선언했다!

그래도 난 걱정이 없다.


왜냐하면 경찰청 사이버안전국이 나와 함께 하기 때문이다.


There are 16 comments.

그들이 온다~ 우린...... 그들의..... 노예야....   106.255. * . * 2019-01-22 11:50 답글 삭제
ㅇㅉ 저기 누구 물어보신분?   122.32. * . * 2019-01-22 12:12 답글 삭제
상추 저요   211.236. * . * 2019-01-22 12:32 삭제
김의 기준 제가 이긴겁니다?   106.255. * . * 2019-01-22 13:46 답글 삭제
황준필 그러시던지    2019-01-22 14:23 삭제
김의 기준 범고래쨩 삐져또?????   106.255. * . * 2019-01-22 14:23 삭제
검의 거준 조회수, 그 후에는 댓글, 대답하지 않으면 이제는 서버가 다운될 것이다.   106.255. * . * 2019-01-22 17:33 삭제
황준필     2019-01-22 19:32 삭제
스탠다드킴 범고래쨩 삐져또??? 라고 했습니다.   106.255. * . * 2019-01-23 09:38 삭제
뤈랑호 zzzzzzzzzzzzzzzzzzzzzzzz   59.10. * . * 2019-01-23 11:12 답글 삭제
1234 왜 "해커와의 싸움에서 패배했다"는 안올리시나요?   106.255. * . * 2019-01-24 09:33 답글 삭제
황준필 패배한 적이 없기 때문입니다.    2019-01-24 10:51 삭제
1234 패배한 적이 정말로 없나요?   106.255. * . * 2019-01-24 17:56 삭제
5678 서버 주인은 진실을 은폐하고 있습니다    106.245. * . * 2019-01-25 14:31 삭제
1234 한 번 더 패배한 적 있게 만들어 드릴까요?   106.255. * . * 2019-01-25 14:34 삭제
5678 2차전 썰도 포스팅 부탁드립니다    106.245. * . * 2019-01-25 19:10 삭제
  • 그들이 온다~ 답글 삭제 우린...... 그들의..... 노예야.... 2019-01-22 11:50 | 106.255. * . *
  • ㅇㅉ 답글 삭제 저기 누구 물어보신분? 2019-01-22 12:12 | 122.32. * . *
  • 상추 삭제 저요 2019-01-22 12:32 | 211.236. * . *
  • 김의 기준 답글 삭제 제가 이긴겁니다? 2019-01-22 13:46 | 106.255. * . *
  • 황준필 삭제 그러시던지 2019-01-22 14:23 | 
  • 김의 기준 삭제 범고래쨩 삐져또????? 2019-01-22 14:23 | 106.255. * . *
  • 검의 거준 삭제 조회수, 그 후에는 댓글, 대답하지 않으면 이제는 서버가 다운될 것이다. 2019-01-22 17:33 | 106.255. * . *
  • 황준필 삭제 2019-01-22 19:32 | 
  • 스탠다드킴 삭제 범고래쨩 삐져또??? 라고 했습니다. 2019-01-23 09:38 | 106.255. * . *
  • 뤈랑호 답글 삭제 zzzzzzzzzzzzzzzzzzzzzzzz 2019-01-23 11:12 | 59.10. * . *
  • 1234 답글 삭제 왜 "해커와의 싸움에서 패배했다"는 안올리시나요? 2019-01-24 09:33 | 106.255. * . *
  • 황준필 삭제 패배한 적이 없기 때문입니다. 2019-01-24 10:51 | 
  • 1234 삭제 패배한 적이 정말로 없나요? 2019-01-24 17:56 | 106.255. * . *
  • 5678 삭제 서버 주인은 진실을 은폐하고 있습니다 2019-01-25 14:31 | 106.245. * . *
  • 1234 삭제 한 번 더 패배한 적 있게 만들어 드릴까요? 2019-01-25 14:34 | 106.255. * . *
  • 5678 삭제 2차전 썰도 포스팅 부탁드립니다 2019-01-25 19:10 | 106.245. * . *