1일 1로그 IT지식

IT 2022. 6. 1. 16:04

- 주 기억 장치 primary memory 
프로세서와 컴퓨터의 다른 부분이 현재 사용 중인 정보를 저장하는데, 저 장된 정보의 내용은 프로세서에 의해 변경될 수 있다. 주 기억 장치는 프 로세서가 현재 작업 중인 데이터뿐만 아니라 프로세서가 그 데이터로 무 엇을 해야 하는지 알려 주는 명령어도 저장한다. 이 점은 매우 중요하다. 메모리에 다른 명령어를 로드(적재)하여 프로세서가 다른 계산을 수행하 게 할 수 있다. 이러한 원리로 프로그램 내장식 stored-program 컴퓨터는 범용 장치가 된다. 같은 컴퓨터로 워드프로세서와 스프레드시트를 실행하고, 처리를 하고, 음악을 재생할 수 있는데, 이 모든 일이 적합한 명령어를 메 모리에 배치함으로써 가능해진다. 프로그램 내장식이라는 아이디어는 매 우 중요하다. 주 기억 장치는 컴퓨터가 실행되는 동안 정보를 저장할 장소를 제공한다. 주 기억 장치는 워드Word, 포토샵Photoshop, 브라우저 등 현재 활성화된 프로그램의 명령어를 저장한다. 아울러 그러한 프로그램의 데이터, 즉 편집 중인 문서, 화면에 표시된 사진, 웹에서 재생 중인 음악 등을 저장한다. 또한 애플리케이션 여러 개를 동시에 실행할 수 있도록 배후에서 작동하 는 운영체제(윈도우, 맥OS, 다른 운영체제)의 명령어도 저장한다. 
주 기억 장치를 RAM, 즉 '임의 접근 메모리'라고도 부르는 이유는 프로 세서가 정보에 접근할 때 메모리에 저장된 위치와 무관하게 같은 속도로 접근할 수 있기 때문이다. 지나친 단순화로 느껴질 수도 있겠지만, 메모리 의 어떤 위치에 무작위로 접근하더라도 접근 속도는 거의 비슷하다. 이제 자취를 감추기는 했지만 비디오테이프를 생각해 보자. 비디오테이프로 영화의 마지막 부분을 보려면 시작부터 전체를 빨리 감기(실제로는 느리다!)’ 해야만 했다. 이러한 방식은 순차적 접근sequential access 이라고 한다.
- 프로세서 간에 속도를 비교하는 것은 어려울 뿐만 아니라 그다지 의미 도 없다. 산술 연산 같은 기본적인 작업조차 일대일로 비교하기 어려울 만 큼 서로 다른 방식으로 처리되기도 한다. 예를 들어, 어떤 프로세서는 두 수를 더하고 다른 위치에 결과를 저장하기 위해 모형 프로세서처럼 세 개의 명령어가 필요하다. 다른 프로세서는 두 개의 명령어만 필요하고, 또 다른 프로세서는 그 연산을 단일 명령어로 처리한다. 하나의 프로세서가 몇 개의 명령어를 병렬적으로 처리하거나 겹쳐서 실행함으로써 명령어 처 리가 단계적으로 진행되도록 할 수도 있을 것이다. 프로세서가 전력 소모 를 낮추고자 빠른 실행 속도를 포기하기도 하며, 심지어 전력이 배터리에 서 공급되는지 아닌지에 따라 속도를 동적으로 조정하기도 한다. 일부 프 로세서는 고속 코어와 저속 코어의 조합으로 구성되며, 코어 유형별로 서 로 다른 작업을 할당하기도 한다. 그러므로 어떤 프로세서가 다른 것보다 빠르다'는 주장은 조심스럽게 받아들여야 한다. 요구사항에 따라 차이가 있을 수 있다.
- 프로세서에서 캐시는 용량이 작고 속도가 빠른 메모리로, 용량이 더 크지만 훨씬 느린 주 기억 장치에 매번 접근하는 것을 피하고자 최근에 사용된 정보를 저장하는 데 사용된다. 프로세서는 일반적으로 여러 그룹의 데이터와 명령어에 짧은 간격으로 잇달아 여러 번 접근한다. 예를 들어, 그림 1.20(71쪽)에 있는 프로그램에서 루프에 있는 명령어 다섯 개는 입력된 수 각각에 대해 한 번씩 실행된다. 만일 그 명령어들이 캐시에 저장되면 루프가 실행되는 동안 매번 메모리에서 인출하지 않아도 되고, 프로그램은 메모리 작업을 기다릴 필요가 없어져서 더 빨리 실행될 수 있을 것이다. 이와 유사하게 Sum을 데이터 캐시에 유지하는 것도 접근 속도를 높여 주기는 하겠지만, 실제로 이 프로그램에서 진짜 병목 현상은 데이터를 가져오는 과정에서 발생한다.  일반적인 프로세서에는 캐시가 2~3개 있는데, 흔히 L1, L2, L3 레벨이 라고 부르고 뒤로 갈수록 용량은 크지만 속도는 더 느리다. 가장 큰 캐시 는 데이터를 몇 MB 정도 담을 수 있다(내 노트북은 256KB짜리 L2 캐시가 각각의 코어에 있고, 4MB짜리 L3 캐시가 하나 있다). 캐싱이 효과적인 이 유는 최근에 사용된 정보가 곧 다시 사용될 가능성이 크기 때문이다. 캐시에 정보를 포함하고 있다는 사실은 메모리 작업을 기다리는 데 시간을 덜 쓴다는 것을 뜻한다. 캐싱 과정에서는 대개 정보를 블록 단위로 동시에 불 러온다. 예를 들어 단일 바이트에 대한 요청이 들어오면, 연속된 메모리 위치를 포함한 블록을 불러온다. 그 이유는 인접한 정보라면 곧 사용될 가 능성이 높으므로, 미리 불러와 두면 필요할 때 캐시에서 바로 꺼내 쓰기 쉽기 때문이다. 그렇게 되면 근처에 있는 정보를 참조할 때 기다리지 않고 바로 볼 수 있을 것이다.
- 분산 컴퓨팅distributed computing은 네트워크로 연결되어 서로 독립적으로 작동하는 여러 대의 컴퓨터를 일컫는 말이다. 분산 컴퓨팅 시스템은 메모 리를 공유하지 않고 물리적으로 넓게 흩어져 있다. 심지어 전 세계의 다양 한 지역에 퍼져 있기도 하다. 컴퓨터가 흩어져 있을수록 통신이 잠재적 병목 현상을 일으킬 가능성이 커질 수도 있지만, 사람과 컴퓨터가 공간적으로 멀리 떨어져 있어도 상호 협력해서 일할 수 있다는 장점이 있다. 검색 엔진, 온라인 쇼핑, SNS, 일반적인 클라우드 컴퓨팅 같은 대규모 웹 서비 스가 분산 컴퓨팅 시스템으로 이루어져 있고, 수천 대의 컴퓨터가 많은 사용자에게 결과를 빨리 제공하고자 상호작용한다. |이 모든 컴퓨터는 동일한 핵심 원칙을 갖는다. 즉, 한없이 다양한 작업 알고리즘은 추상적이고 이상적인 절차를 기술한 것으로, 구현에 필요한 세부 사항과 현실적인 고려 사항을 무시한다. 알고리즘은 정확하고 명료한 레시피이다. 의미가 완전히 알려져 있고 구체적으로 명시된 기본 연산 으로 표현된다. 이러한 기본 연산을 사용하여 각 단계를 상세히 설명하고 모든 가능한 상황을 다룬다. 그리고 알고리즘은 결국 멈춰야 한다.
이와 대조적으로 프로그램program은 추상적인 것과는 거리가 멀다. 프로그램은 실제 컴퓨터가 과제를 완료하기 위해 수행해야 하는 모든 단계를 구체적으로 서술한다. 알고리즘과 프로그램 간의 차이는 청사진과 건물 간의 차이와 비슷하다. 한쪽은 이상적인 것이고, 다른 쪽은 실재하는 것이다. 프로그램을 하나 이상의 알고리즘이 컴퓨터가 직접 처리할 수 있는 형태로 표현된 것이라고도 생각해 볼 수 있다. 프로그램은 알고리즘과 달리 실질적인 문제도 신경 써야 한다. 불충분한 메모리, 제한된 프로세서 속 도, 유효하지 않거나 악의적으로 잘못된 입력 데이터, 하드웨어 결함, 네 트워크 연결 불량, 그리고 (배후에서 작용하고 종종 다른 문제를 악화시키 는) 인간적인 약점 등의 문제가 포함된다. 따라서 알고리즘이 이상적인 요리 레시피라고 하면, 프로그램은 적군의 공격을 받는 동안 군인들이 먹을 1개월치 식사를 로봇에게 준비하도록 하는 상세한 명령어 모음이라고 할 수 있다.
- 특정한 처리를 수행하는 프로그램을 어셈블러assembler라고 한 다. 원래는 다른 프로그래머가 사전에 작성했던 프로그램에서 필요한 부 분을 모으는 역할을 하기도 했기에 붙은 이름이다. 이 프로그램 작성에 사 용되는 언어는 어셈블리 언어assembly language라고 하고, 이 수준의 프로그 래밍은 어셈블리 언어 프로그래밍assembly language programming이라고 한다. 1부에서 '모형 컴퓨터를 기술하고 프로그래밍하기 위해 사용했던 언어가 바로 어셈블리 언어다. 어셈블러는 프로그램을 수정하는 일을 훨씬 쉽게 해준다. 프로그래머가 명령어를 추가하거나 삭제할 때 변경 기록을 직접 관리하는 대신 어셈블러가 각 명령어와 데이터 값이 메모리상 어느 위치에 있을지 파악해 주기 때문이다.
- 특정 프로세서 아키텍처에서 사용되는 어셈블리 언어는 그 아키텍처에 특화된 언어다. 어셈블리 언어는 대개 프로세서의 명령어와 일대일로 연 결되고, 명령어가 이진수로 인코딩되는 특정한 방식과 메모리에 정보가 배치되는 방식 등을 알고 있다. 즉, 어떤 작업을 수행하기 위해 특정 종류 의 프로세서(예를 들면, 맥이나 PC의 인텔 프로세서)의 어셈블리 언어로 작성된 프로그램은 다른 프로세서(휴대전화의 ARM 프로세서)에 맞춰 작 성된 어셈블리 언어 프로그램과는 다르다는 뜻이다. 특정 프로세서용 어 셈블리 언어 프로그램을 다른 프로세서용으로 변환하고 싶다면 프로그램 을 완전히 새로 작성해야 한다.
- 1950년대 말, 1000년대 초에 컴퓨터가 프로그래머를 대신해서 더 많은 일을 수행하게 되는 또 다른 움직임이 일어났는데, 아마도 프로그래밍의 역사에서 가장 중요한 발걸음이었을 것이다. 바로 특정 프로세서 아키텍처에 독립적인 고수준 프로그래밍 언어 high-level programming language의 개발이다. 고수준 언어를 쓰면 사람이 표현하는 방식에 가까운 용어로 계산 과정 을 작성할 수 있다.  고수준 언어로 작성된 코드는 번역기 프로그램을 통해 대상 프로세서의 어셈블리 언어로 된 명령어로 변환된 다음, 어셈블러에 의해 비트로 변환 되어 메모리에 로드되고 실행된다. 여기서 번역기 프로그램은 보통 컴파 일러compiler라고 불리는데, 그다지 통찰력이나 직관이 느껴지지 않는 역사적 용어다.
- 프로그래밍 언어는 앞으로 어떻게 발전할까? 짐작건대 우리는 더 많은 컴퓨터 자원을 우리에게 유용한 방향으로 사용함으로써 프로그래밍을 계속 해서 쉽게 만들 것이다. 또한 프로그래머가 더 안전하게 사용할 수 있는 언어를 만드는 방향으로 나아갈 것이다. 예를 들어, C 언어는 매우 예리한 도 구다. C 언어로는 늦게까지 검출되지 않는 프로그래밍 에러를 무심코 만들 기 쉬운데, 이런 에러는 어쩌면 이미 흉악한 목적으로 이용된 다음에야 발 견될 수도 있다. C 이후에 나온 언어들은 이러한 에러를 일부 방지하거나 검출하기 쉽게 되어 있지만, 더 느리게 실행되거나 메모리를 더 많이 차지 하는 등의 희생이 따른다. 대체로는 이런 방향으로 나아가는 것이 정당한 트레이드오프지만, 자원을 덜 쓰면서 빠른 코드를 작성하는 것이 매우 중요 해서 C처럼 효율성이 높은 언어가 계속 사용될 응용 분야가 분명히 아직 많다. 예를 들면 자동차, 항공기, 우주선, 무기 등에 있는 제어 시스템이 그렇다.
- 연관된 함수들의 모음을 보통 라이브러리library라고 한다. 예를 들어, C 언어에는 디스크나 다른 위치에서 데이터를 읽고 쓰는 함수로 구성된 표 준 라이브러리가 있고, scanf와 printf도 이에 속한다.  함수 라이브러리가 제공하는 서비스는 애플리케이션 프로그래밍 인터 페이스Application Programming Interface, 즉 API로 프로그래머에게 제공된다. API는 포함하는 함수와 더불어 함수의 용도가 무엇인지, 함수를 어떻게 사용해야 하는지, 어떤 입력 데이터를 요구하는지, 어떤 값을 만들어 내는 지 나열한다. 또한 API는 시스템 내부에서 주고받는 데이터의 구조를 의 미하는 자료 구조와 기타 세부 사항도 기술할 수 있다. 이 모든 것이 모여 프로그래머가 서비스를 요청하기 위해 무엇을 해야 하고 결과적으로 무엇 이 계산될지 정의한다. 이러한 명세는 상세하고 정확해야 한다. 결국 프로그램을 해석하는 것은 친절하고 협조적인 사람이 아니라 말도 안 통하고 명령을 곧이곧대로 받아들이는 컴퓨터이기 때문이다.
- API는 구문과 관련된 기본 명세뿐만 아니라 시스템을 효과적으로 사용하도록 돕는 지원 문서도 포함한다. 요즘 대규모 시스템은 프로그래머들 이 복잡한 소프트웨어 라이브러리를 잘 다룰 수 있도록 소프트웨어 개발키트Software Development Kit, 즉 SDK를 포함한다. 예를 들어, 애플은 아이폰과 아이패드 코드를 작성하는 개발자를 위해 개발 환경과 지원 도구를 제공 한다. 구글은 안드로이드용 SDK를 제공한다. 마이크로소프트는 윈도우 코드를 여러 가지 장치에 대해 다양한 언어로 작성할 수 있는 폭넓은 개발 환경을 제공한다. SDK 자체도 대형 소프트웨어 시스템이다. 예를 들어, 안드로이드 개발 환경인 안드로이드 스튜디오Android Studio는 용량이 1.6GB 이고 애플 개발 환경인 Xcode는 그보다 훨씬 크다.
- 프로그래머가 작성하는 코드는 어셈블리 언어든 고수준 언어든 소스 코드 source code라고 한다. 소스 코드를 프로세서에서 실행하기에 적합한 형태로 컴파일한 결과는 오브젝트 코드object code라고 한다. 이런 구분이 너무 현학 적으로 보일지 모르겠지만, 용어 정의를 명확히 하는 것은 중요하다. 소스 코드는 약간의 수고가 따르더라도 프로그래머가 읽을 수 있는 형태라서, 코드를 연구하여 상황에 맞춰 수정할 수 있고 코드에 포함된 혁신적인 기 결이나 아이디어를 읽어 낼 수도 있다. 이와 달리 오브젝트 코드는 너무 많은 변환 과정을 거쳤기 때문에, 원래 소스 코드와 조금이라도 비슷하게 복한다든지, 근종을 만들거나 작동 방식을 이해하기 위해 이용할 수 있 는 통화로 추출하는 것조차 대개 불가능하다. 그래서 대부분의 상용 소프 트의 어는 오르게트 코드 형태로만 배포된다. 소스 코드는 가치가 큰 비밀 정도이므로 비유걱으로 혹은 말 그대로 자물쇠를 채워서 간수된다.
오픈소스는 연구와 개선 활동을 위해 다른 사람들도 소스 코드를 자유롭게 사용할 수 있도록 하는 대안을 일컫는 용어다.
- 1950년대 초에는 애플리케이션과 운영체제 간에 구별이 없었다. 컴퓨터는 한 번에 한 개의 프로그램만 실행할 수 있을 정도로 성능이 제한적이 었고, 그 프로그램이 컴퓨터 전체를 점유했다. 실제로 프로그래머들은 자 신이 짠 프로그램 한 개를 실행하기 위해 시간대별로 컴퓨터 사용 예약을 해야만 했다(일반 학생이라면 한밤중에나 사용할 수 있었다). 컴퓨터가 더 복잡해짐에 따라, 비전문가가 프로그램을 실행하는 일이 너무 비효율 적이라고 느껴져서 전문 운영자에게 맡겨졌고, 운영자는 프로그램을 컴퓨터에 입력하고 결과를 배부했다. 운영체제는 운영자가 이런 작업을 자동 화할 수 있도록 돕는 프로그램에서 시작됐다.
운영체제는 자신이 제어하는 하드웨어가 발전됨에 따라 꾸준히 더 정교해졌다. 하드웨어 성능이 더 좋아지고 복잡해지면서, 운영체제가 하드웨어를 제어하는 데 더 많은 자원을 투입할 수 있게 되었다. 처음으로 널리 사용된 운영체제는 1950년대 후반과 1960년대 초반에 등장했는데, 보통 은 하드웨어를 만드는 회사가 이를 같이 제공했고 어셈블리 언어로 작성 되어 하드웨어와 강하게 결부되었다. 이렇게 하여 IBM과 더불어 DECDigital Equipment Corp, 데이터 제너럴Data General Corp 같은 작은 회사들이 자사 하드 웨어를 위한 자체 운영체제를 제공했다. 앞에서 인용문에 언급한 프레더 릭 브룩스는 1965년부터 1978년까지 IBM의 시스템/360System/360 컴퓨터 시리즈와 당시 IBM의 최상위 운영체제인 OS/360 개발을 관리했다. 브룩 스는 컴퓨터 아키텍처, 운영체제, 소프트웨어 공학 분야에 기여한 공로로 1999년 튜링상을 받았다.
- 운영체제는 컴퓨터의 자원을 제어하고 할당한다. 첫째로, 프로세서를 관리하면서 현재 사용 중인 프로그램을 스케줄링하고 프로그램 간의 관계를 조정한다. 또한 특정 시점에 활발히 연산하는 프로그램 간에 프로세서 의 초점을 전환해 준다. 여기에는 애플리케이션뿐만 아니라 바이러스 검사 프로그램 같은 백그라운드 프로세스도 포함된다. 운영체제는 사용자가 대화 상자에서 확인 버튼을 클릭하는 것 등의 특정 이벤트를 기다리는 프 로그램을 대기 상태로 바꿔 준다. 또한 특정한 프로그램이 자원을 독차지 하는 것을 막아 준다. 만일 어떤 프로그램이 프로세서 시간을 너무 많이 차지하면 운영체제는 다른 작업도 일정한 몫을 나눠 받을 수 있도록 그 프 로그램의 속도를 낮춰 준다.  일반적인 운영체제에서는 프로세스 수백 개가 동시에 실행된다. 일부는 사용자가 실행한 프로그램이지만, 대부분은 일반 사용자에게는 보이지 않 는 시스템 작업이다. 무슨 일이 일어나고 있는지 확인하고 싶다면, 맥OS 에서는 활성 상태 보기 Activity Monitor, 윈도우에서는 작업 관리자Task Manager, 휴대전화에서는 그와 유사한 프로그램을 이용하면 된다. 
- 하드웨어 개발 시 원래 의도했던 것과는 다른 운영체제를 실행하기도 한다. 윈도우를 사용하려고 했던 컴퓨터에서 리눅스를 실행하는 것이 좋 은 예다. 디스크에 몇 개의 운영체제를 저장해 두고 컴퓨터를 켤 때마다. 어느 것을 실행할지 결정할 수 있다. 이 '멀티 부트multiple boot' 기능은 애플 에서도 부트 캠프Boot Camp라는 이름으로 지원하는데, 맥이 맥OS 대신 윈 도우를 실행하면서 시스템을 시작할 수 있도록 한다. 심지어 다른 운영체제의 관리하에 어떤 운영체제를 가상 운영체제virtual operating system로 실행할 수도 있다. VM웨어 VMware, 버추얼박스(virtualBox, 오 픈소스인 젠xen 같은 가상 운영체제 프로그램은 호스트 운영체제(가령 맥OS)에서 어떤 운영체제(윈도우나 리눅스)를 게스트 운영체제로 실행할 수 있게 해준다. 호스트는 게스트가 생성하는 요청 중 파일 시스템 접근이나 네트워크 접근 등 운영체제 권한이 필요한 요청을 가로챈다. 호스트는 작업을 수행한 다음 게스트로 되돌아간다. 호스트와 게스트가 둘 다 같은 하드웨어에 맞게 컴파일되면 게스트 운영체제는 대개 하드웨어가 낼 수 있는 최고 속도로 실행되고, 거의 실제 컴퓨터상에서 직접 실행되듯 반응하는 것처럼 느껴진다.
- 운영체제는 이러한 서비스를 표준화된 방식 또는 합의된 방식으로 이용할 수 있게 하고, 애플리케이션은 운영체제의 특정 부분에 통제권을 넘겨 주는 특별한 명령어를 실행함으로써 서비스를 요청한다. 운영체제는 요청에 포함된 어떤 일이든 처리하고, 통제권과 처리 결과를 애플리케이션에게 돌려준다. 운영체제에 서비스를 요청하는 이 진입점을 시스템 콜system call이라고 하며, 시스템 콜의 세부 명세에서 그 운영체제가 무엇인지를 규정한다. 최신 운영체제에는 보통 수백 개의 시스템 콜이 있다.
- 디바이스 드라이버 
운영체제와 프린터나 마우스 같은 특정 종류의 하드웨어 장치 간에 가교 역할을 하는 코드다. 드라이버 코드는 특정 장치가 어떤 일을 하도록 하는 방법을 자세히 알고 있다. 여기에는 마우스나 트랙패드에서 오는 움직임과 버튼 정보를 이용하는 방법, 드라이브가 집적회로나 회전하는 자성 표면에서 정보를 읽고 쓰게 하는 방법, 프린터가 종이에 인쇄하게 하는 방법, 특정 무선 칩이 전파 신호를 보내고 받게 하는 방법 등이 포함된다. 디바이스 드라이버는 특정 장치의 특이한 속성에서 시스템의 나머지 부 분을 분리한다. 예를 들어, 키보드처럼 종류는 다양하지만 동일한 역할을 하는 장치에는 운영체제가 필요로 하는 기본 속성과 동작이 있는데, 드라이버 인터페이스는 운영체제가 서로 다른 장치에 균일한 방식으로 접근하도록 해서 장치를 전환하기 쉽게 해준다.
- '휴지통 비우기'를 클릭해서 명시적으로 휴지통을 비운다고 가정해 보자. 그렇게 하면 휴지통 폴더 자체에 있는 폴더 엔트리는 삭제되고 해당 블록이 미사용 목록에 들어가지만, 그 내용은 아직 삭제되지 않은 상태다. 원래 파일에 할당된 각 블록의 모든 바이트는 아직 그대로 있다. 그 블록 이 미사용 목록에서 꺼내져서 새로운 파일에 할당되기 전까지는 새로운 내용으로 덮어 쓰이지 않는다.  이렇게 삭제가 바로 일어나지 않는다는 것은 여러분이 제거했다고 생각 한 정보가 아직 존재하고, 누군가 그 정보를 찾을 방법을 안다면 손쉽게 접근할 수 있음을 뜻한다. 물리적 블록 단위로 드라이브를 읽는 프로그램, 즉 파일 시스템 계층 구조를 통하지 않고 디스크를 읽는 프로그램이라면 예전 내용을 확인할 수 있다. 2020년 중반에 마이크로소프트가 발표한 윈도우 파일 복구(Windows File Recovery라는 무료 툴은 정확히 이러한 방식으로 수많은 파일 시스템과 저장 매체에 파일 복구를 수행한다.
여기에는 잠재적인 이점이 있다. 디스크에 뭔가 이상이 생겨 파일 시스템이 엉망이 되었을 때도 아직 정보를 복원할 수 있을지 모른다. 하지만 파일을 제거해도 데이터가 완전히 사라졌다는 보장이 없는 점은 데이터에 사적인 내용이 있거나 여러분이 뭔가 나쁜 일을 꾸미고 있어 진짜로 정보 가 제거되기를 바란다면 좋지 않은 일이다. 솜씨 좋은 적수나 법 집행 기 관은 그런 정보를 복원하는 데 전혀 어려움이 없을 것이다. 만일 범죄 행 위를 계획하고 있거나 그냥 집착이 심한 성격이라면 블록이 미사용 상태가 된 후에도 정보를 지우는 프로그램을 사용해야만 한다.  실제로는 그보다 더 꼼꼼히 처리해야 할 수도 있다. 정말로 끈질긴 적수인 데다 자원도 풍부하다면 기존 정보가 새로운 정보로 덮어 쓰였대도 약간이라도 남아 있는 정보를 추출할지도 모른다. 군 조직에서는 블록을 무작위 패턴으로 된 0과 1 값을 여러 번 덮어 씌움으로써 파일을 제거한다. 더 좋은 방법은 하드 디스크를 강한 자석 근처에 놓아 자성을 없애 버리는 것이다. 최선의 방법은 물리적으로 파괴하는 것이며, 저장한 정보를 확실 히 사라지게 하는 유일한 방법이다. 하지만 이마저 충분하지 않을 수 있다. 만일 데이터가 항상 자동으로 백 업되고 있거나 (직장에서의 컴퓨터가 그렇듯이) 자신의 드라이브 대신 네 트워크 파일 시스템이나 '클라우드' 어디엔가에 파일이 보관되고 있다면 말이다(오래된 컴퓨터나 휴대전화를 팔거나 양도할 때 데이터가 복구될 수 없게끔 확인해야 할 수도 있다).
- 외부에서 보면 브라우저는 웹 서버에 요청을 보내고 화면에 표시할 정 보를 웹 서버에서 받아 온다. 어떤 점이 복잡한 것일까?
우선 브라우저는 비동기적asynchronous 이벤트를 처리해야 한다. 비동기 적 이벤트란 예측할 수 없는 시점에 일정한 순서를 따르지 않고 발생하는 이벤트를 뜻한다. 예를 들어, 사용자가 링크를 클릭하면 브라우저는 페이 지에 대한 요청을 보내는데, 브라우저는 해당 응답을 기다리고 있을 수만 은 없다. 그 사이에 사용자가 현재 페이지를 스크롤하면 즉각 반응해야 하 고, 뒤로 가기 버튼을 누르거나 다른 링크를 클릭하면 요청된 페이지가 오 는 중일지라도 요청을 취소해야 한다. 사용자가 창의 모양을 바꾸면 디스 플레이를 갱신해야 하고, 데이터가 오는 동안에 사용자가 이리저리 모양을 계속 바꾸면 계속해서 갱신해 줘야 한다. 페이지에 소리나 동영상이 포함돼 있다면 브라우저는 그러한 미디어의 재생도 처리해야 한다. 비동기적인 시스템을 프로그래밍하는 것은 항상 어려운데, 브라우저는 많은 비동기성을 다뤄야만 한다. 브라우저는 정적인 텍스트부터 페이지의 내용을 계속해서 바꾸려고 하 는 대화형 프로그램에 이르기까지 많은 종류의 콘텐츠를 지원해야 한다. 이 중 일부는 확장 프로그램에 콘텐츠 처리를 위임할 수 있는데, PDF나 동영상 같은 표준 포맷을 처리하는 데는 이 방식이 일반적이다. 하지만 이 를 위해 브라우저는 해당하는 확장 프로그램을 시작하고, 데이터 자체와 데이터에 대한 요청을 보내고 받고, 처리된 데이터를 디스플레이에 표시 하기 위한 메커니즘을 제공해야 한다.
브라우저는 여러 개의 탭과 여러 개의 창을 관리하는데, 이들 각각은 아 마도 앞서 말한 작업 중 일부를 수행하고 있을 것이다. 브라우저는 수행한 작업의 이력과 함께 북마크, 즐겨찾기 등의 다른 데이터를 유지한다. 업로 드, 다운로드, 이미지 캐싱을 하기 위해 로컬 파일 시스템에 접근하기도한다.
브라우저는 여러 수준에서 기능을 확장하기 위한 플랫폼을 제공한다. 어도비 플래시Adobe Flash 같은 플러그인, 자바스크립트용 가상 머신, 애드 블록 플러스Adblock Plus와 고스터리 Ghostery 같은 애드온 프로그램 등이 확장 기능에 해당한다. 내부적으로 브라우저는 모바일 기기를 포함해서 다수 운영체제의 여러 버전에서 작동해야 한다.
이 모든 기능을 수행하기 위한 복잡한 코드를 포함하고 있기 때문에, 브라우저는 자체 구현 코드나 자신이 활성화하는 프로그램에 있는 버그를 이용한 공격에 취약하다. 사용자의 순진함, 무지함, 무분별한 행동도 브라 우저가 공격을 받는 데 한몫한다. 대부분의 사용자는(이 책의 독자를 제외 하고) 무슨 일이 일어나는지 또는 어떤 위험이 있을지조차 거의 이해하지 못한다. 쉬운 일이 아니다.  앞의 내용을 되짚어 보면 뭔가 떠오르지 않는가? 브라우저는 운영체제 와 비슷하다. 자원을 관리하고, 동시에 일어나는 활동을 제어하고 조정한 다. 또한 다수의 출처에 정보를 저장하고 가져오며, 애플리케이션 프로그램이 실행될 수 있는 플랫폼을 제공한다.
- 한동안 브라우저를 운영체제로 사용하는 것이 가능해 보였고, 그래서 아래에 있는 하드웨어를 제어하는 운영체제와 독립적으로 작용할 수 있을 것처럼 보였다. 그럴듯한 아이디어였지만 10~20년 전까지만 해도 현실적 인 장애물이 너무 많았다. 오늘날 이 아이디어는 실행 가능한 대안이 됐 다. 이미 수많은 서비스가 오로지 브라우저 인터페이스로만 접근할 수 있 고(이메일, 달력, 음악, 비디오, SNS가 명백한 사례다), 이러한 추세는 계 속될 것이다. 구글은 웹 기반 서비스에 주로 의존하는 크롬 OS라는 운영 체제를 제공한다. 크롬북은 크롬 OS를 실행하는 컴퓨터로, 로컬 저장 장 치의 용량은 제한적이며 대부분의 저장 기능은 웹을 사용한다. 또한 구글 문서 Google Docs 같은 브라우저 기반 애플리케이션만 실행한다.
- 이더넷에서 정보는 패킷으로 전송된다. 패킷packet은 정확하게 정의된 형식으로 된 정보를 담고 있는 일련의 비트 또는 바이트다. 발신자가 정보 를 패킷으로 싸서 보내면 수신자가 패킷을 열어서 정보를 확인할 수 있다. 패킷은 발신자 주소, 수신자 주소, 내용, 여러 가지 기타 정보가 표준 형식 으로 구성돼 있는 우편 봉투(또는 아마도 엽서)로 적절히 비유할 수 있는 데, 페덱스FedEx 같은 운송 회사에서 이용하는 표준화된 패키지를 떠올리 는 것도 괜찮다. 패킷 형식과 내용의 세부 사항은 네트워크에 따라 크게 다르다. 이더넷 패킷(그림 III.3)은 6바이트로 된 출발지 주소와 목적지 주소, 몇 가지 기타 정보, 최대 1,500바이트의 데이터로 구성된다.
이더넷은 아주 크게 성공을 거둔 기술이다. 가장 먼저 상용 제품으로 만들 어졌으며(제록스가 아니라 메트칼프가 설립한 회사인 쓰리컴3Com에 의 해), 그간 수십억 대의 이더넷 장치가 많은 공급 업체에서 판매됐다. 최초 의 이더넷은 3Mbps의 속도였지만, 요즘의 이더넷은 100Mbps에서 10Gbps까지 빨라졌다. 모뎀과 마찬가지로 처음 나온 이더넷 장치는 부피가 크고 비쌌지만, 오늘날 이더넷 인터페이스는 저렴한 단일 칩이다.  이더넷은 수백 미터 이내의 한정된 범위에서 작동한다. 원래 사용되던 동축 케이블은 표준 커넥터가 있는 8선 케이블로 대체되었다. 각 장치가 표준 커넥터로 스위치'(또는 '허브)에 연결되면 이더넷 스위치는 들어오 는 데이터를 다른 연결된 장치에 브로드캐스트한다. 데스크톱 컴퓨터에는 보통 이더넷 표준 커넥터를 연결할 수 있는 소켓이 있고, 이더넷의 작동 방식을 모방하는 무선 공유기와 케이블 모뎀 같은 장치에도 이러한 소켓이 있다. 이 소켓은 무선 네트워킹에 의존하는 최신 노트북에서는 거의 찾 아볼 수 없다.
- 각 휴대전화에는 IMELinternational Mobile Equipment Identity, 국제 모바일 기기 식별코드라 는 15자리 고유 식별 번호가 있는데, 이는 이더넷 주소와 비슷하다. 휴대 전화가 켜지면 식별 번호를 브로드캐스트하고, 가장 가까운 기지국이 그 정보를 받아 홈 시스템home system*을 통해 전화 유효성을 검사한다. 휴대전 화 위치가 여기저기 이동하면 기지국이 그 위치를 홈 시스템에 보고함으로써 전화의 위치 정보를 최신 상태로 유지한다. 누군가가 전화를 걸면 홈 시스템은 현재 어느 기지국이 그 전화와 접촉하고 있는지 알 수 있다.
휴대전화는 가장 강한 신호를 내는 기지국과 통신한다. 휴대전화는 기지국에 가까이 있을 때 더 적은 전력을 사용하도록 지속적으로 파워 레벨 을 조정한다. 이렇게 하면 배터리를 더 오래 유지하고 다른 휴대전화에 대 한 간섭을 줄일 수 있다. 기지국과 연결을 유지하기만 할 때는 통화할 때 보다 전력이 훨씬 적게 든다. 그래서 대기 시간은 일 단위로 측정되는 반면 통화 시간은 시간 단위로 측정되는 것이다. 하지만 휴대전화가 신호가 약하거나 존재하지 않는 영역에 있으면 부질없이 기지국을 찾느라 배터리 를 더 빨리 소모할 것이다.
모든 휴대전화는 데이터 압축을 통해 신호를 최대한 적은 수의 비트로 줄인 다음, 오류 수정 정보를 추가한다. 이 정보는 노이즈가 심한 무선 채 널을 통해 간섭을 받으면서 데이터를 보낼 때 불가피하게 발생하는 오류 에 대처하기 위해 필요하다.
- 가용 메모리와 대역폭을 더 효율적으로 활용하는 한 가지 방법은 데이터를 압축하는 것이다. 압축의 기본 아이디어는 군더더기 정보, 즉 연결 부분의 반대쪽에서 데이터를 수신했을 때 재현하거나 유추할 수 있는 정보는 저장하거나 보내지 않는 것이다. 압축의 목표는 같은 정보를 더 적은 비트 로 인코딩하는 것이다. 어떤 비트는 아무 정보도 전달하지 않아서 완전히 제거할 수 있다. 일부 비트는 다른 비트에서 계산될 수 있어 버리기도 한 다. 수신자에게 중요하지 않기 때문에 버려도 무방한 비트도 있다.
영어 텍스트를 고려해 보자. 영어에서도 모든 문자가 같은 빈도로 나타 나지 않는다. e가 가장 흔하며, 그다음에 대략 t, a, 0, i, n 순서로 자주 나 온다. Z, x, q는 훨씬 적게 사용된다. 텍스트를 아스키코드로 표현할 때 문 자 하나는 1바이트, 즉 8비트를 차지한다. 비트를 아끼는 한 가지 방법은 7비트만 사용하는 것이다. 미국 아스키코드에서 8번째 비트(즉, 가장 왼 쪽 비트)는 항상 0이므로 아무 정보도 전달하지 않는다.  한 단계 나아가서, 가장 흔히 나타나는 문자에는 더 적은 비트를 사용하 고, 자주 사용되지 않는 문자에는 더 많은 비트를 사용하면 총 비트 수를 대폭 줄일 수 있다. 모스 부호morse code가 취하는 방식과 비슷하다. 모스 부 호에서는 자주 쓰이는 문자 e를 하나의 점으로, 를 하나의 대시로 인코딩 하지만 드물게 쓰이는 q는 대시 대시 점-대시로 인코딩한다.
- 좀 더 구체적인 예를 보자. 《오만과 편견》 원문에 포함된 텍스트는 121, 000단어 또는 680,000바이트를 약간 웃돈다. 가장 흔한 문자는 단어 사이의 공백으로, 거의 110,000개가 있다. 다음으로 흔한 문자는 e(68,600번), t(45,900번), a(31,200번)이다. 가장 드물게 사용되는 문자를 보면 대문자 Z는 세 번 나오고 X는 한 번도 나오지 않는다. 소문자 중에서는 j(551번), q(627번), x(839번) 순서로 드물게 등장한다. 만약 공백 문자와 e, t, a 각 각에 2비트를 사용했다면 분명히 많은 비트를 절약할 수 있고, X, Z와 나 머지 드물게 나타나는 문자에 8비트 이상을 사용한다 해도 문제되지 않는 다. 허프만 코딩huffman coding이라는 알고리즘은 이러한 처리를 체계적으로 수행하여 개별 문자를 인코딩하는 가장 효율적인 압축 방법을 찾는다. 허 프만 코딩을 사용해서 《오만과 편견》을 압축하면 원래보다 44% 줄어든 390,000바이트가 되는데, 평균적으로 한 문자에 약 4.5 비트가 할당된 셈 이다.
단일 문자보다 큰 덩어리, 예를 들어 단어나 구 단위로 압축하고 원래 문 서의 특성에 따라 조정하면 더 나은 결과를 얻는다. 이를 잘 수행하는 여러 알고리즘이 있다. 널리 사용되는 ZIP 압축 알고리즘은 《오만과 편견》을 64% 줄여서 249,000바이트로 압축한다. 유닉스 프로그램인 bzip2는 175,000바이트까지 줄이는데, 원래 크기의 겨우 4분의 1 정도다.
- TCP는 두 컴퓨터 간에 데이터를 주고받는 신뢰성 있는 양방향 스트림을 제공한다. 인터넷 서비스와 애플리케이션은 TCP를 전송 메커니즘으로 사 용하지만, 기능별로 특정한 자신만의 프로토콜을 갖는다. 예를 들어, HTTPHypertext Transfer Protocol, 하이퍼텍스트 전송 프로토콜는 웹 브라우저와 서버에 사 용되는 특히 간단한 프로토콜이다(329쪽 참고), 사용자가 링크를 클릭하 면 브라우저는 서버(가령 amazon.com)의 80번 포트에 대해 TCP/IP 연결 을 열고 특정 페이지를 요청하는 짧은 메시지를 보낸다. 그림 III.15에서 브라우저는 왼쪽 상단의 클라이언트 애플리케이션이다. 메시지는 프로토콜 체인을 따라 내려가서 인터넷을 가로질러(보통 훨씬 더 많은 단계를 거친다), 반대쪽 끝에서 상응하는 서버 애플리케이션까지 올라간다.
아마존의 서버는 페이지를 준비한 다음, 페이지 인코딩 방식에 대한 정 보 같은 약간의 추가 데이터와 함께 사용자에게 보낸다. 돌아오는 경로는 원래 경로와 같을 필요는 없다. 브라우저는 이 응답을 읽고 그 정보를 이용하여 페이지 내용을 표시한다.
- 냅스터 프로토콜은 TCP/IP를 사용했으므로 사실상 HTTP나 SMTP와 동 일한 수준의 프로토콜이었다. 패닝의 작업 결과물을 중립적으로 평가하자 면(정말 깔끔하게 만들어졌다), 냅스터는 인터넷, TCP/IP, MP3를 포함한 인프라와 그래픽 사용자 인터페이스 구축 도구가 이미 마련된 상태라면 간단하게 만들 수 있는 시스템이다.
합법적이든 아니든 대부분의 최신 파일 공유 서비스는 2001년에 브램 코 언Bram Cohen이 개발한 비트토렌트BitTorrent라는 P2P 프로토콜을 사용한다. 비트토렌트는 영화와 TV 프로그램처럼 용량이 크고 인기 있는 파일을 공유할 때 특히 유용하다. 왜냐하면 비트토렌트로 파일을 다운로드하는 각각의 사용자는 같은 파일을 다운로드하려는 다른 사람에게도 본인이 가진 파 일 조각을 업로드해야 하기 때문이다. 비트토렌트에서는 분산된 디렉터리 를 검색하여 파일을 찾고, 용량이 작은 토렌트torrent 파일을 사용해서 누가 어떤 블록을 보내고 받았는지 기록을 유지하는 트래커를 식별한다. 비트 토렌트 사용자는 저작권 침해 탐지에 걸리기 쉽다. 다운로드만 하려는 사 람도 프로토콜 요구사항에 따라 파일 조각을 업로드해야 하므로 저작권이 적용되는 자료를 유포하는 과정에서 쉽게 식별되기 때문이다. P2P 네트워크는 합법성이 의심스러운 파일 공유 이외의 용도로도 쓰인다. 4부에서 이야기할 디지털 통화 및 결제 시스템인 비트코인 Bitcoins도 P2P 프로토콜을 사용한다.
- 스마트폰은 표준 전화 시스템을 사용할 수 있는 컴퓨터라고 볼 수 있다. 모든 최신 휴대전화는 이동통신사의 통신망이나 와이파이로 인터넷에 접근한다. 이렇게 휴대전화에서 인터넷에 접근하기 쉬워지면서 전화망과 인터넷의 구분이 모호해지고 있으며 이러한 구분은 결국 사라질 것이다.
오늘날 휴대전화를 세상 곳곳에 퍼지게 했던 것과 동일한 힘이 다른 디 지털 장치에도 작용하고 있다. 앞서 말했듯이 많은 기기와 장비에는 강력한 프로세서와 메모리가 있고, 흔히 무선 네트워크 연결도 지원된다. 자연 스럽게 이러한 장치들을 인터넷에 연결하려고 할 텐데, 필요한 모든 메커 니즘이 이미 마련되어 있고 한계 비용이 0에 가까우므로 이는 매우 간단 하다. 따라서 와이파이나 블루투스로 사진을 업로드하는 카메라, 위치 정보나 엔진의 원격 측정값을 업로드하는 동안 오락거리를 다운로드하는 자 동차, 주변 환경 정보를 측정하고 제어하여 외출 중인 집주인에게 알려주 는 온도 조절 장치, 아이와 보모, 방문객을 계속 관찰하는 비디오 모니터, 알렉사 같은 음성 응답 시스템, 그리고 앞에서 언급한 네트워크로 연결된 전구 같은 제품은 모두 인터넷 연결을 기반으로 한다. 이 모두를 일컫는 유행어가 사물인터넷, 즉 IoT이다. 여러모로 IoT는 훌륭한 아이디어이며 앞으로 점점 더 많은 종류의 IoT 기기가 생겨날 것임은 확실하다. 그러나 IoT에도 큰 단점이 있다. 이렇게 특정 용도를 가진 장치는 같은 종류의 범용 장치보다 보안 문제에 더 취약 하다. 즉 해킹이나 불법 침해를 당해서 손상을 입을 가능성이 더 높다. 사 실 IoT 관련 보안과 프라이버시에 대한 관심도 개인용 컴퓨터와 휴대전화 와 비교해 매우 낮은 수준이어서 더 위험하다. 일례로, 상당히 많은 장치 가 제조 국가에 있는 서버로 정보를 전송하는 방식으로 집으로 연락’ 한다.
다양한 IoT 보안 사고 사례 중 하나를 이야기하자면, 2016년 1월에 한 웹사이트에서 사용자가 웹캠을 검색하여 볼 수 있게 허용했는데, 촬영 영 상을 전혀 보호 처리하지 않고 송출했다. 이 사이트는 '마리화나 농장, 은행의 밀실, 아이방, 부엌, 거실, 차고, 앞마당, 뒷마당, 스키장, 수영장, 대학과 학교, 실험실, 소매점의 금전등록기' 등에 설치된 카메라 영상을 그대로 노출했다. 이런 보안 허점이 단순 관음 목적부터 훨씬 나쁜 의도로 사용되는 상황을 고려해 볼 수 있을 것이다.
일부 어린이 장난감은 인터넷 연결을 지원하는데, 이는 또 다른 잠재적 위험을 불러일으킨다. 한 연구에서는 몇몇 장난감에 아이들을 추적하는 데 사용할 수 있는 데이터 분석 코드와, 장난감을 다른 공격의 매개체로 쓸 수 있도록 허용하는 불안정한 메커니즘이 포함되어 있음을 밝혀냈다. (이런 장난감 중 하나는 인터넷에 연결되는 물병이었는데, 원래는 수분 공 급 상태를 모니터링할 용도였던 것으로 보인다). 이런 식의 아동 추적은 COPPAChildren's Online Privacy Protection Act, 어린이 온라인 사생활 보호법와 장난감에 명시된 개인정보 보호 정책을 위반하는 것이다.
- 웹캠 같은 제품은 제조사가 충분한 보안을 제공하지 않아 취약한 경우가 많다. 보안 기능을 추가하면 비용이 너무 많이 들어서, 또는 사용하기가 너무 복잡해진다고 판단해서 넣지 않았거나, 그냥 잘못 구현했을 수도 있다. 예를 들어, 2019년 말에 한 해커가 IoT 기기 50만 개의 IP 주소와 텔 넷 비밀번호를 게시한 사건이 있었다. 해커는 22번 포트로 응답하는 장치 를 훑어서 조사하고 admin'이나 'guest 같은 기본 계정과 비밀번호로 로 그인을 시도하여 이 정보를 찾아냈다고 한다.
전력, 통신, 운송을 포함한 다양한 인프라 시스템이 보안 면에서 충분히 주의를 기울이지 않은 채로 인터넷에 연결되기도 했다. 일례로 2015년 12 월에 보도된 바로는 특정 제조사의 풍력 터빈에 웹 기반 관리 인터페이스가 있는데, 매우 간단한 방식으로(단지 URL을 편집함으로써) 공격해서 터빈이 생성하는 전력을 차단할 수 있었다고 한다.
- 인터넷에서 가장 눈에 띄는 부분은 월드 와이드 웹World Wide Web 으로, 지금 은 그냥 '웹'이라고 한다. 인터넷과 웹을 하나로 보는 경향도 있지만, 둘은 서로 다르다. 인터넷은 전 세계의 수많은 컴퓨터가 서로 쉽게 정보를 교환할 수 있도록 하는 통신 인프라 또는 하위 계층이다. 웹은 정보를 제공하 는 컴퓨터(서버)와 정보를 요청하는 컴퓨터(여러분과 나 같은 클라이언 트)를 연결한다. 웹은 인터넷을 사용하여 연결을 맺고 정보를 전달하며 다른 인터넷 기반 서비스에 접근하기 위한 인터페이스를 제공한다.
많은 훌륭한 아이디어가 그렇듯, 웹도 본질적으로 간단하다. 어디에나 있고 효율적이며 개방적이고 기본적으로 무료인 하부 네트워크가 존재한다는 전제하에(매우 중요한 조건이다) 중요한 것은 다음 네 가지뿐이다.
첫 번째는 URLUniform Resource Locator, 균일 자원 지시자이다. URL은 http://WWW.amazon.com처럼 정보의 출처에 대한 이름을 지정한다.
두 번째는 HTTP Hypertext Transfer Protocol, 하이퍼텍스트 전송 프로토콜이다. HTTP는 상위 레벨 프로토콜의 예로 간략하게 언급한 바 있다. HTTP 클라이언트가 특정 URL에 대한 요청을 보내면 서버는 요청된 정보를 반환한다.
세 번째는 HTMLHypertext Markup Language, 하이퍼텍스트 마크업 언어이다. HTML은 서버가 반환하는 정보 서식이나 표시 방식을 설명하기 위한 언어다. HTML도 간단하며 조금만 알아도 기본적인 사용법을 익힐 수 있다.
마지막으로 브라우저browser가 있다. 브라우저는 컴퓨터에서 실행되는 크 롬, 파이어폭스, 사파리, 엣지 같은 프로그램으로, URL과 HTTP를 사용하 여 서버에 요청을 보내고 서버에서 보낸 HTML을 가져와서 표시한다.
- VPNVirtual Private Network, 가상 사설망은 두 컴퓨터 간에 암호화된 통신 경로를 설정하여 일반적으로는 정보 흐름을 양방향으로 안전하게 보호한다. 기업에서는 직원들이 집에서 일하거나 통신 네트워크 보안을 신뢰할 수 없는 국가에서 일할 수 있게 하고자 VPN을 자주 이용한다. 개인 사용자는 VPN을 사용하여 개방형 와이파이를 제공하는 카페나 다른 장소에서 더 안전하게 작업할 수 있다. 하지만 사용 중인 VPN을 어느 업체가 운영하는지 확인하고, 사용자 정보를 공개하라는 정부 압력에 그 업체가 얼마나 맞설 수 있을지 생각해 보기 바란다.
- 공개 키 암호 기법에는 다른 유용한 속성이 있다. 예를 들면, 공개 키 암호 기법은 디지털 서명 digital signature 방식을 구현하는 데 사용된다. 사기꾼이 아니라 앨리스가 메시지를 보냈음을 수신자가 확신할 수 있도록 앨리스가 메시지에 서명하고 싶다고 하자. 그녀가 자신의 개인 키로 메시지를 암호화하고 그 결과를 보내면 누구나 그녀의 공개 키로 메시지를 해독한 다. 앨리스가 자신의 개인 키를 아는 유일한 사람이라면 메시지는 분명히 앨리스에 의해 암호화되었을 것이다. 이 방식은 앨리스의 개인 키가 해킹 되지 않았을 때만 작동한다.
앨리스가 밥에게 보내는 비공개 메시지에 어떻게 서명할 수 있을까? 이 는 메시지가 앨리스가 보낸 것임을 분명히 하는 동시에, 밥 이외의 다른 사람이 메시지를 읽을 수 없게 하려면 꼭 필요한 절차다. 앨리스는 먼저 밥에게 보낼 메시지에 자신의 개인 키로 서명한 다음에 그 결과를 밥의 공 개 키로 암호화한다. 이브는 앨리스가 밥에게 무언가 보냈음을 알 수 있지 만, 밥만 그 메시지를 해독할 수 있다. 밥은 바깥쪽 메시지를 자신의 개인 키로 해독한 다음에 안쪽 메시지를 앨리스의 공개 키로 해독하여 메시지가 앨리스에게서 왔음을 확인한다.








'IT' 카테고리의 다른 글

처음 읽는 양자컴퓨터 이야기  (0) 2022.07.07
웹 3.0 레볼루션  (0) 2022.07.03
블록체인 경제  (0) 2022.05.11
포스트 메타버스  (0) 2022.05.11
빅데이터 사용 설명서  (0) 2022.05.07
Posted by dalai
,