DNS 캐싱

사용자가 도메인을 입력했을 때, 우선적으로 해당 도메인의 IP가 캐싱 되어있는지 확인하게 된다. 캐싱 되어있지않다면 해당 IP 주소와 관련된 지정 TTL이 허용하는 기간 동안 응답을 캐시에 저장한다. DNS 쿼리를 조기에 확인하여 로딩 시간이 향상되고, 대역폭/CPU 소비가 줄어듬 - DNS 캐시되지 않은 응답 - DNS 캐시된 응답 1. 브라우저 캐싱 : 최신 브라우저는 기본적으로 정해진 시간 동안 DNS 레코드를 캐시하도록 설계되어있다. 웹 브라우저와 가까울수록 캐시를 확인하고 IP 주소에 대한 요청을 처리하는 단계가 적어지기 때문이다. 예시로 Chrome의 경우 아래 주소에서 DNS 캐시의 상태를 볼 수 있다. ...

November 14, 2024 20:08 · 5 min · 862 words · nakji

DNS (Domain Name System)

What? Why? 사용자에게 친숙한 도메인 이름을 컴퓨터가 네트워크에서 서로를 식별하는 데 사용하는 인터넷 프로토콜(IP) 주소로 변환하는것 초기 인터넷에서는 각 컴퓨터의 이름과 IP 주소를 호스트 파일이라는 단일 파일에 저장하여 관리했다. 이 방식은 소규모 네트워크에서는 효과적이었지만, 인터넷이 급격히 성장하면서 수많은 도메인과 IP 주소를 관리하는 것이 비효율적이고 불가능해졌다. 이를 해결하기 위해 DNS가 개발되었는데 분산형 계층 구조를 통해 도메인 이름을 효율적으로 관리하고, 사용자가 웹사이트에 쉽게 접근할 수 있도록 도와준다. 요약하면 아래와 같다. 확장성: 수많은 도메인과 IP 주소를 효율적으로 관리 편의성: 사람이 이해하기 쉬운 도메인 이름을 사용하여 웹사이트에 접근 분산 관리: 전 세계적으로 분산된 서버를 통해 빠르고 안정적인 이름 해석을 제공 주요 DNS 목록 ...

November 12, 2024 19:56 · 3 min · 608 words · nakji

HTTPS

HTTPS (HTTP Secure) : HTTP의 보안이 강화된 버전이다. 소켓 통신에서 일반 텍스트를 이용하는 대신에, SSL이나 TLS 프로토콜을 통해 세션 데이터를 암호화한다. 1. HTTP와의 차이점 요약하면 HTTPS는 다음과 같은 차이점이 있다. 보안성: 보안 인증서를 통해 데이터 전송 시 암호화를 제공하여 보안을 강화 무결성: 데이터가 전송 중에 변경되지 않았음을 보장 신뢰성: 검색 엔진에서 우선순위를 우대받으며, 사용자에게 더 신뢰감을 보장 2. 동작 원리 1) URL 파싱 및 DNS 조회 브라우저는 URL을 확인하고 DNS를 통해 도메인을 IP 주소로 변환하여 전달한다. 2) 보안 연결 설정 서버는 TLS handshake를 통해 인증서를 클라이언트에 전송한다. 이 인증서에는 서버의 공개 키와 인증기관(CA)의 서명이 포함되어 있다. 3) 서버 처리 및 응답 생성 보안 연결이 설정되면 암호화된 요청을 서버로 보낸다. 서버는 요청을 해독하여 요청된 데이터, 상태코드 등으로 구성된 HTTPS 응답을 생성한다. 4) 응답 암호화 및 전송 서버는 TLS를 이용하여 응답을 암호화하고 클라이언트의 브라우저로 다시 전송한다. 이 암호화를 통해 전송되는 동안 데이터의 보안이 유지되고 데이터를 가로채더라도 내용을 해독할 수 없다. 5) 클라이언트에서의 처리 암호화된 응답을 수신한 브라우저는 이를 해독한다. 여기에는 웹 페이지를 표시하도록 렌더링하는 작업이 포함된다. 데이터가 완전히 전송되고 렌더링되면 TLS 연결은 종료된다. 3. 전달 내용 비교 ex) HTTP 요청 (평문 전송) ...

November 6, 2024 18:32 · 2 min · 402 words · nakji

HTTP

HTTP (HyperText Transfer Protocol) : 웹상에서 데이터를 송수신하기 위한 통신 규약으로 클라이언트와 서버 사이에 이루어지는 요청/응답 프로토콜이다. 예를 들어 클라이언트인 웹 브라우저가 HTTP를 통하여 서버로부터 웹 페이지(HTML) 등 정보를 요청하면, 서버는 이 요청에 응답하여 필요한 정보를 사용자에게 전달한다. 🔔 HTTPS를 정리하기 전, 최소한의 HTTP 정보만 정리한 것으로 일부 개념이 생략되어있습니다. HTTP 요청 : HTTP 요청을 할 때, 서로 다른 유형의 정보를 전달하는 일련의 인코딩된 데이터를 전달한다. 1. HTTP 버전 유형 HTTP 버전은 시간이 지나면서 여러 버전으로 업데이트되어 왔습니다. 간단히 요약하면 아래와 같은데 자세한 내용은 RFC 문서를 참고하시기 바랍니다. ...

November 4, 2024 14:46 · 3 min · 624 words · nakji

우리메일 API를 이용한 배치 스크립트

#!/bin/bash ######### NOTICE ############## # Itsm 요청이 왔을 때 # 메일 발송되는 것이 목적이라서 # 아래 소스는 ChatGPT로 # 최소한의 로직만 구현했습니다 ############################### ######## MAIL API ############ # 우리메일(WOORIMAIL) # https://woorimail.com # # 월 1만건 무료 발송 가능합니다 # 메일 1만건 모두 소진 시 # 당월 메일 발송이 중지됩니다 ############################## ###### TIME SETTING ########### # 현재 9시 ~ 18시까지만 # 동작하도록 세팅되어있으니 # 수정이 필요하면 아래 함수에서 # 시간 수정 부탁드립니다 # check_working_hours() ############################### ##### RECEIVER INFO ########### # 메일 발신자 정보 수정은 # 60번 줄 영역에 있는 값을 # 수정해주시면 됩니다 ############################### # Function to make API call and check response check_response() { # API details METHOD="POST" CONTENT_TYPE="application/x-www-form-urlencoded" ITSM_CHECK_URL="" # ITSM 접수대기 건수 URL ITSM_LIST_URL="" # ITSM 접수대기 리스트 URL BODY="id=1520" # 접수대기(1520), 처리중(1526) # ITSM 처리중 #ITSM_LIST_URL="" #BODY="id=1526" # 고정값 MAIL_URL="https://woorimail.com/" TYPE="api" MID="auth_woorimail" ACT="dispWwapimanagerMailApi" DOMAIN="" # 지정한 도메인 URL AUTHKEY="" # 키값 ################################################## # 아래처럼 세팅했을 경우 메일은 다음과 같이 발송됩니다 # # 발신자: YuY<[email protected]> # 회신할 경우, 받는사람: ID@이메일주소 ################################################## WMS_NICK="wms_nick" # 보낸사람 계정 SENDER_EMAIL="" # 회신할 사람 이메일 SENDER_NICKNAME="YuY" # 회신할 사람 닉네임 RECEIVER_NICKNAME="" # 받는 사람(나) 닉네임 RECEIVER_EMAIL=$RECEIVER_EMAIL # 받는 사람(나) 이메일 # Add cookies to the request COOKIE="JSESSIONID=$JSESSIONID" # ITSM JSessionID 값 # Make the API call and print the response RESPONSE=$(curl -s -X $METHOD \ -H "Content-Type: $CONTENT_TYPE" \ -H "Cookie: $COOKIE" \ -d "$BODY" \ $ITSM_CHECK_URL) # Extract result value from RESPONSE message RESULT_ITSM_READY_CNT=$(echo "$RESPONSE" | grep -oP 'result: \(\K[0-9]+') # Check if RESULT is greater than 0 and show dialog if validate_email "$RECEIVER_EMAIL"; then if [ "$RESULT_ITSM_READY_CNT" -gt 0 ]; then RESPONSE=$(curl -s -X $METHOD \ -H "Content-Type: $CONTENT_TYPE" \ -H "Cookie: $COOKIE" \ -d "$BODY" \ $ITSM_LIST_URL) RESULT_ITSM_READY_LIST=$(echo "$RESPONSE" | sed -n '/<table width="100%"/,/<\/table>/p' | sed -n '1,/<\/table>/p' | grep -o '<td[^>]*>[^<]*</td>' | sed -E 's/<\/?td[^>]*>//g') RESULT_ITSM_ALL_HTML=$(echo "$RESPONSE" | sed ':a;N;$!ba;s/\n/ /g' | grep -oP '<table width="100%".*?</table>') # Convert the multiline string to an array IFS=$'\n' read -r -d '' -a TD_VALUES_ARRAY <<< "$RESULT_ITSM_READY_LIST" MAIL_TITLE="ITSM " # Process the array in chunks of 7 num_values=${#TD_VALUES_ARRAY[@]} for ((i = 0; i < num_values; i += 7)); do MAIL_TITLE="$MAIL_TITLE ${TD_VALUES_ARRAY[i]} " done MAIL_TITLE=$(url_encode "$MAIL_TITLE") MAIL_CONTENT=$(url_encode "ITSM 대기건수: $RESULT_ITSM_READY_CNT 건 $RESULT_ITSM_ALL_HTML") MAIL_BODY="authkey=$AUTHKEY&domain=$DOMAIN&type=$TYPE&mid=$MID&act=$ACT&callback=&title=$MAIL_TITLE&content=$MAIL_CONTENT&wms_domain=woorimail.com&wms_nick=$WMS_NICK&sender_email=$SENDER_EMAIL&sender_nickname=$SENDER_NICKNAME&receiver_nickname=$RECEIVER_NICKNAME&receiver_email=$RECEIVER_EMAIL&member_regdate=20240604170101" RESPONSE=$(curl -s -X $METHOD \ -H "Content-Type: $CONTENT_TYPE" \ -d "$MAIL_BODY" \ $MAIL_URL) echo "Ready Itsm: $RESULT_ITSM_READY_CNT, $RESPONSE" else echo "Empty Itsm." fi else echo "Invalid email format. Please provide a valid email address." fi } # Function to check if current time is within working hours check_working_hours() { current_hour=$(date +%H) if [ "$current_hour" -ge 9 ] && [ "$current_hour" -lt 18 ]; then return 0 # Within working hours else return 1 # Outside working hours fi } # Function to validate email format validate_email() { # Regular expression for email validation regex='^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}$' if [[ $1 =~ $regex ]]; then return 0 # Valid email format else return 1 # Invalid email format fi } # Function to URL encode a string url_encode() { local string="${1}" local encoded="" # Convert the string to hex representation hex_string=$(echo -n "$string" | od -An -tx1 | tr ' ' '\n' | grep -v '^$') # Iterate over each character in the hex string for hex_char in $hex_string; do encoded+="%$hex_char" done echo "$encoded" } INTRODUCTION=" ################################################ ###### ITSM 로그인 후 ###### 쿠키에 등록된 JSESSIONID 값을 입력해주세요 ################################################ ################################################ # 입력 파라미터, 몇분마다 이메일로 발송할지 세팅 # 1: 시간, 분(minute) # 2: 이메일 주소 # # ex) ./checkItsm.sh 5 이메일주소 # -> 5분마다 접수대기 중인 itsm을 체크하여 # -> 1건 이상 있을 경우 입력한 이메일로 발송 # # Itsm이 장시간으로 접수대기 상태인 경우가 많을수록 # 시간을 길게 세팅하는게 좋습니다 # 권장 시간(분) 5 ~ 20 ################################################ 값을 제대로 입력하면 아래와 같은 형식의 문구가 나옵니다 - 접수대기 건수가 없는 경우 > Empty Itsm. - 접수대기 건수가 있는 경우, 메일 발송 > Ready Itsm: 1, result: ~~, error_msg: ~~ ... JSESSIONID: " # Prompt user to input JSESSIONID read -p "$INTRODUCTION" JSESSIONID # Check if the second argument is provided if [ -z "$2" ]; then echo "Please provide a RECEIVER_EMAIL as the second argument." exit 1 else RECEIVER_EMAIL="$2" fi # Check if argument is provided for interval, default is set to 5 minutes interval=${1:-5} # Loop indefinitely and check response every $interval minutes while true; do # Check if current time is within working hours if ! check_working_hours; then echo "Outside working hours. Exiting..." exit 0 fi check_response sleep "$interval"m done

June 12, 2024 14:44 · 4 min · 725 words · nakji

Difference between /dev/random and /dev/urandom

** 아래 내용은 GPT4 기반으로 정리했습니다. ** jvm 실행 옵션 중 Djava.security.egd 가 의미하는게 무엇인가 Djava.security.egd 옵션은 Java Virtual Machine(JVM)에서 암호화 작업을 위해 사용하는 엔트로피 소스를 지정하는 데 사용됩니다. EGD는 Entropy Gathering Daemon의 약자로, 시스템에서 무작위성(엔트로피)을 수집하는 메커니즘을 가리킵니다. 엔트로피란? 엔트로피는 무작위성의 정도를 나타내며, 암호화 작업에서 매우 중요합니다. 충분한 엔트로피가 없으면 암호화 알고리즘이 예측 가능해져 보안이 약화될 수 있습니다. Djava.security.egd 옵션의 역할: 이 JVM 옵션을 사용하여 애플리케이션이 엔트로피를 수집할 소스를 지정할 수 있습니다. 예를 들어, Linux 시스템에서는 /dev/random 또는 /dev/urandom 파일을 사용하여 엔트로피를 수집할 수 있습니다. /dev/random은 블로킹 모드로 운영되어 엔트로피 풀이 충분할 때만 데이터를 제공하는 반면, /dev/urandom은 비블로킹이며 더 빠르지만 엔트로피가 낮을 수 있습니다. 옵션 사용 예: -Djava.security.egd=file:/dev/urandom -jar your-application.jar ...

December 28, 2023 17:56 · 2 min · 359 words · nakji

PostgreSQL Vacuum and Cycle

** 아래 내용은 GPT4 기반으로 정리했습니다. ** VACUUM의 목적 저장 공간 회수: PostgreSQL은 MVCC (Multiversion Concurrency Control, 다중 버전 동시성 제어)라는 저장 시스템을 사용합니다. 이 시스템은 행이 업데이트되거나 삭제될 때마다 새로운 버전의 행을 생성합니다. 이로 인해 오래된 행 버전들이 시간이 지나며 쌓이게 됩니다. VACUUM은 이러한 오래되고 불필요한 행 버전을 정리하고 공간을 확보합니다. 트랜잭션 ID Wraparound 방지: PostgreSQL은 트랜잭션을 추적하기 위해 4바이트 트랜잭션 ID를 사용합니다. 이 ID는 크기에 제한이 있으며, 결국 wraparound될 수 있습니다. 이런 상황이 발생하면 데이터베이스는 더 이상 어떤 트랜잭션이 오래되었는지 새로운 것인지를 결정할 수 없게 됩니다. VACUUM은 오래된 트랜잭션 ID를 정리함으로써 이를 방지하는 데 도움이 됩니다. ...

December 19, 2023 17:56 · 4 min · 643 words · nakji

AES/CBC/PKCS7

용어 자체가 거창해보이지만 하나씩 해석해보면 AES 대칭키 암호화 방식 중 하나이고 CBC는 블록 단위로 암호화를 하는 AES 방식의 운영모드 중 하나이다. PKCS7은 AES128 방식을 쓴다고 하면, 128비트보다 작은 블록이 나오면 뒤에 값을 붙여주는 ‘패딩‘의 한 방식이다. 크게 암호화 방식은 대칭키, 비대칭키 방식이 있다. 대칭키는 암호화/복호화에 쓰이는 키가 같아서 속도가 빠르지만 해당 키값이 노출되면 문제가 생기고 관리가 쉽지 않다. 위에서 말한 AES는 DES방식의 결함이 발견되어 채택된 방식으로 128/192/256비트의 고정 블록 단위로 암호화를 수행한다. 특히 블록 암호화 방식은 평문의 길이와 상관없이 고정된 길이가 나오게 된다. ...

July 12, 2022 14:23 · 1 min · 188 words · nakji

신입 웹 개발자 면접 일화

지금은 취업한 상태고 취업 전에 면접 봤던 곳 중 정리해둔 것이 있어서 올려봅니다. 추가로, 작년 말에 면접 본거라서 자세하게 생각나지 않은 부분도 있습니다. 면접방식 4:4 임원면접, 발표 순서는 맨 우측 사람부터 시작했다가 중간부터는 왼쪽부터 진행함 자소서 질문하는 부분에서는 랜덤 면접 질문 1. 자기소개 약 1~2분 정도 준비했던 것을 발표함 소통과 도전에 대한 일화를 짧게 소개하면서 이 회사에서도 성과 있는 신입사원으로 거듭나겠다는 식으로 말함 2. 프로젝트 경험 및 협업에 중요한 것 프로젝트는 졸업 프로젝트했던 것을 발표했고 협업에 중요한 것은 소통과 시간, 소통을 하면서 서로가 지금 ~를 하고 있고 ~는 어떻게 해야 한다… 약속된 시간을 엄수하면서 진행해야 일정을 놓치지 않고… 어쩌고저쩌고 ...

June 28, 2020 18:14 · 3 min · 570 words · nakji