반응형

 

몽고DB에서 데이터 삽입하는 방법에 대해 알아보도록 할 것이다.

데이터를 삽입하는 방식에는 크게 세가지가 있다.

insert 명령, insertOne명령, insertMany명령인데, insert의 경우 단일 도큐먼트 혹은 다수 도큐먼트 모두 삽입이

가능하며, insertOne의 경우 단일 도큐먼트만, insertMany는 다수 도큐먼트만 삽입할 수 있다.

 

1. 삽입(insert)

DB에 데이터를 삽입할 때 사용하는 명령어이다. MySQL의 insert와 매칭되는 명령인데,

MySQL의 경우 각 필드에 데이터를 입력시켜주는 반면 몽고DB에서는 데이터를 도큐먼트 단위로 입력시켜주게 되며,

도큐먼트는 JSON 형태의 데이터로 구성된다.

 

users 컬렉션에 아래와 같이 데이터를 입력시켜볼 수 있다.

db.users.insert({

    name: '홍길동',

    age: 20,

});

위와 같이 입력이 완료되었고, find() 명령을 통해 입력된 데이타를 확인할 수 있다.

db.users.find();

위는 users 컬렉션에 있는 모든 도큐먼트를 조회한 결과이다.

insert() 명령으로 넣은 JSON 데이타가 그대로 들어가있다.

그런데 _id라는 필드는 입력하지 않았는데 자동으로 생겨버렸다.

이 필드는 MySQL에서 Primary key와 같은 역할을 하는 필드라고 보면 된다.

중복을 허용하지 않는 고유의 값이며, 기본적으로 인덱스가 걸려있기 때문에 해당 필드로 조회시 검색 성능은 보장된다. 

 

insert를 이용하여 다수의 데이타를 한번 삽입해보도록 하겠다.

다수의 데이타 삽입시에는 배열을 사용한다.

db.users.insert([
{
    name: '최길동',
    age: 21,
},
{
    name: '박길동',
    age: 22,
},
]);

위와 같이 대괄호 []를 통해 다수의 데이터를 삽입할 수 있다.

정상적으로 다수의 데이타가 입력된 것을 확인할 수 있다.

 

2. 단일 데이터 삽입(insertOne)

insertOne은 단일 도큐먼트를 삽입하는 명령이다.

몽고 3.2버전 이후에 추가된 명령이며, insert를 대체하기 위해 만들어졌다고 한다.

insert()명령과 사용법은 동일하며, 배열 형태로 다수의 데이터를 삽입하는 것은 insertMany명령을 이용해야 한다.

db.users.insertOne({
    name: '홍길동',
    age: 20,
});

아래와 같이 조회하면 정상적으로 데이타가 삽입된 것을 확인할 수 있다.

 

3. 다수 데이터 삽입(insertMany)

insertMany은 다수의 도큐먼트를 한번에 삽입하는 명령이다.

insertOne과 같이 몽고 3.2버전 이후에 추가된 명령이다.

다수 데이터 삽입이므로 배열 형태로 삽입하며 아래와 같이 명령을 사용할 수 있다.

db.users.insertMany([
{
    name: '최길동',
    age: 21,
},
{
    name: '박길동',
    age: 22,
}

]);

정상적으로 삽입이 완료되었다.

 

몽고3.2버전 이후에는 insertOne(), insertMany() 명령을 사용을 권장하므로, insert() 명령 사용은 자제하는 것이 좋을 것으로 보인다.

반응형
반응형

얼마 전 황당한 일을 겪었다.

로컬 PC에 몽고 데몬을 올려놓고 해당 DB를 연동하여 테스트 서버로 쓰고 있었는데,

갑자기 잘 되던 테스트 페이지에 로그인이 안되며 계정이 없다는 오류를 띄우는 것이었다.

바로 로컬 몽고DB에 접속하여 DB를 확인해보았다.

 

데이타베이스 목록을 확인해보니, 내가 만들어놓은 데이타베이스는 없어지고 웬 이상한 DB가 들어있었다.

느낌이 불길했다.

 

해당 DB를 들어가서 컬렉션 목록을 확인했다.

읽어보라고 떡하니 'README'라는 컬렉션이 만들어져 있었고 바로 내용을 확인해보았다.

 

"All your data is a backed up. You must pay 0.04 BTC to 1FYqD4YtPpcnHyyMiFFigG53s51dcb6xx1 48 hours for recover it. After 48 hours expiration we will leaked and exposed all your data. In case of refusal to pay. we will contact the General Data Protection Regulation, GDPR and notify them that you store user data in an open form and is not safe. Under the rules of the law, you face a heavy fine or arrest and your base dump will be dropped from our server! You can bitcoin here, does not take much time to buy https://localbitcoins.comwith this guide https://localbitcoins.com/guides/how-to-buy-bitcoins After paying write to me in the mail with your DB IP: recoverbase@cock.li and you will receive a link to download your database dump."

아뿔싸... 내가 그 말로만 듣던 랜섬웨어를 당했다니... 분하기도 하고 치욕스럽기까지 했다.

내용은 대충 이렇다. 0.04 비트코인을 지불하면 잃어버린 데이타를 복구해주겠다는 것이고, 

이것을 무시하면 GDPR에 신고하여 법적인 책임을 물게 하겠다는 것이다.

 

개인정보보호정책에 의해 개인의 정보는 안전하게 관리되어야 하므로 이를 허술하게 관리한 대가로 책임을 묻게 될 수 있는 것이다.

 

일단 날아간 데이타는 없으면 귀찮아지기는 하겠지만, 크리티컬한 수준은 아니었으므로 버리기로 결심했다.

저런 놈들에게 10원이라도 내어주는건 용납할 수도 없기 때문이다.

(참고로 중요한 데이타라고 하더라도 비용 지불한 후에 돌려받는다는 보장은 없다.)

 

원인은 매우 간단하다. (그렇기에 더 어이가 없었던 것)

계정 인증이 되어있지 않았기 때문인데 mysql 이나 다른 DB는 설치시 기본적으로 계정 설정에 대한 정보를 물었던 것으로 기억한다.

 

몽고DB의 경우 설치시 디폴트로 계정 설정이 되지 않고 계정 없이 몽고DB에 어드민 권한으로 접근할 수 있게 된다.

여기에 네트웍 망이 public이라면 '내 데이타를 가져가주세요' 광고하는 꼴이다.

 

사실 그동안은 네트워크가 내부망으로 구성이 되어있기 때문에 외부에서 DB를 접속할 수 없었고,

계정 설정이 안되어 있어도 크게 문제는 없었을 것이다.

 

나는 외부 미팅으로 로컬 DB를 잠깐 접근할 필요가 있어서 공유기 포트포워딩 세팅으로 외부망 접근을 열어놓았다.

이 때 몽고DB 내부 접근 계정이라도 만들어 놓았어야 했는데 그걸 하지 않았기에 이 사단이 난 듯 하다.

 

보안은 아무리 로컬에 구성한다해도 이처럼 어떤 경우가 발생할지 모르므로 계정 인증 설정은 항시 해놓는 것이 문제를 일으키지 않을 것 같다. 설정할 때 비밀번호를 허술하게 해놓는다면 설정하지 않는 것과 비슷할 수 있다.

 

브루트 포스 공격(Brute force attack)이라는 흔한 암호 해독 공격 방식이 있는데 이는 문자열의 경우의 수를 다 대입하여 적용해보는 것이다. 그러니 비밀번호가 너무 단순하다면 인증 설정이 되어있어도 해킹에 노출될 수 있다. 꼭 복잡한 암호를 설정하길 바란다.

 

아마 해커들은 현재도 전세계 피씨를 가리지 않고 아이피를 스캔하여 계정 인증 없이 노출된 서버들을 찾아다니고 있을 것이다. 궁금하다면 몽고DB에 그럴싸한 데이타를 올려놓고 계정 인증 없이 외부망으로 노출시키면 3일 이내에 나와 같은 현상을 발견할 수 있을 것 같다.

 

여러분도 항상 보안에 신경써서 이런 자질구레한 일들이 벌어지지 않길 바란다.

 

반응형

+ Recent posts