Day07
Day07
1. 네트워크 기초 2. 컴퓨터 시간 원리 3. 암호화 4. 함수형 프로그래밍 5. 객체지향과 프로토타입 6. 이벤트 루프
1. 네트워크 기초
1.1 브라우저에 URL을 입력시 발생하는 일
- URL을 해석한다.
- DNS를 조회한다.
- 해당 IP가 존재하는 서버로 이동한다.
- ARP를 이용하여 MAC 주소 변환을 한다.
- TCP 통신을 위해 socket을 연다.
- 서버는 응답을 반환한다.
- 브라우저는 렌더링을 한다.
2. 컴퓨터 시간 원리
2.1. 시간이 결정되는 방법
- 물리량
- 시간은 물리학 관점에서 봤을 때 시각과 시각 사이 간격을 표현하는 단위를 뜻한다.
- 위치
- 시간은 위치에 따라 다르게 표현될 수 있다.
- 천문 현상
- 지구 자전속도의 불규칙성, 지구의 자전주기와 공전주기 등 천문 현상으로 인한 시간 보정이 필요
- 문화
- 문화에 따라 시간 표현이 다를 수 있다.
- 역사
- 역사적 사건에 의해 시간은 다르게 표현될 수 있다.
- 사회
- 사회적 제도에 의해 시간은 변할 수 있다.
2.2. 협정 세계시
- 원자 시계와 윤초 보정을 기반으로 표준화한 시각
- 모든 시간대는 UTC+0을 기준으로 환산한다.
- 대한민국의 시간은 UTC+9
- 표기법은 ISO 8601을 따른다.
- 2021-03-20T09:00:00.000Z // UTC+0기준 2021년 3월 20일 9시
- 2021-03-20T09:00:00.000+09:00 // UTC+9기준 2021년 3월 20일 9시
- 가운데 T는 Time읠 의미하고 Z는 Zulu Time을 뜻한다.
- 경도 0(Zero)의 앞글자 z를 나타내고 z는 무선 통신 용어로 Zulu라고 표현된다.
2.3. 컴퓨터가 시간을 표현하는 방법
- 하드웨어의 시스템 클럭을 이용한다.
- 특정 시각(epoch)을 기준으로 시스템 클럭의 틱을 세는 것으로 구현된다.
- 이를 시스템 시간이라 부른다.
- 시스템 시간을 값으로 표현한 것을 타임스탬프(Timestamp)라고 부른다.
- 타임스탬프는 운영체제마다 기준 시간과 단위가 다를 수 있다.
- 유닉스 계열 운영체제에서 시간을 표시하는 방법을 Unix Time이라 부른다.
2.4. 시스템 클럭의 원리
- RTC(Real Time Clock)이라는 모듈을 사용한다.
- RTC는 메인보드에 붙어있어 전원을 끄더라도 계속 작동한다.
- RTC는 카운터 회로를 통해 클럭을 발생시킨다.
2.5. Unix Time
- 1970년 1월 1일 0시 0분 0초가 기준 시각이다.
- 1970년 1월 1일 0시 0분 0초인 이유는 유닉스를 개발한 데니스 리치가 그냥 이유 없이 정한 날짜이다.
- 1970년 1월 1일 0시 0분 0초 이전 시간은 음수로 표현된다.
- 초 단위로 시간이 증가한다.
2.6. 현재 시간을 알아내는 방법
- 시스템 시간을 네트워크 타임 프로토콜(NTP)를 통해 동기화할 수 있다.
- NTP 서버에 네트워크 요청을 하여 현재 시간을 받을 수 있다.
- NTP 서버는 계층으로 이루어져 있으며 그 계층을 Stratum이라고 부른다.
- 최상위 계층을 PRC(Primary Reference Clock)이라 부른다.
2.7. 시간을 사용할 기준
- 해당 지역 시간
- UTC
- 로깅
- 감사
- 시계열 데이터
- Time Zone이 적용된 시간
- 결제 시각
- 푸시 알림 시각
- UI 시각 표시
- 캘린더
2.8. JavaScript에서 사용법
- 간단하게 사용하면 Data객체를 사용할 수 있다.
- 조금 더 자세히 알고 싶다면
3. 암호화
3.1. 암호화
- 평문을 해독할 수 없는 암호문으로 변환하는 것을 의미한다.
- 단방향과 양방향 암호화가 존재한다.
3.2. 단방향 암호화
- 해시 알고리즘을 이용하여 평문을 복호화할 수 없는 형태로 암호화 한다.
- 대표적으로 MD5와 SHA 알고리즘이 있다.
- MD5와 SHA-0, SHA-1은 해시 충돌이 발생할 수 있는 취약점이 있기에 사용을 권하지 않는다.
- 복호화가 불가능 하지만 Rainbow Table을 통해 원문을 알아낼 수도 있다.
- 이는 salt, key stretching 등의 추가적인 방법을 이용하여 해결할 수 있다.
- salt
- salt는 평문에 임의의 문자열을 추가하여 암호화하는 방법을 말한다.
- salt는 128bit 이상으로 만들 것을 권장한다.
- 사용자마다 다른 salt를 사용하게 하면 더 안전하다.
- key stretching
- 해시를 여러 번 반복하여 원문을 알기 힘들게 만드는 방법
- 일반적인 시스템에서 0.2초 이상 반복되면 안전하다고 한다.
- salt
- sal와 key stretching을 이용하는 알고리즘
- PBKDF2
- NIST(미국표준기술연구소)에서 승인된 알고리즘
- DIGEST = PBKDF2(
- bcrypt
- 비밀번호 저장을 목적으로 탄생했다.
- OpenBSD에서 기본으로 사용하고 있는 알고리즘
3.3. 양방향 암호화
- PBKDF2
- 평문을 복호화할 수 있는 형태로 암호화하는 방법
- 대칭키와 비대칭키 알고리즘으로 나뉜다.
- 대칭키 알고리즘 : 같은 키를 사용하여 암호화, 복호화가 가능하다. 대표적으로 AES가 있다.
- 비대칭키 알고리즘 : 같은 키를 사용하여 암호화는 가능하지만 복호화는 불가능하다. 대표적으로 RSA가 있다. 공개키와 개인키가 존재한다. RSA는 소인수분해를 기반으로 만들어진 알고리즘이다.
- JavaScript에서 암호화하는 방법
- crypto-js를 사용한다.
4. 함수형 프로그래밍
- crypto-js를 사용한다.
- 프로그램은 순차, 분기, 반복, 참조로 구성된다.
4.1. 함수형 패러다임
- 객체지향 추상화의 최소 단위가 객체인 것처럼 함수형은 함수가 최소 단위이다.
- 함수 단위로 나눠지므로 재사용성이 높다.
- 불변성을 지향하기에 동작을 예측하기도 쉽고 사이드 이펙트를 방지한다.
- 객체지향은 제어 흐름의 간접적인 전환에 부과되는 규율
- 함수형은 변수 할당에 부과되는 규율
4.2. 함수형 프로그래밍의 장점 및 단점
- 상태가 없기 때문에 사이드 이펙트가 없다.
- 재사용성이 높다.
- 코드가 짧고 간결하다.
4.3. 선언형 프로그래밍
- 기존 명령형 프로그래밍은 문제를 어떻게 해결해야 하는지 컴퓨터에게 명령을 내리는 방법
- 선언형 프로그래밍은 무엇을 해결할지에 집중하고 해결 방법은 컴퓨터에게 위임하는 방법
5. 객체지향과 프로토타입
5.1. 객체지향이란?
- 객체지향의 객체는 현실에 있는 것을 추상화한 것이다.
- 객체 지향이란 객체 위주로 설계하고 프로그래밍하는 패러다임
- 객체지향 언어에선 추상화의 최소 단위가 객체이다.
- 각각의 객체는 메세지를 주고받을 수 있다.
5.2. JavaScript에서의 객체지향
- 클래스 기반 언어처럼 속성(attribute)와 행위(method)를 정의할 수 있다.
- 객체 리터럴, Object, 생성자 함수 세 가지 방법을 이용할 수 있다.
5.3. 프로토타입의 필요성
- 프로토타입이란 기존의 객체를 복사하여 새로운 객체를 생성하는 방식이다.
![]() |
![]() |
![]() |
6. 이벤트 루프
- JavaScript 엔진은 Single Thread로 동작한다.
- JavaScript의 Call stack은 하나만 존재한다.
- 브라우저의 multithread로 동작하기에 javascript로 여러 다양한 작업들을 할 수 있다.
- 비동기 작업은 task queue뿐만 아니라 microtask queue, animation frames에도 등록된다.