Background: Non-Relational DBMS
# 들어가며 - 서론
- RDBMS: 스키마를 정의하고 해당 규격에 맞는 데이터를 2차원 테이블 형태로 저장
> 복잡할 뿐만 아니라, 저장해야 하는 데이터가 많아지면 용량의 한계에 다다를 수 있다는 단점이 있음
> 이를 해결하기 위해 등장한 것이 비관계형 데이터베이스 Non-relational DBMS(NRDBMS, NoSQL)
- 관계형 데이터베이스에서 발생할 수 있는 문제점으로 SQL Injection이 있었음
> 공격자는 이를 통해 데이터베이스의 정보를 알아내거나 임의의 결과를 반환해 인증을 우회하는 등의 행위가 가능함
> NoSQL 또한 이용자의 입력값을 통해 동적으로 쿼리를 생성해 데이터를 저장하기 때문에
이와 같은 문제점이 발생할 수 있음
# 비관계형 데이터베이스
- RDBMS: SQL을 사용해 데이터를 조회 및 추가 삭제할 수 있음
> SQL이라는 정해진 문법을 통해 데이터를 저장하기 때문에 한 가지 언어로 다양한 DBMS를 사용할 수 있음
- NoSQL: SQL을 사용하지 않고 복잡하지 않은 데이터를 저장해 단순 검색 및 작업을 위해 매우 최적화된 저장 공간인 것이 큰 특징이자 RDBMS와의 차이점
> 이 외에도, 키-값을 사용해 데이터를 저장하는 차이점이 존재
> Redis, Dynamo, CouchDB, NongoDB 등 다양한 DBMS가 존재하기 때문에
각각의 구조와 사용 문법을 익혀야한다는 단점이 있음
💡NoSQL 유래
- NoSQL이 가지는 의미에 대해 Non SQL, Non Relational SQL, Not Only SQL 등의 다양한 의견이 있지만 Not Only SQL로 통용되고 있음
- NOT Only SQL: SQL을 사용하지 않고 데이터를 다룰 수 있다는 의미
# MongoDB
(1) MongoDB
- MongoDB는 JSON 형태인 도큐먼트(Document)를 저장하며, 다음과 같은 특징을 갖고 있음
1. 스키마를 따로 정의하지 않아 각 콜렉션(Collection)에 대한 정의가 필요하지 않음
2. JSON 형식으로 쿼리를 작성할 수 있음
3. _id 필드가 Primary Key 역할을 함
MongoDB 사용 예시
- MongoDB에서 데이터를 삽입하고, 조회하는 쿼리의 예시
$ mongo
> db.user.insert({uid: 'admin', upw: 'secretpassword'})
WriteResult({ "nInserted" : 1 })
> db.user.find({uid: 'admin'})
{ "_id" : ObjectId("5e71d395b050a2511caa827d"), "uid" : "admin", "upw" : "secretpassword" }
- 각 DBMS에서 status의 값이 "A"이고, qty의 값이 30보다 작은 데이터를 조회하는 쿼리는 다음과 같음
> MongoDB의 경우 $ 문자를 통해 연산자를 사용할 수 있음
💡콜렉션(Collection)
- 콜렉션은 데이터베이스의 하위에 속하는 개념으로, RDBMS의 테이블과 비슷
(2) MongoDB 연산자
- Comparison
- Logical
- Element
- Evaluation
(3) 기본 문법
SELECT
INSERT
DELETE
UPDATE
# Redis
- Radis: 키-값(Key-Value)의 쌍을 가진 데이터를 저장
> 다른 데이터베이스와 다르게 메모리 기반의 DBMS
> 메모리를 사용해 데이터를 저장하고, 접근하기 때문에 읽고 쓰는 작업이 다른 DBMS 보다 훨씬 빠름
> 다양한 서비스에서 임시 데이터를 캐싱하는 용도로 주로 사용하고 있음
rdis 명령어 사용 예시
- 데이터를 추가하고, 조회하는 명령어의 예시
$ redis-cli
127.0.0.1:6379> SET test 1234 # SET key value
OK
127.0.0.1:6379> GET test # GET key
"1234"
데이터 조회 및 조작 명령어
관리 명령어
# CouchDB
(1) CouchDB
- CouchDB: MongoDB와 같이 JSON 형태인 도큐먼트(document)를 저장
> 웹 기반의 DBMS로, REST API 형식으로 요청을 처리
Method
CouchDB 레코드 업데이트 및 조회 예시
- 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"}
(2) 특수 구성 요소
- CouchDB에서는 서버 또는 데이터베이스를 위해 다양한 기능을 제공
- 그 중 _ 문자로 시작하는 URL, 필드는 특수 구성 요소를 나타냄
SERVER
Database
# 마치며
- 키워드
① 비관계형 데이터베이스(NoSQL): SQL을 사용해 데이터를 조회/추가/삭제하는 관계형 데이터베이스(RDBMS)와 달리 SQL을 사용하지 않으며, 이에 따라 RDBMS와는 달리 복잡하지 않은 데이터를 다루는 것이 큰 특징이자 RDBMS와의 차이점
② 콜렉션(Collection): 데이터베이스 하위에 속하는 개념
'Hacking Tech > Web hacking' 카테고리의 다른 글
[웹보안] Web/DB Server (0) | 2022.03.27 |
---|---|
[웹보안] 웹 보안 기초 이론 정리 (0) | 2022.03.27 |
[Dreamhack] ServerSide: SQL Injection (0) | 2022.03.08 |
[Dreamhack] Background: Relational DBMS (0) | 2022.03.07 |
[Dreamhack] ClientSide: CSRF (0) | 2022.02.13 |