라벨이 IT인 게시물 표시

[ERROR] django.security.DisallowedHost 줄이기

이미지
2025-06-09 23:46:54,400 [ERROR] django.security.DisallowedHost: Invalid HTTP_HOST header: '52.78.156.163'. You may need to add '52.78.156.163' to ALLOWED_HOSTS.   Django 서비스를 인터넷에 올리면 하루에도 수천건씩 위와 같은 로그가 쌓이는데, 인터넷은 무수히 많은 봇, 스캐너, 크롤러 등이 활동하는 공간이라 접근 시도는 어쩔 수 없다. 다만 Django 까지 가지 않고 그 앞단인 Nginx 에서 차단하면, 자원절약과 정돈된 Django 로그를 유지할 수 있다. if ($host !~* ^(yourdomain\.com|www\.yourdomain\.com)$) {     return 444; } 참고 444는 표준 http response 코드는 아니지만 nginx 에서의 권장사항으로, 클라이언트에게 아무런 정보도 주지 않는다.

Windows Subsystem for Linux (WSL)

이미지
WSL 을 보며 격세지감을 느낀다. 오래된 PC에 리눅스 설치하려고 며칠을 책을 뒤져가며 낑낑대던 기억이 있다. 그땐 하드웨어 드라이버 하나하나 잡아주는 것도 애를 먹었다. 점차 배포판이 올라가며 편리해지다가, 이후 VM 을 보고 우와~ 했는데, 이제는 윈도우랑 찰떡같이 합쳐졌다. 설치도 그냥 커맨드창에 이렇게 치면 끝이다. > wsl --install 재부팅 후 자동 설치된다 윈도우 창에 팽귄이라니... 참 어색하면서도 편리하다 설치된 배포판 조회 및 삭제 > wsl --list > wsl --unregister Ubuntu [참조] https://learn.microsoft.com/en-us/windows/wsl/about

A레코드 vs CNAME 차이

  A record: Routes traffic to an IPv4 address CNAME: Routes traffic to another domain name

Django 자동으로 생성된 ContentType, Permission 지우기

상황:  Django 에서 model 을 만들면, 자동으로 ContentType 과 Permission 이 생성되는데, 이후에 modeld 을 지워도 자동으로 지워지지는 않는다. 해결: shell 에서 수동으로 지운다. py manage.py shell from django.contrib.contenttypes.models import ContentType ContentType.objects.filter(app_label='your_app', model='your_model').delete() 결과: (5, {'auth.Permission': 4, 'contenttypes.ContentType': 1}) 연결된 Permission 4개도 함께 지워진다.

Django distinct() 안될 때 order_by() 확인

 Django 모델에 ordering 이 설정된 경우 쿼리에 자동으로 order by 가 붙는다 queryset 뽑을 때 order_by() 로 개별 설정할 수 있다 distinct() 로 쿼리에 distinct 를 붙일 수 있는데 특정 컬럼만 하려면 models.objects.values('your_val').distinct() 하면된다 이때도 order by 가 자동으로 붙어서 distinct 가 제대로 안 먹는다 models.objects.order_by().values('your_val').distinct() 이렇게 order by 를 없애줘야한다

Loadbalancer 붙였더니 ERR_TOO_MANY_REDIRECTS 발생

상황 lets encrypt 인증서로 https 서비스하다가 AWS Loadbalancer로 이중화 시도함. 오류 리디렉션한 횟수가 너무 많습니다. ERR_TOO_MANY_REDIRECTS 원인 nginx 설정에 listen 80 return 301 https://... https로 접속해도 로드밸런서와 내부 인스턴스 간 통신은 80으로 하기 때문에 반복해서 redirect 되었던 것 (20회) 해결 인스턴스의 443 설정은 모두 거두고 TLS는 로드밸런서에게 맡긴다.

암호 복잡도 강제 규칙의 우선순위는 어디쯤인가?

이미지
  ITGC 진행하면서 또 암호 설정 시 복잡도 규칙을 추가하라는 가이드가 나왔다.  - 영문, 숫자, 특수문자 조합하여 8자리 이상 무차별대입 공격의 대비인데, 현 시점에 웬만한 서비스는 로그인 누적실패에 따른 재시도 횟수제한이 있다. 만약 없다면, 이 장치의 마련이 최우선이다! 이런 장치가 미비하던 시절에는 아래와 유사한 표를 보여주며 '해커가 암호를 알아내는데 몇 초~ 몇 년 걸린다.' 하는 식으로 논리를 전개했었다. 조합별 경우의 수 (단위: 조) 물론 재시도 횟수제한이 없는 개인 엑셀파일이나, 탈취된 인증서 같은 경우, 무한한 부르트포스 공격이 가능하기 때문에 위와 같은 전략이 유효하다. 하지만 2022년 현 시점에 웹서비스 가입자에게 그리 중요한 포인트는 아니다. 다행히 2019년 개편된 KISA 가이드에는 이 복잡도 부분이 약간 완화되고, 다른 사회적 요인들에 대한 부분이 추가되었다. 종합적 사고 없이 보수적으로 들이대는 관습적인 잣대를 경계해야한다.

Pandas - NaN is a float

  현상 When I concate or merge, some columns are forced to change to Float64 원인 In  Working with missing data , we saw that pandas primarily uses  NaN  to represent missing data. Because  NaN  is a float, this forces an array of integers with any missing values to become floating point. In some cases, this may not matter much. But if your integer column is, say, an identifier, casting to float can be problematic. Some integers cannot even be represented as floating point numbers. 해결 astype('Int64') 임의변경

float 대신 decimal 을 쓰자

부동소수점 자료형 float python 에서 소수점이 포함된 숫자는 기본적으로 float 형이다. 컴퓨터 내부 이진수로 저장하기 때문에 십진수와 다르게 대부분 아래와 같이 근사값으로 저장된다.  >>> 1.5 * 0.009 0.013499999999999998 적당히 반올림해서 쓰면 문제가 없지만, 올림 또는 내림 시 문제가 될 수 있다. 이럴땐 Decimal 을 쓰자 >>> from decimal import Decimal >>> Decimal('1.5') * Decimal('0.009') Decimal('0.0135') 참고, nomalize() 로 소수점 뒤 0을 없앨 수 있다. >>> Decimal('12.34500').normalize() Decimal('12.345')

localhost vs 127.0.0.1 vs 0.0.0.0

같지 않다.  localhost localhost는 컴퓨터 네트워크에서 사용하는 루프백 호스트명으로, 자신의 컴퓨터를 의미한다. IPv4에서의 IP 주소는 127.0.0.1이며, IPv6에서는::1로 변환된다. 로컬 컴퓨터를 원격 컴퓨터인것처럼 통신할 수 있어 테스트 목적으로 주로 사용된다. 위키백과 127.0.0.1 The most commonly used IP address on the loopback network 0.0.0.0 인터넷 프로토콜 버전 4에서 주소 0.0.0.0은 유효하지 않거나 알 수 없거나 적용 할 수없는 대상을 지정하는 데 사용되는 라우팅 할 수 없는 메타 주소입니다. 네트워크 도메인 전체를 가리킴

Flask 3분 맛보기

$ pip install flask $ vi myapp.py from flask import Flask app = Flask(__name__) @app.route('/') def index():     return 'Hello Work' if __name__ == '__main__':     app.run(host='0', port=3000) $ python3 myapp.py 

Lightsail browser-based SSH log in fail

이미지
 AWS Lightsail Ubuntu 20.04 apt upgrade 이후 browser-based SSH 연결을 사용할 수 없다. Log in failed. If this instance has just started up, try again in a minute or two. CLIENT_UNAUTHORIZED [769] 이거슨... apt upgrade 할 때, ssh 설정이 바뀌면서 발생한 문제다. (아래와 같은 창이 뜨길래 첫 번째 옵션을 선택했었다) 재설정이 번거롭다면, 두 번째를 선택해서 현재 설정을 유지하도록 하자. 끝.

Django update_or_create 사용 시 주의 - 데이터 중복발생 가능성

  update_or_create() 를 사용해서 편리하게 데이터가 있으면 업데이트, 없으면 생성하고있었는데...  raise self.model.MultipleObjectsReturned( ehr.models.AnnualLeaveDetail.MultipleObjectsReturned: get() returned more than one AnnualLeaveDetail -- it returned 2! 확인해보니, get_or_create()  가 DB레벨의 Unique는 보장하지 않는다. As described above in  get_or_create() , this method is prone to a race-condition which can result in multiple rows being inserted simultaneously if uniqueness is not enforced at the database level. 참조: https://docs.djangoproject.com/en/4.0/ref/models/querysets/#update-or-create But, In my case, 구 버전의 일부 IE에서 중복으로 AJAX 를 던지는 문제로 '추측'하고있다.

AWS Elastic Beanstalk 에서 static files 설정하는 방법

이미지
  AWS Elastic Beanstalk 에서 static files 설정하는 방법 .config 파일에 아래와 같이 staticfiles 네임스페이스를 추가한다 option_settings:   aws:elasticbeanstalk:container:python:     WSGIPath: prj1.wsgi:application   aws:elasticbeanstalk:environment:proxy:staticfiles:     /static: static 배포 후 인스턴스에서 확인해보면 /etc/nginx/conf.d/elasticbeanstalk 위치에 00_application.conf 밖에 없었는데 01_static.conf 파일이 추가되어있으며, 내용은 이렇다. location /static {     alias /var/app/current/static;     access_log off; } 콘솔의 configuration 메뉴에 안 보이던 Static files 구성이 생겨있다!

Elastic Beanstalk Django error Python 3.8 Env

Python 3.7 환경으로 변경해서 해결함 NotSupportedError at /admin/login/ deterministic=True requires SQLite 3.8.3 or higher Django Version: 3.2.5 Exception Type: NotSupportedError Exception Value: deterministic=True requires SQLite 3.8.3 or higher Exception Location: /var/app/venv/staging-LQM1lest/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py , line 217, in get_new_connection Python Executable: /var/app/venv/staging-LQM1lest/bin/python Python Version: 3.8.5 Python Path: ['/var/app/current', '/var/app/venv/staging-LQM1lest/bin', '/var/app/venv/staging-LQM1lest/bin', '/usr/lib64/python38.zip', '/usr/lib64/python3.8', '/usr/lib64/python3.8/lib-dynload', '/var/app/venv/staging-LQM1lest/lib64/python3.8/site-packages', '/var/app/venv/staging-LQM1lest/lib/python3.8/site-packages']

jquery input readonly [radio, select, checkbox]

텍스트 필드는 그냥 readonly 처리하면 된다 $("#id_text").prop("readonly", true); radio, select, checkbox 필드는 readonly 가 없기에 보통 disabled 처리하는데, 그러면, submit 에서 제외되기 때문에 form validation 에 문제가 생긴다. 그래서 이렇게 처리해준다. 체크되지 않은 radio 만 disabled $("#id_radio").not(":checked").prop("disabled", true); 선택되지 않은 option 만 disabled $("#id_select option").not(":selected").prop("disabled", true); 체크박스는 클릭 안되게 binding $("#id_checkbox").bind("click", false);

AWSK 아마존 한국 법인 출범에 따른 부가세 부과

2020년 12월 1일 부로 AWS Korea (아마존웹서비시즈코리아) 가 생기면서, 기존에 사업자 등록을 하면 부가세(VAT) 부과가 면제되던 것이 없어졌다. 신용카드 결제의 경우 NHN KCP (NHN한국사이버결제) 가 결제 대행을 맡아서 한다. 참조  https://aws.amazon.com/legal/awsk/

오라클 ODBC 32/64비트 플랫폼 선택

ODBC 드라이버 설치할 때 64비트 OS에 64비트와 32비트 드라이버 모두 설치 가능하다. ODBC를 사용할 어플리케이션과 동일한 비트를 설치해야한다. 예를 들어, 파이썬 64비트에서 사용할 것이라면, 64비트 ODBC 드라이버를 설치해야한다.

파이썬 실행 python vs py 차이

python 은 설치폴더에 python.exe 의 실행이며, path 설정되어 있어야 함. py 는 c:\windows\py.exe 의 실행이며, 최신버전의 python 을 찾아서 실행시켜준다. 여러가지 python 버전이 설치된 경우 최신버전을 찾아서 실행해준다. 구 버전을 실행하고 싶다면 py -3 이렇게 버전을 적어준다.

아웃룩 2013 계정설정 없이 실행하기

이미지
아웃룩에서 계정설정 단계를 skip하고 기존에 가지고있는 데이터파일을 읽어올 수 있습니다. 아래 캡처를 참조하세요.