일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 서구동구예비군훈련장
- tacotron
- 프로그래머스
- 인하대학교
- 봉사활동
- 개발자회고
- 놀이동산의슈퍼컴퓨터를작동시켜라
- 개발자를위한파이썬
- texttospeech
- 나는리뷰어다
- 서버로그
- 로그남기기
- graphicdriver
- machinelearning
- 인천남중
- 우분투비트확인
- 2019회고
- 결과를얻는법
- Xangle
- 타코트론
- 노트북덮개
- 프로그라피
- jaypark.dating
- CrossAngle
- intell
- 쇠막대기
- 인하멘토링
- 한빛미디어
- 심플소프트웨어
- 신영준
- Today
- Total
jc.jang
TDD with Python 5장 본문
기능 테스트에서 예측하지 못한 에러가 발생하면, 다음과 같은 사항을 디버깅해야 한다.
- print문을 사용해서 현재 페이지 텍스트 등을 확인해본다.
- 에러 메시지를 개선해서 더 자세한 정보를 출력하도록 한다.
- 수동으로 사이트를 열어본다.
- time.sleep을 이용해서 실행 중에 있는 테스트를 잠시 정지시킨다.
용어 2: 단위 테스트 VS 통합 테스트, 그리고 데이터베이스
5장에서 데이터베이스 기능이 추가되었다. 코드만 테스트하는 것이 아니라 데이터베이스 같은 외부 시스템에 의존하기 때문에 통합 테스트(Intergrated test)라고 하는 것이 맞다고 할 수 있다.
현 시점에서는 이 차이를 무시해도 괜찮다. 우리가 다루는 테스트는 두 가지다. 사용자 관점에서 애플리케이션을 테스트하는 상위 레벨의 테스트인 기능 테스트와, 프로그래머 관점에서 테스트하는 하위 레벨의 테스트인 단위 테스트다.
단위 테스트와 통합 테스트에 대해서는 19장에서 다시 다룬다.
CSRF가 무엇인지 알아보자.
CSRF는 Cross-Site Request Forgery의 약자로 사이트간 요청 위조 정도로 해석할 수 있다.
이는 사용자가 의도하지 않은 작업을 수행하도록 유도하는 웹 해킹 방식이다. 공격자는 사용자가 의도하지 않게 작업을 수행 하도록한다. 예를 들어, 계정의 이메일 주소를 변경할 수 있다. 응용 프로그램에 사용자가 자신의 계정에서 이메일 주소를 변경할 수 있는 기능이 있다고 가정해보자. 사용자가 이 기능을 수행하면 다음과 같이 HTTP 요청을 한다.
POST /email/change HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Cookie: session=yvthwsztyeQkAPzeQ5gHgTvlyxHfsAfE
email=wiener@normal-user.com
다음과 같은 HTML이 포함된 웹 페이지를 구성 할 수 있다.
<html>
<body>
<form action="https://vulnerable-website.com/email/change" method="POST">
<input type="hidden" name="email" value="pwned@evil-user.net" />
</form>
<script>
document.forms[0].submit();
</script>
</body>
</html>
사용자가 이 웹 페이지를 방문하면 다음과 같은 상황이 발생한다.
이 페이지는 취약한 웹 사이트에 대한 HTTP 요청을 트리거한다. 사용자가 취약한 웹 사이트에 로그인 한 경우, 브라우저는 요청에 세션 쿠키를 자동으로 포함시킨다. 취약한 웹 사이트는 일반적인 방식으로 요청을 처리하고, 일반 사용자가 만든 것으로 처리하고, 이메일 주소를 변경한다.
CSRF 공격 방지
CSRF 공격을 방어하는 가장 강력한 방법은 관련 요청에 CSRF 토큰을 포함시키는 것이다.
CSRF 토큰은 서버 측에 의해 생성되어 클라이언트가 HTTP 요청에 포함시키는 방식으로 클라이언트에 전송되는 고유하고 예측할 수 없는 값이다. 서버 측은 요청에 토큰이 포함되어 있는지 확인하고 토큰이 없거나 유효하지 않은 경우 요청을 거부한다.
'개발 > Test-Driven Development with Python' 카테고리의 다른 글
TDD with Python 7장 (0) | 2020.01.21 |
---|---|
TDD with Python 6장 (0) | 2020.01.09 |
TDD with Python 4장 (0) | 2019.12.18 |
TDD with Python 1, 2, 3장 (0) | 2019.12.18 |