메일 피싱의 심각성..

이틀전 저녁 친한 교수님으로부터 전화가 왔다.
하도 답답하셨는지 하소연하듯이 말씀하시는데..
뭔소린지 하나도 못 알아듣다가.. 겨우겨우 앞뒤 정황을 정리해보면 이렇다.
참고로 우리 교수님은 무역업을 하신다. 애초에 이런 비즈니스와는 전혀 무관한 분이셨다.

여튼 외국 바이어와 메일로 커뮤니케이션하다가.. 돈을 주고 받는 상황이 되어서..
돈을 보내달라고 계좌를 메일로 보냈는데.. 이것을 누군가 중간에서 보고 있다가..
“아니아니.. 거기 말고 이곳으로 보내시오!!!”.. 했다는 것이다.

즉, 누군가가 메일을 해킹해서 훤히 꾀뚫어 보고 있다는 것이다.
이일때문에 패스워드도 1주일에 한번씩 계속 바꾸는데요.. 계속 된다는 것이다.
엇? 메일 해킹?.. 쉽지는 않을텐데요..
해킹하려면 해킹툴이 미리 설치되어 있어야하는데…
일단 제가 가서 볼께요..

그래서 오늘 찾아갔다. 요 며칠 사이에 메일을 중간에 가로챈 경우가 많았다는 것이다.
바꿔친 송금계좌를 보니 영국도 있고, 중국도 있고,..

음.. 일단 메일이 중간에 다른 곳으로 자동 포워딩되는 설정이 있는지 확인해봤다.
있긴하지만 이건 확인된 내용이고, 다음으로 누군가 메일을 로그인한 흔적이 있는지 확인해봤다.
하지만 메일서비스를 네이버나 다음이 아닌 이미 망한 기업의 메일을 쓰고 있었다. ㅇㅎㅎ
당연히 로그인 기록같은건 확인해볼수도 없고,.. 아무리 고객 문의를해도 사이버 수사대에 의뢰하고
요청이 오면 해주겠단다..-__-.. 머 이런 쓰나미 써비스가 있나.. 이러니 망하지..

여튼 차차 네이버나 다음으로 옮기라고 했다.
지메일을 추천할까 했는데,.. 지메일도 해킹당하면  대응이 엄청 늦다라는 검색이 쏟아져 나와서 대응이 빠른 국내메일 서비스를 이용하라 했다.

그럼,.. 이제 슬슬 답이 나온다. 해킹툴이 깔려있는지 확인만 하면 된다.
그래서 사무실에 있는 컴퓨터 전체를 알약으로 검사를 했다.
헉!! 그랬더니.. 자주 쓰는 컴터에서 해킹툴과 트로이젠이 쏟아져나온다.
헐~~~ 해킹에 의한 정보 노출이 확실해 보였다.

정밀 검사하는데.. 컴퓨터 한대당 평균 1시간 반이상이 걸렸다.
한번도 정밀 검사를 안한듯 싶다. ㅇㅎㅎ
검색되어 나온 해킹툴과 트로이젠 이름을 검색해보니,..
사용자가 입력한 정보를 저장하고 있다가 공격자에게 보내는 바이러스란다.. ㅇㅎㅎ

얼마전 팀발표때 정훈대리가 해킹툴 설치해서 패스워스 피싱하는거 직접 시연해보여줬는데..
딱 그꼴이이다. 소름돋는다.
특히 무역업하는 경우 알고있는 메일주소로 오는 경우 메일을 안 읽어 볼수도 없고,..
메일을 읽어보는 순간 악성코드에 감연된다고 생각해보면..
이건 어쩔수없다.. 답이 없는거다. 후덜덜… 네트웍보안팀이 있는 대기업이 아닌이상..
중소기업들은 보안에 더 신경써야지 싶다.

어눌한 한국어로 보이스피싱오는거랑 어눌한 영어로 메일피싱하는거랑은 차원이 다른 얘기다.
그리고 메일주소도 알고있는 메일주소로 오는거보니 단순한 해커가 아니다.
메일헤더 정도는 맘대로 조작할수있는 녀석이다.
이젠 알고있는 메일주소와 더불어 IP까지 확인해야하는 상황인건가? ㅇㅎㅎ
조심해야겠다.

여튼 나도 몇달전에 SSH 무차별 로그인 공격을 당해서 서버를 털린적이 있는데..
설마~~ 라는 안일한 생각은 바로 털린다는 진리를 오늘 또 배운다.
앞으로 보안에 특히 신경 더 써야겠다. 

아파치 서버 설정 변경

자꾸자꾸 느려지길래 아파치 설정을 다시 바꿨다.
이번에 좀 꼼꼼히 신경썼다.
어짜피 내 홈페이지 접속하는 사람도 별루 없고 하니..

접속자수를 고려해서.. ㅋㅋㅋ
최대의 성능(?)을 낼수있도록 노력했으나..
또 느려지면 어쩔수없고.. ㅇㅎㅎ

일단 지금까지는 만족…
좀더 지켜봐야지..

오늘 top 라는 리눅스 명령어를 처음 알았다.
이거 좋네~ +++
top 명령어는 현재 실행중인 프로세스 목록과 메모리, CPU 사용량 등을 보여준다. 

내가 몰랐던 재밌는 자바스크립트 이야기

몇달전 자바스크립트 가든이라는 문서의 한글 번역본을 읽다가 포기하고 다시 원문을 보면서 재번역을 했다. 처음엔 그냥 오역이 몇가지 보여서 오역만 바로 잡아볼까하고 원번역자에게 메일을 보냈는데.. 결국엔 전체를 모두 다시 번역했다. 현재는 원저자에게 Pull Request를 보낸상태고 머지는 언제 될찌 모르겠다. 현재 상황에서 기억 남는 몇가지를 남겨보면,

1. 호이스팅(Hoisting)

이게 말이지 참 재밌다.  JSLint에서 이렇게 해라~ 라고 추천했던 가이드들이 몇가지 있었는데.. 예를 들면,

“var문은 맨위로 올려라” 하는 가이드가 있다. 왜 위로 올리라는 거지? 성능 문젠가? 스코핑 때문에 그런가? 그래.. 올리라면 올리지모.. 라고 하면서 var로 선언한 코드를 전부 위로 올렸던 기억이 있는데.. 여기엔 이유가 있었다. 바로 호이스팅!!! 호이스팅은 자바스크립트가 실행되기 전에 선언문을 스코프 위로 올리는 걸 얘기한다. 따라서 다음과 같이 for 문안에 선언한 i 변수는

for(var i=0; i<1000; ++i){
    // 어쩌구 저쩌구
}

  다음과 같은 스코프 상단으로 옮겨진다는 사실!!

var i=0;
for(i=0; i<1000; ++i){
    // 어쩌구 저쩌구
}

이렇게 자동으로 옮겨지는 것을 호이스팅이라고 한다. 이런 특징을 모르면 전역변수를 의도하고 쓰더라도 실제 지역변수에 있는 값을  쓰게 될지도 모른다!! 자세한 내용은 자바스크립트 가든의

함수 스코프를 참고하자!

2. 왜 new Array()는 안되는가?

이것도 역시 JSLint에서 가이드하는 내용중에 하나다. new Array()로 쓰지말고 [] 각괄호를 이용해 배열을 선언하라고 하는데, 이유는 new Array(3) 으로 넣을때 우리가 생각했던대로 동작하지 않기 때문이다. 보통은 배열에 3이라는 값을 하나 추가한 결과를 반환해줄꺼라 기대하지만, 요건 배열의 크기가 3인 빈배열을 반환한다. 심지어 인덱스는 초기화도 안한다는 사실!! 역시 자세한 내용은 자바스크립트 가든의

배열 생성자를 참고하자.

3. 계륵 같은 new 키워드의 비밀

함수를 만들때 new 키워드를 붙여서 생성하지만, new 키워드가 없어도 생성할수있다.

function Foo(){
    this.value = 1;
}
new Foo();
Foo();

위와 같이 호출하면 new 키워드의 유무에 따라 반환 값이 달라진다. new 키워드를 붙이면 Foo 함수가 생성자로써 동작하게 되면서 특별한 반환값이 없으면 this가 가리키는 값을 반환해준다. 즉, Foo 객체의 인스턴스를 반환해주는데,. Foo()는 그냥 함수를 실행한다. 그래서 this 객체는 Foo를 가리키는게 아니라 전역을 가리키게 되고, 반환하는 값이 없으므로 결과값은

undefined 가 된다. 뭐 여기까지는 누구나 아는 사실인데.. Foo 객체가 생성자로 동작할때 즉, new 키워드가 붙을때 , 이 생성자에 명시적인 return 값이 있다면 또 얘기가 달라진다. 명시적인 객체를 리턴하면 그값이 결과값으로 반환되지만, return 값이 없거나 참조타입이 아닌 프리미티브 타입을 반환하면 this가 가리키는 값을 반환한다. 반면에 new 키워드가 없는 경우, Foo 객체는 생성자가 아닌 일반 함수로 동작하면서 return 문의 값을 반환한다. 그래서 결론은 명시적인 반환값을 객체로 주면, new 키워드가 있든 말든 동일하게 동작한다는 사실!! 그래서 팩토리 패턴으로 만들 경우 자연히 new 키워드가 필요없게 된다! 자세한 내용은 역시 자바스크립트 가든의 함수 생성자를 참고하자!

4. 타이머는 스택킹 된다!

자바스크립트에서 타이머는 setTimeout과 setInterval 두가지가 있다. 어찌 생각해보면 setIntveral을 한번만 실행하고 없애면 setTimeout 은 필요없는거 아닌가? 하는 생각을 종종했는데.. 역시나 setTimeout은 ECMA 표준 스펙이 아니었다! 헉! 그랬꾸나.. 그래서 setTimeout의 첫번째 인자에 대한 해석도 엔진마다 다르다는 사실!… 여튼 이건 뭐 그렇게 중요한 얘기는 아니고.. 진짜 재밌는 얘기는 바로 setInterval 함수가 스택킹된다는 사실이다! setInterval 함수는 일정 주기마다 함수가 호출되는데.. 엄밀히 말하면 일정주기마다 함수를 실행하는 것은 아니고 일정 주기마다 실행할 함수를 쌓는다. 그래서 자바스크립트 쓰레드가 그 함수를 실행할때가 되면 실행하게 될테고, 뒤이어 실행되어질 함수는 앞에 함수가 다 끝날때까지 기다리게 된다. 이거다 싱글 쓰레드라서 발생하는 문젠데.. 그럼 한번 생각해보자!. 주기가 엄청 짧은데.. 실행되는 함수는 그 주기보다 길경우 어떻게 될까? 그렇다! 무조건 쌓이게 된다!! 이렇게 쌓인 함수는 시간이란 변수가 더이상 필요없게 된다.  즉, 내가 원하는 주기가 깨질수도 있다는 사실!! 자세한 내용은

타이머를 참고하자!

 5. 삼중 등호의 비밀

이중 등호(==)와 삼중 등호(===) 지금까지는 삼중 등호는 인스턴스를 비교해서 보다 정확하고, 이중 등호는 대충 (?) 비교해서 부정확하다라고 생각하고 있었다.. 하지만 이 둘의 차이는 그런게 아니었다.!!  바로 자동 타입 변환을 하느냐 마느냐의 차이!! 이중 등호는 자동 타입 변환을 해서 끝까지 비교하지만, 삼중 등호는 타입 변환 없이 바로 비교한다. 그래서 훨씬더 빠르다! 자세한 내용은

타입 비교를 봐라! 이 외에도 재밌는 내용이 참 많은데.. 여튼 난 위 5가지가 가장 새로웠다!