조회수 : 2558
작성일 : 2019-01-22 11:41
때는 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')
테스트도 성공했다!
결말
해커는 도망쳤고, 서버는 평화를 되찾았다.
앞으로 큰 문제 없이 서버를 운영하면 좋겠으나..
해커는 조력자를 구해 다시 서버를 공격하겠다 선언했다!
그래도 난 걱정이 없다.
왜냐하면 경찰청 사이버안전국이 나와 함께 하기 때문이다.
- 그들이 온다~ 답글 삭제 우린...... 그들의..... 노예야.... 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. * . *
- 뽀미맘 답글 삭제 정말 유용한 기능이네요!!하나 배워갑니다~아이들이 좋아할것 같아요!! 낭낭한 서비스 감사합니다~♥ 2019-07-23 13:49 | 114.70. * . *
- 김민수 답글 삭제 개 웃기네요 ㅋㅋㅋㅋ 일하다가 끅끅끅 하며 한참을 웃었네요. 2020-11-23 17:35 | 121.165. * . *