pip로 설치한 모든 패키지 삭제하기

pip로 설치한 모든 패키지 삭제하기

요즘들어서 가상환경 내에 설치한 패키지들을 다 삭제하고 재설치해야 할 일이 많아졌다. 어려운 작업은 아니지만 정리해두자.

1
pip freeze | xargs pip uninstall -y

The end..

Share

Django에서 ajax post 요청시 csrf token 문제 해결하기

Django에서 ajax 사용할때 발생하는 csrf 문제

장고에서 ajax를 조금씩 섞어서 사용하다보면 POST 요청을 보낼때 문제가 발생하게 된다. POST 요청에서는 보안상의 문제로 csrf token을 필요로하게 되는게 장고의 기본기능을 사용하지 않고 ajax를 통해서 요청하기 때문에 생기는 현상이다. 답은 의외로 간단한데 장고 공식페이지를 보면 두 가지를 얘기해주고 있다.

  1. @csrf_exempt 데코레이터 사용
  2. ajax post 요청을 발생시킬때 csrf token 생성 및 추가

하나씩 살펴보자.

  1. @csrf_exempt 데코레이터 사용

데코레이터를 이용해서 해결하는 방법이다. 장고 프로젝트의 설정을 보면 아래와 같이

1
'django.middleware.csrf.CsrfViewMiddleware',

csrf에 관련한 미들웨어가 있는 것을 볼 수 있다. 이 미들웨어 때문에 csrf에 대한 보안을 강화할 수 있는 건데 @csrf_exempt 데코레이터를 사용하게되면 csrf 보호 기능을 받지않아 csrf token을 사용하지 않아도 되게 된다.

1
2
3
4
5
6
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
return HttpResponse('Hello world')

즉 my_view 함수를 post 요청으로 호출할때마다 미들웨어를 통해 csrf token을 검사받아야 하지만 그러지 않아도 된다는 것이며 편리하지만 보안적인 측면을 포기하는 것이기 때문에 권장하지 않는 방법이다.

  1. js를 통해 csrf token 생성 및 주입

장고 공식홈페이지를 보면 자바스크립트로 ajax post 요청시에 csrf token을 만들고 삽입하는 코드가 나와있다. 그래서 그냥 쓰면된다

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
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i].trim();
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}

var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});

코드는 위와 같고 평소 js 사용하듯이 템플릿에 추가해주면 된다. HTML의 body에 그냥 추가하지 말고 장고의 static 기능을 추가해서 관리하면 더 좋을 것 같다.


<참고>

https://docs.djangoproject.com/en/2.2/ref/csrf/

Share

ubuntu에서 서비스 로그 확인하기

리눅스에서 로그 확인하는 법

로그 메세지를 확인함으로써 에러에 어떻게 대처할지 고민하기 시작하는 것 같다. 로그 메세지를 확인하는 방법은 여러가지가 있다. 대표적으로 nginx를 사용할때 access 또는 error 로그를 보기 위해 /var/log/nginx의 파일들을 살펴보는 것이 있다. 각각의 소프트웨어를 설치할 때 로그가 어디에 저장되는지 기본 설정이 되어있을 것이다. 패키지 관리자를 통한 소프트웨어 설치 이외에 개인적으로 설정해놓은 서비스들의 로그는 어떻게 봐야하는 것일까?

uwsgi를 이용하면서 명령어로 실행하는 것이 아닌 부팅때마다 자동으로 실행시키기 위해 서비스 등록을 하려고 시도했다. uwsgi를 위한 데몬 파일을 만들고 등록을 하려고 하면 계속 에러가 발생하고는 했는데, 에러가 발생한 것만 결과로 나오고 어디서 왜 어떤 에러가 발생했는지 알 수 없었다. 우연히 시스템에서 발생하는 모든 로그를 출력할 수 있는 걸 알았고 간단하게 정리하고자한다.

AWS EC2로 ubuntu를 사용하고 있는데, 서비스를 관리할때 systemctl 명령어를 사용한다. 서비스 로그를 살펴보기 위해서 journalctl이라는 명령어를 사용하며 옵션을 통해 특정한 서비스만의 로그를 핸들링할 수 있다.

시스템 전반적인 로그 확인

시스템에 찍히는 모든 로그를 볼 수 있다. 그렇기 때문에 여러가지 서비스들의 로그들이 혼합돼서 출력된다.

1
journalctl

오늘의 로그 확인

1
journalctl --since=today

특정 서비스의 로그 확인

1
journalctl -u <service_name>

<참고>

https://stackoverflow.com/questions/41937017/setting-up-systemctl-for-uwsgi

Share