CIDY
[Web_Hacking] stage6_NON-Relational DBMS 본문
*NRDBMS, NoSQL
RDBMS의 경우 복잡하며, 용량의 한계가 있음 -> 이를 해결하기 위해 NRDBMS등장
NRDBMS의 경우 SQL을 이용하지 않고 복잡하지 않은 데이터 저장 -> 단순 검색에 최적화된 저장 공간
키-값(Key-Value)을 이용해 데이터를 저장한다.
RDBMS의 경우 SQL이라는 정해진 문법이 있었기에 한 가지 언어로 다양한 DBMS를 이용하면 됐었지만, NoSQL의 경우 DBMS의 종류에 따라 구조와 사용 문법을 따로 알아야 한다.
(*NoSQL은 Not Only SQL -> SQL을 이용하지 않고 데이터 처리함을 의미)
*MongoDB
JSON형태인 Document를 저장한다.
-> 스키마를 따로 정의하지 않아 각 컬렉션(Collection)에 대한 정의가 필요없음
-> JSON형식으로 쿼리 작성
-> _id필드가 Primary Key역할
*Collection은 RDBMS의 테이블 느낌이다. (데이터베이스 하위)
$ mongo
> db.user.insert({uid: 'admin', upw: 'secretpassword'})
WriteResult({ "nInserted" : 1 })
> db.user.find({uid: 'admin'})
{ "_id" : ObjectId("5e71d395b050a2511caa827d"), "uid" : "admin", "upw" : "secretpassword" }
위는 데이터를 삽입/조회하는 쿼리 예시이다.
Mongo의 경우 $로 연산자를 쓴다. 기본적인 연산자는 다음과 같다.
->비교 연산자
$eq : 지정 값과 같은 값 찾음
$in : 배열 안의 값들과 일치하는 값 찾음
$ne : 지정 값과 같지 않은 값 찾음
$nin : 배열 안 값들과 일치하지 않는 값을 찾음
->논리 연산자
$and : 연결된 각 쿼리를 모두 만족하는 문서 반환
$not : 쿼리 식 효과 반전(쿼리 식과 일치하지 않는 문서 반환)
$nor : 각 쿼리를 모두 만족하지 않는 문서 반환
$or : 연결된 각 쿼리 중 하나라도 만족하는 문서 반환
->Element
$exist : 지정된 필드가 있는 문서 찾음
$type : 지정된 필드가 지정된 유형인 문서 선택
-> Evaluation
$expr : 쿼리 언어 내 집계 식 사용
$regex : 지정된 정규식과 일치하는 문서 선택
$text : 지정된 텍스트 검색
기본 문법은 다음과 같다. RDBMS에서 배웠던 SQL문법과 비교하면서 알아보자.
->SELECT == find
SELECT * FROM account; == db.account.find()
SELECT * FROM account WHERE user_id="admin"; == db.account.find({user_id: "admin"})
SELECT user_idx FROM account WHERE user_id="admin"' == db.account.find({user_id: "admin"}, {user_idx:1, _id:0})
->INSERT == insert
INSERT INTO account(user_id, user_pw) VALUES ("guest", "guest"); == db.account.insert({user_id: "guest", user_pw: "guest"})
->DELETE == remove
DELETE FROM account; == db.account.remove()
DELETE FROM account WHERE user_id="guest"; == db.account.remove({user_id: "guest"})
->UPDATE == update
UPDATE account SET user_id="guest2" WHERE user_idx=2; == db.account.update({user_id: 2}, { $set: {user_id: "guest2"}})
*Redis
키-값(Key-Value)의 쌍을 가진 데이터를 저장한다. 다른 데이터베이스들과는 달리 메모리를 기반으로 한다. 메모리를 이용해 데이터를 저장/접근하기에 읽고 쓰는 작업이 타 DBMS에 비해 빠름 -> 임시 데이터 캐싱 용도로 사용됨
$ redis-cli
127.0.0.1:6379> SET test 1234 # SET key value
OK
127.0.0.1:6379> GET test # GET key
"1234"
위는 Redis에서 데이터 추가/조회하는 명령어 예시이다.
->데이터 조회/조작 명령어
GET | GET key | 데이터 조회 |
MGET | MGET key [key ...] | 여러 데이터를 조회 |
SET | SET key value | 새로운 데이터 추가 |
MSET | MSET key value [key value ...] | 여러 데이터를 추가 |
DEL | DEL key [key ...] | 데이터 삭제 |
EXISTS | EXISTS key [key ...] | 데이터 유무 확인 |
INCR | INCR key | 데이터 값에 1 더함 |
DECR | DECR key | 데이터 값에 1 뺌 |
->관리 명령어
INFO | INFO [section] | DBMS 정보 조회 |
CONFIG GET | CONFIG GET parameter | 설정 조회 |
CONFIG SET | CONFIG SET parameter value | 새로운 설정을 입력 |
*CouchDB
JSON형태인 Document를 저장한다. 웹 기반 DBMS이고, REST API형식으로 요청을 처리한다.
POST | 새로운 레코드를 추가합니다. |
GET | 레코드를 조회합니다. |
PUT | 레코드를 업데이트합니다. |
DELETE | 레코드를 삭제합니다. |
$ 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"}
위는 CouchDB레코드 업데이트/조회 예시이다.
CouchDB에서는 서버나 데이터베이스를 위해 여러 기능을 제공하는데, _로 시작하는 URL과 필드는 특수 구성 요소이다.
/ | 인스턴스에 대한 메타 정보를 반환합니다. |
/_all_dbs | 인스턴스의 데이터베이스 목록을 반환합니다. |
/_utils | 관리자페이지로 이동합니다. |
/db | 지정된 데이터베이스에 대한 정보를 반환합니다. |
/{db}/_all_docs | 지정된 데이터베이스에 포함된 모든 도큐먼트를 반환합니다. |
/{db}/_find | 지정된 데이터베이스에서 JSON 쿼리에 해당하는 모든 도큐먼트를 반환합니다. |
'Hack > DreamHack(로드맵)' 카테고리의 다른 글
[Web_Hacking] stage6_문제풀이(Mango) (0) | 2022.07.30 |
---|---|
[Web_Hacking] stage6_NoSQL Injection (0) | 2022.07.30 |
[Web_Hacking] stage6_문제풀이(simple_sqli) (0) | 2022.07.29 |
[Web_Hacking] stage6_SQL injection (0) | 2022.07.29 |
[Web_Hacking] stage6_Relational DBMS (0) | 2022.07.29 |