2.1 네트워크 애플리케이션의 원리

네트워크 애플리케이션 : 다른 위치의 종단 시스템에서 동작하고 네트워크를 통해 서로 통신하는 프로그램 웹 애플리케이션에는 서버와 클라어인트라는 두 가지 프로그램이 있다. 클라이언트 : 사용자의 호스트에서 실행되는 브라우저 프로그램 웹 서버 호스트에서 실행되는 웹 서버 프로그램 새로운 애플리케이션을 개발할 때, 라우터나 링크 계층 스위치처럼 네트워크 코어 장비에서 실행되는 소프트웨어까지 작성할 필요는 없다. 네트워크 코어 장비는 애플리케이션 계층에서 기능하지 않는 대신 네트워크 계층 및 그 하위 계층에서 기능한다. 종단 시스템에서만 애플리케이션 소프,트웨어가 존재한다. 2.1.1 네트워크 애플리케이션 구조 애플리케이션 구조는 네트워크 구조(ex. 1.5장에 나온 프로토콜 스택)와 다르다. 개발자 관점에서 네트워크 구조 : 고정되어 있고 해당 애플리케이션에 특정 서비스 집합을 제공 애플리케이션 구조(application architecture) : 개발자가 설계하며 애플리케이션이 다양한 종단 시스템에서 어떻게 조직되어야 하는지를 알려줌. 최근 가장 많이 사용하는 애플리케이션 구조가 현대 네트워크 애플리케이션에서 사용되는 “클라이언트-서버” 구조와 P2P 구조 클라이언트-서버 구조(client-server architecture) 서버(server) : 항상 동작하고 있는 호스트 클라이언트(client) : 서버에 서비스 요청을 보냄 이 구조에서, 클라이언트는 서로 직접적으로 통신하지 않는다. 서버는 고정 IP 주소를 갖는다. 클라이언트의 요청이 많을 경우 단일 서버 호스트가 모든 요청을 처리하긴 힘들다. 많은 수의 호스트를 갖춘 **데이터 센터(data center)**가 강력한 가상의 서버를 생성하는 역할을 함. P2P 구조 항상 켜져있는 인프라스트럭처 서버에 최소로 의존하거나 의존하지 않음 대신 **피어(peer)**라는 간헐적으로 연결된 호스트 쌍이 서로 직접 통신 피어(peer) : 서비스 제공자(service provider)가 소유하지 않고 사용자들이 제어하는 데스크톱과 랩톱 한 엔드시스템이 서버 역할을 해준다. 토렌트가 대표적인 P2P 구조 P2P구조는 **자가 확장성(self-scalability)**이 있다. 각 피어들이 파일을 요구함으로써 작업 부하를 만들어낸다. 하지만 파일을 다른 피어들에게 분배함으로써 그 시스템에 서비스 능력을 추가함. 토렌트에서 다운로드 받고 업로딩하는 사람이 많을 수록 그 파일은 다운로드 속도가 빨라지는데, 이유가 바로 이것이다. 서버 인프라스트럭처와 서버 대역폭이 필요하지 않아 비용 효율적이다. 보안, 성능, 신뢰성이 단점이다. 2.1.2 프로세스 간 통신 운영체제 용어에서 실제 통신하는 것은 프로그램이 아니라 **프로세스(process)**다. 프로세스(process) 종단 시스템에서 실행되는 프로그램 통신 프로세스가 같은 종단 시스템에서 실행될 때 그들은 서로 프로세스 간에 통신한다. 프로세스 간의 통신을 위한 규칙은 종단 시스템의 운영체제에 의해 좌우된다. 여기서 다룰 통신은 같은 호스트에서 프로세스가 통신하는 방법이 아닌, 다른 호스트에서 실행되어 통신할 때이다. 2개의 종단 시스템에서 프로세스는 컴퓨터 네트워크를 통한 메시지(message) 교환으로 통신한다. 송신 프로세스 : 메시지를 만들어서 네트워크를 보낸다. 수신 프로세스 : 메시지를 받고 역으로 메시지를 보내 응답한다. 클라이언트와 서버 프로세스 네트워크 애플리케이션 : 서로 메시지를 보내는 두 프로세스로 구성 ...

2024년 1월 24일 · 5 분 · 배준수

열심히 집중하여 최선을 다해 아무것도 못하기

Today I Learned 날짜 2024년 1월 24일 수요일 내용 하루종일 아무것도 해낸 게 없다. 다행히 오늘은 딱히 프론트쪽에 심어둔 폭탄이 없어서 급하게 바꾸거나 할 부분은 없었다. 지금 스프린트에서, 리뷰들을 수집해오면 기존에 존재하는 테이블에 리뷰 수집 기록을 남기고, 이 테이블의 자식 테이블 격인 분석 기록 테이블에 레코드를 추가한다. 그리고 리뷰를 분석하여 결과 테이블에 결과를 기록한다. 상품에 대한 정보 중 일부(제목, 판매량 등)이 DB에 저장되지 않는 문제가 발생했으나 해결하지 못하고 있다. 상황이 참 꼬여있는게, 로컬에서는 받아오는데 전혀 문제가 없고 로컬에서 테스트 서버의 데이터베이스에 연결해서 테스트서버를 구동해봐도 DB에 정보를 잘 저장한다. 하지만 테스트서버에서 API를 테스트 했을때만 일부 정보를 찾지 못한다. 따라서 해결을 위한 테스트는 모두 테스트 서버에서 이뤄져야 하는데 나는 아직 코드싸개라 권한이 없다보니 참 힘들다. ...

2024년 1월 24일 · 1 분 · 배준수

피그마 안 본 카르마

Today I Learned 날짜 2024년 1월 23일 화요일 내용 코드를 그지같이 짠 댓가를 톡톡히 치뤘다. 문제는 나만 치룬게 아니라는게.. 기획안과 피그마 피그마와 기획안 현황을 제대로 숙지하지 않았다. 그래서 여러 문제가 생겼는데, 여러 분석 결과를 보여주는 화면에 관련된 API를 만들지 않았다. 리뷰의 판정에 중립을 설정하지 않았다. 필요한 데이터를 제대로 넘기지 않았다. 이외에도 수두룩하다. API 자체는 급하게 만들었으나 여러가지 수정해야할 것들도 존재했고 똑바로 만들지 않아서 고쳐야 할 것도 많았다. 애초에 내가 잘 테스트해서 끝내놨어야 했는데 그러지 못해서 발생한 일이었다. ...

2024년 1월 23일 · 2 분 · 배준수

ECS 망령

Today I Learned 날짜 2024년 1월 22일 월요일 내용 진척이 많이 됐지만, 디테일이 많이 부족한 상황. ECS Task 이쯤되면 ECS가 일본 축구선수 (이) 시바사키 가쿠의 약자는 아닐까 의심된다. 오늘 weekly review report 메일이 발송되지 않았다. 지금은 스프린트 중이라 나중에 고쳐야하지만 얼추 봤을땐 cron식이 잘못된 것으로 보인다. 구글 스프레드시트에 데이터를 추가하는 Task에서도 오류를 발견했다. 작동자체는 잘 되지만 데이터 상의 날짜가 이틀 전으로 들어간다. 내가 넣고자 하는 날짜는 오늘이었으나, UTC 시간 상 한국 시간 8시는 전날 오후 11시다. 따라서 Task가 동작하는 시간의 “오늘”은 실제론 어제다. 그리고 내가 작성한 cronjob은 날짜를 어제로 설정한다. 이 cronjob은 어제의 “어제”, 즉 그저께를 가리키게 된다. ...

2024년 1월 22일 · 2 분 · 배준수

파이썬 알고리즘 : JadenCase 문자열 만들기

2024년 1월 22일 알고리즘 문제풀이 문제 JadenCase 문자열 만들기 난이도 Lv.2 코드 1 2 3 4 5 6 7 8 9 10 11 def solution(s): arr = [' '] + list(s) nums = ['1','2','3','4','5','6','7','8','9','0',' '] n = len(arr) for i in range(1,n): if arr[i-1] == ' ' and arr[i] not in nums: arr[i] = arr[i].upper() elif arr[i].isupper(): arr[i] = arr[i].lower() answer = ''.join(arr[1:]) return answer 단어의 가장 앞이 알파벳일 때, 대문자로 만들어줘야 한다. 처음엔 단어별로 끊어서 풀어보려 했지만 문제의 조건 상 연속된 공백문자가 나올 수 있어서 실패했다. 따라서 모든 글자를 잘게 쪼개서 공백문자 이후 알파벳이 나온다면, 단어의 시작인 알파벳이므로 대문자로 바꾸도록 했다. 그 외의 대문자가 나타날 경우 소문자로 바꿔주는 로직도 추가했다. ...

2024년 1월 22일 · 1 분 · 배준수

Fastapi의 Background task

Today I Learned 날짜 2024년 1월 19일 금요일 내용 오늘은 어쩌다보니 내 생각의 흐름을 적지 않았다. 막혀서 깊게 고민한 적이 없어서 그런가.. API 어제 리뷰들에 대한 세부 정보를 만드는 함수들을 다 만들었다. 오늘은 프론트에서 해당 데이터를 요청할 때를 응답하는 API를 만들었다. 이미 데이터를 저장하는 건 완성되어 있었기 떄문에, 알맞게 받아서 주는 것은 어렵지 않았다. 프론트를 내가 하는게 아니다보니 다른 사람도 쉽게 이해할 수 있도록 작성하려고 나름 노력했다. 각주에도 헷갈릴 만한 부분도 적고, parameter나 변수, 함수 이름도 최대한 직관적으로 적었다. 너무 이름이 길어서 좀 거슬리긴 한데, 이도 저도 아닌 이름보다 낫기도 하고 정 거슬리면 실서버 배포 전에 바꾸면 되겠지. ...

2024년 1월 19일 · 2 분 · 배준수

파이썬 알고리즘 : 키패드 누르기

2024년 1월 19일 알고리즘 문제풀이 문제 키패드 누르기 난이도 Lv.1 코드 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 32 33 34 35 def solution(numbers, hand): arr = [0 for _ in range(len(numbers))] position = [[3,1],[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2],[3,0],False,[3,2]] finger = [10,12] left = [1,4,7] right = [3,6,9] for i in range(len(numbers)): num = numbers[i] if num in left: arr[i] = 'L' finger[0] = num elif num in right: arr[i] = 'R' finger[1] = num else: number_position = position[num] left_finger = position[finger[0]] right_finger = position[finger[1]] distance_left = abs(number_position[0]-left_finger[0]) + abs(number_position[1]-left_finger[1]) distance_right = abs(number_position[0]-right_finger[0]) + abs(number_position[1]-right_finger[1]) if distance_left < distance_right: arr[i] = 'L' finger[0] = num elif distance_left > distance_right: arr[i] = 'R' finger[1] = num else: if hand == 'left': arr[i] = 'L' finger[0] = num else: arr[i] = 'R' finger[1] = num answer = "".join(arr) return answer 각 번호간의 거리를 어떻게 처리할지 고민하다가 키패드를 좌표라고 생각하고 각 숫자의 위치를 값으로 갖는 배열 position을 만들었다. ...

2024년 1월 19일 · 2 분 · 배준수

python package 알아보기

Today I Learned 날짜 2024년 1월 18일 목요일 내용 하루종일 함수를 만들면서 코드를 짰다. 재밌다! nltk 파이썬 패키지 중 하나로 자연어 처리를 위한 패키지이다. 자연어라 하면 그냥 사람들이 쓰는 언어(영어, 한국어, 일본어 등등)다. 자연어 처리라 하면, 사람들이 작성한 문장을 단어 단위로 쪼개기도 하고, 그 쪼갠 단어를 원형으로 변형해준다. 예를 들어, “벌써 이번 달의 절반이 지났다니 시간 참 빠르네” 라는 문장을 “벌써”, “이번”, “달”, “의”, “절반”, “이”, “지났다니”, “시간”, “참”, “빠르네” 로 쪼갠다. 보시다싶이 그냥 띄어쓰기로 쪼개는 게 아니라 실제 어근 단위로 쪼개준다. 물론 한국어보단 영어가 훨씬 정확하다. 위 단어들은 원래 형태가 아니기 떄문에 “빠르네”를 “빠르다”로 바꿔준다거나 “의” , “이”와 같은 조사(영어에서는 관사)를 제거해주기도 한다. 의미 없는 단어들을 불용어(stopwords)라고 한다. ...

2024년 1월 18일 · 2 분 · 배준수

파이썬 알고리즘 : 자연수 뒤집어 배열로 만들기

2024년 1월 18일 알고리즘 문제풀이 문제 자연수 뒤집어 배열로 만들기 난이도 Lv. 1 코드 1 2 3 4 5 def solution(n): answer = list(str(n)) answer.reverse() answer = list(map(int,answer)) return answer reverse와 map 함수의 형식이 은근히 헷갈린다.

2024년 1월 18일 · 1 분 · 배준수

1.6 공격받는 네트워크

1.6 공격받는 네트워크 나쁜 친구들은 인터넷을 통해 여러분의 호스트에 멀웨어(악성코드)를 침투시킬 수 있다 장치를 데이터를 수신/송신 하기 위해 인터넷에 연결하면, 좋은 것과 함께 malware(멀웨어)라는 해로운 것도 전달된다. 파일 삭제, 주민번호, 비밀번호, ekystroke(키스트로크: 키보드 입력) 등의 사적인 정보를 모으는 스파이웨어를 설치하여 인터넷으로 전송한다. botnet(봇넷) : 면역되지 않은 장치들 수 천개로 구성된 네트워크 봇넷은 스팸 전자메일 분배나 분산 Dos(denial of servie) 공격에 이용된다. 나쁜 친구들은 서버와 네트워크 인프라스트럭처를 공격할 수 있다 Dos(Denial-Of-Service) 공격 : 네트워크, 호스트 혹은 다른 인프라스트럭처의 요소들을 정상적인 사용자가 사용할 수 없게 하는 것 웹 서버, 전자메일 서버, DNS 서버, 기관 네트워크가 공격 대상이 될 수 있다. 인터넷 Dos 공격의 세 가지 범주 취약성 공격(vulnerabilty attack) : 목표 호스트에서 공격받기 쉬운 애플리케이션 혹은 운영체제에 메시지를 보냄 대역폭 플러딩(bandwidth flooding) : 목표 호스트로 수많은 패킷을 보내 정당한 패킷들이 도달하지 못하도록 함 연결 플러딩(connection flooding) : 목표 호스트에 반열림(half-open) 혹은 전열림(fully open)된 TCP 연결을 설정하여 가짜 연결을 처리하느라 정상적인 연결을 못 받도록 만든다. 대역폭 플러딩은 서버가 가진 접속 속도보다 높은 트래픽을 전송하면 된다. 트래픽을 하나의 소스에서 방사하면 공격을 차단할 수 있기 때문에 봇넷을 이용한다. 나쁜 친구들은 패킷을 탐지할 수 있다 packet sniffer(패킷 스니퍼) : 지나가는 모든 패킷의 사본을 기록하는 수동적인 수신자 패킷 스니퍼는 채널에 패킷을 추가하지 않아 탐지가 어렵다. 암호화를 통해 방지할 수 있다. 나쁜 친구들은 여러분이 신뢰하는 사람인 것처럼 위장할 수 있다 IP spoofing(IP 스푸핑) : 출발지 주소, 패킷 내용, 목적지 주소를 가짜로 작성하여 인터넷에 보내는 것. 출발지를 바꾸면 다른 사용자인 척을 할 수 있다.

2024년 1월 17일 · 2 분 · 배준수