[DB] Redis란 무엇인가? 기본적인 개념
Basic concepts about ‘Redis’
Basic concepts about ‘Redis’
Automatically reflect static resource changes
Apply changes to java files without restarting the server
SSL 서버인증서 HTTP : 암호화되지 않은상태 HTTPS : 암호화된 상태 브라우저로부터 어떤 웹서버로 보내진 암호화된 데이터는 사이트 운영자가 가진 비밀키를 이용해 원래 데이터로 되돌릴 수 있다. 그러나 운영자 외 악의를 가진 누군가가 운영자로 위장한 (피싱) 사이트를 구축해 데이터를 훔칠 가능성도 있다. 이 경우, 위장하지 않았음을 보장해주는 회사들을 **‘인증기관’**이라 부르며, 이 보장을 증명하는 것이 SSL 서버 인증서(인증서) 브라우저 주소창에서 열쇠아이콘을 클릭하면 볼수 있는 것이 SSL 서버 인증서 Route53의 두 가지 기능 ...
VPC vpc cidr : 10.0.0.0/16 서브넷 Subnet 간단 개념 개념 : VPC의 IP 주소 범위를 나누는 단위. 역할분리 - 외부에 공개하느 리소스 여부를 구별 기기 분리 - AWS 안에서의 물리적인 이중화(다중화)를 수행 subnet cidr : 10.0.0.0/20(public1) 10.0.16.0/20(public2) 10.0.64.0/20(private1) 10.0.80.0/20(private2) Internet Gateway internet gateway 생성 후 vpc에 연결 NAT Gateway NAT Gateway : private subnet 2개에 각각 대응해줄 2개의 NAT Gateway 생성 후 “퍼블릭 서브넷”에 1개씩 연결 ( + eip 할당 ) 라우팅 테이블 ...
Tomcat 서버의 애플리케이션 배포는 웹 애플리케이션 운영에서 가장 기본적인 영역이면서도, 실제로는 많은 개발자들이 정확한 동작 원리를 놓치고 있는 부분이다. 최근 고객사 운영 서버의 server.xml 설정을 분석하던 중, <Context> 태그와 <Host>의 appBase 속성이 혼재된 구성에서 WAR 파일 배포 과정에 대한 오해를 발견했다. 기존의 배포 설정 운영 중인 서버의 server.xml 설정: <Host name="localhost" appBase="/home/manager/eps/webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="/home/manager/eps/webapps/legacy" reloadable="false" /> <Context path="/v5" docBase="/home/manager/eps/webapps/ui5" reloadable="false" /> <!-- ... AccessLogValve 설정 ... --> </Host> 이 설정에서 명시적인 <Context> 배포와 appBase를 통한 자동 배포가 공존하고 있었음.. 그런데 여기서 문제가 발생. 새로운 버전의 ui5.war 파일을 배포하려 할 때, 기존 관리자는 다음과 같은 절차를 따르고 있었다. ...
Argparse argparse를 이용하면 파이썬 스크립트 실행시 사용자 임의의 Argument값을 넘겨서 활용할 수 있다. 유용한 argparse에 대하여 간단한 예제 import argparse # 인자값을 받을 수 있는 인스턴스 생성 parser = argparse.ArgumentParser(description='사용법 테스트입니다.') # 입력받을 인자값 등록 parser.add_argument("-testArg", dest="testDest", help="python argparse.py -testArg={입력값} 형태로 입력하세요~") # 입력받은 인자값을 args에 저장 (type: namespace) args = parser.parse_args() if args.testDest: print("결과값: ", args.testDest) **사용예시 : ** » python argparseTest.py --help usage: argparseTest.py [-h] [-testArg TESTDEST] 사용법 테스트입니다. optional arguments: -h, --help show this help message and exit -testArg TESTDEST python argparse.py -testArg={입력값} 형태로 입력하세요~ 결과값 : » python argparseTest.py -testArg=123 결과값: 123`
venv(가상환경) 사용 이유 파이썬을 다루다보면 다양한 패키지들을 사용하게 된다. 그렇게, pip3 install {패키지명}을 무분별하게 사용하다보면 로컬에 있는 다른 프로젝트 간 패키지 버전 충돌 혹은 패키지(라이브러리)간 의존성 문제가 발생하기도 한다. 이를 해결하기 위해 ‘venv’라는 파이썬 모듈로 패키지 환경 분리가 가능하며, 작업환경이 바뀌더라도 필요한 패키지들을 동일한 버전으로 설치해 작업할 수도 있다. 현재 설치되어있는 파이썬 패키지 목록 확인 pip list 가상환경 생성 python -m venv myenv venv 라는 모듈을 사용하겠다는 의미 myenv는 사용자 임의의 가상환경 별칭 ...
❓Injetion : 보안 취약점을 이용하여, 임의의 SQL 문을 주입하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위 ** 📜 Content** 🗡️ Injection 공격 예시 /* 어떠한 POST방식 API에 아래와 같은 인자값을 넘기는 것이 정상적인 방법일 때*/ { testKey : "testValue" } /* 악의적인 사용자는 다음과 같이 인자값을 설정하여 쿼리를 조작할 수 있다. */ { testKey : "testValue' and '해킹'='해킹" } 위 인자값이 SQL Query에 적용될 때 정상적인 인자값을 넘겨받은 쿼리 select * from testTable where key = 'testValue' Injection 공격을 시도된 쿼리 select * from testTable where key = 'testValue' and '해킹'='해킹' 🛡️ python에 대한 injection 방어 코드 실무에서 사용된 DB 호출 코드 방식 (Injection 대응 전) import psycopg2 from psycopg2.extras import RealDictCursor # DB 연결 준비 conn = psycopg2.connect("dbname={} user={} host={} password={}".format(db_name, db_user, db_host, db_pass)) # DB 호출함수 선언 def fetch(conn, query): result = [] cursor = conn.cursor(cursor_factory=RealDictCursor) cursor.execute(query) # SQL 실행 # DB조회 결과값 담기 raw = cursor.fetchall() for line in raw: result.append(line) return result # SQL 쿼리 선언 query = "select pjt_no, item_type from testTable " query += "where pjt_no = '" + pjt_no + "' " query += "and item_type = '" + type_cd2 + "'" # DB 호출함수 실행 result = fetch(conn=conn, query=query) Injection 대응 (Type 1) import psycopg2 from psycopg2.extras import RealDictCursor # DB 연결 준비 conn = psycopg2.connect("dbname={} user={} host={} password={}".format(db_name, db_user, db_host, db_pass)) # DB 호출함수 선언 def fetch(conn, query, sql_arg): result = [] cursor = conn.cursor(cursor_factory=RealDictCursor) cursor.execute(query, sql_arg) # SQL 실행 # DB조회 결과값 담기 raw = cursor.fetchall() for line in raw: result.append(line) return result # SQL 쿼리 선언 query = "select pjt_no, item_type from testTable " query += "where pjt_no = %(pjt_no)s" query += "and item_type = %(item_type)s" sql_arg = { 'pjt_no' : pjt_no, 'item_type' : item_type, } # DB 호출함수 실행 result = fetch(conn=conn, query=query, sql_arg=sql_arg) Injection 대응 (Type 2) (딕셔너리 타입(X) → tuple 타입으로 넘기는 것도 가능) ...
✅The blog works by importing posts written in Notion! Hello, I am jay, the owner of the blog. 🙂 If there is anything wrong or if you have any questions, please feel free to contact us by email. thank you! 😎 Blhamz wallpaper GITHUB. https://github.com/jay-lab