Background : Non-Relational DBMS
관계형 데이터베이스는 복잡하고 저장해야하는 데이터가 많아진다면 용량의 한계가 생길 수 있다.
이를 해결하기 위한 것이 비관계형 데이터 베이스, Non-Relational DBMS (NRDBMS, NoSQL) 이다.
그러나 NoSQL 도 마찬가지로 이용자 입력값을 통해서 동적으로 쿼리를 생성하여 데이터를 저장하므로 문제점이 발생할 수 있다.
NoSQL의 개념과 문법
NoSQL의 개념 :
SQL 을 사용하지 않고 복잡하지 않은 데이터를 저장하여 단순 검색 및 추가 검색 작업을 위해서 매우 최적화된 저장 공간이다.
그러나 Redis, Dynamo, CouchDB, MongoDB 등 다양한 DBMS 가 존재하므로 각각의 구조와 사용 문법을 익혀야한다.
따라서, Redis, CouchDB, MongoDB 총 3개의 DBMS 에 대해 정리할 것이다.
1. MongoDB
JSON 형태인 도큐먼트(Document) 를 저장하고, 아래와 같은 특징을 갖는다.
- 스키마를 따로 정의하지 않아 각 콜렉션(Collection)에 대한 정의가 필요하지 않다.
- JSON 형식으로 쿼리를 작성한다.
- _id 필드가 Primary Key 역할을 한다.
(MongoDB 에서 status 의 값이 "A" 이고 qty 의 값이 30보다 작은 데이터를 조회하는 쿼리)
db.inventory.find( {$and: [ {status:"A"}, {qty:{$lt:30}} ]} )
- 콜렉션(Collection) : 콜렉션은 데이터베이스의 하위 개념으로 RDBMS 의 테이블과 비슷하다.
(MongoDB 사용 예시)
$ mongo
> db.user.insert({uid: 'admin', upw: 'secretpassword'})
WriteResult({ "nInserted" : 1 })
> db.user.find({uid: 'admin'})
{ "_id" : ObjectId("5e71d395b050a2511caa827d"), "uid" : "admin", "upw" : "secretpassword" }
연산자의 종류
(비교)
1. $eq : 지정된 값과 같은 값을 찾는다. (equal)
2. $in : 배열 안의 값들과 일치하는 값을 찾는다. (in)
3. $ne : 지정된 값과 같지 않은 값을 찾는다. (not equal)
4. $nin : 배열 안의 값들과 일치하지 않은 값을 찾는다. (not in)
(논리)
1. $and : 논리적 AND
2. $not : 쿼리 식의 일치하지 않는 문서를 반환한다.
3. $nor : 각각의 쿼리를 모두 만족하지 않는 문서가 반환된다.
4. $or : 논리적 OR
(요소)
1. $exists : 지정된 필드가 있는 문서를 찾는다.
2. $type : 지정된 필드가 지정된 유형인 문서를 선택한다.
(값)
1. $expr : 쿼리 언어 내에서 집계 식을 사용할 수 있다.
2. $regex : 지정된 정규식과 일치하는 문서를 선택한다.
3. $text : 지정된 텍스트를 검색한다.
조회
1. db.account.find() <-> SELECT * FROM account;
2. db.account.find({user_id:"admin"}) <-> SELECT * FROM account WHERE user_id="admin";
3. db.account.find({user_id:"admin"},{user_idx:1, _id:0}) <->
SELECT user_idx FROM account WHERE user_id="admin";
삽입
1. db.account.insert({
user_id: "guest",
user_pw: "guest"
)
삭제
1. db.account.remove() <-> DELETE FROM account;
2. db.account.remove({user_id: "guest"}) <-> DELETE FROM account WHERE user_id="guest";
수정
1. db.account.update(
{user_idx: 2}, <-> WHERE user_idx=2;
{ $set: {user_id:"guest2"}}
)
2. Redis
키-값의 쌍을 가진 데이터를 저장한다.
제일 큰 특징은 메모리 기반의 DBMS 라는 점이다.
메모리를 사용하여 데이터를 저장하고 접근하므로 읽고 쓰는 작업이 다른 DBMS 에 비해 훨씬 빠르다.
따라서, 다양한 서비스에서 임시 데이터를 캐싱하는 용도로 주로 사용한다.
(Redis 사용 예시)
$ redis-cli
127.0.0.1:6379> SET test 1234 # SET key value
OK
127.0.0.1:6379> GET test # GET key
"1234"
데이터 조회 및 조작 명령어
1. GET : GET key - 데이터 조회
2. MGET : MGET key [key...] - 여러 데이터 조회
3. SET : SET key value - 새로운 데이터 추가
4. MSET : MSET key value [key value...] - 새로운 데이터 여러개 추가
5. DEL : DEL key[key...] - 데이터 삭제
6. EXISTS : EXISTS key[key...] - 데이터 유무 확인
7. INCR : INCR key - 데이터 값에서 1 더한다.
8. DECR : DECR key - 데이터 값에서 1을 뺀다.
관리 명령어
1. INFO : INFO [section] - DBMS 정보 조회
2. CONFIG GET : CONFIG GET parameter - 설정 조회
3. CONFIG SET : CONFIG SET parameter value - 새로운 설정을 입력한다.
3. CouchDB
JSON 형태인 도규먼트를 저장한다.
이것은 웹 기반의 DBMS, REST API 형식으로 요청을 처리한다.
(HTTP 요청으로 레코드를 업데이트, 조회 예시)
$ curl -X PUT http://{username}:{password}@localhost:5984/users/guest -d '{"upw":"guest"}'
{"ok":true,"id":"guest","rev":"1-22a458e50cf189b17d50eeb295231896"}
$ curl http://{username}:{password}@localhost:5984/users/guest
{"_id":"guest","_rev":"1-22a458e50cf189b17d50eeb295231896","upw":"guest"}
각 메소드에 따른 기능
1. POST : 새로운 레코드를 추가한다.
2. GET : 레코드를 조회한다.
3. PUT : 레코드를 업데이트한다.
4. DELETE : 레코드를 삭제한다.
또한, CouchDB 에서는 서버 또는 데이터베이스를 위해 다양한 기능을 제공한다.
기능 중에서 문자로 시작하는 URL, 필드는 특수 구성 요소를 나타낸다.
데이터베이스
1. /db : 지정된 데이터베이스에 대한 정보를 반환한다.
2. /{db}/_all_docs : 지정된 데이터베이스에 포함된 모든 도큐먼트를 반환한다.
3. /{db}/_find : 지정된 데이터베이스에서 JSON 쿼리에 해당하는 모든 도큐먼트를 반환한다.
서버
1. / : 인스턴스에 대한 메타 정보를 반환한다.
2. /_all_dbs : 인스턴스의 데이터베이스 목록을 반환한다.
3. /_utils : 관리자페이지로 이동한다.
'TeamH4C' 카테고리의 다른 글
[빡공팟 5기] W4 : Web Hacking 로드맵 - STAGE 7 - File Vulnerability (0) | 2022.10.17 |
---|---|
[빡공팟 5기] W4 : Web Hacking 로드맵 - STAGE 6 - Command Injection (0) | 2022.10.17 |
[빡공팟 5기] W4 : Web Hacking 로드맵 - STAGE 5 - SQL Injection (0) | 2022.10.14 |
[빡공팟 5기] W4 : Web Hacking 로드맵 - STAGE 5 - RDBMS (0) | 2022.10.14 |
[빡공팟 5기] W4 : Web Hacking 로드맵 - STAGE 4 - CSRF (0) | 2022.10.14 |