---
# System prepended metadata

title: '**Zon''s backend note**'

---

# **Zon's backend note**
## **1.JWT(json web token)**
### **JWT 是什麼**
用於在雙方之間安全的將訊息作為JSON物件傳輸。JWT就是一種==JSON物件==，這個訊息經過數位簽章，所以可以驗證寄信人的身分，保護訊息傳輸的完整性。

可以使用==密碼==或是用一對==公鑰/私鑰==來對JWT進行簽章。
### **JWT 的組成**
>JWT 是一組字串，透過( . )切分成三個Base64編碼的部分
**1.Header**
**2.PayLoad**
**3.signature/encryprion Data**

- header和payload是特定的結構的JSON物件，第三部分取決於演算法是用來做簽章還是加密，如果未加密則省略。
- JWT可被編碼成JWS/JWE，JWS和JSE定義了另一種序列化格式(JSON序列化)。允許在同一JWT中使用多個簽章或接收者。

**Header**
>**無論 JWT 是簽章的還是加密的，header表示了其所使用的演算法，也會用來表示如何解析JWT其餘部分。**

**header內涵：**
1.必要欄位：
* alg：對此JWT進行簽章或解密的主要演算法，若未加密則為'none'
![](https://i.imgur.com/Cxoe5LH.png)

2.非必要欄位：
* **typ：** 媒體類型。將JWT與帶有JOSE header的其他對象混合使用的情況。此聲明因設置為 'JWT'。
* **cty：** 內容類型。大部分JWT攜帶特定的聲明都會存在PayLoad，對於payload是JWT自己的實例必須設置為 'JWT'，此聲明不常出現。

**PayLoad**
>**通常所有使用者資訊都會放在PayLoad裡，payload 是一個 JSON 物件。具有特定含意的權利稱為registered claims。**

**Registered Claims包含：**
* **iss：** issuer用字串或URL表示這個JWT的發行方。
* **sub：** subject用字串或URL表示這個JWT的識別訊息

> **JWT 中包含的聲明是關於對象的聲明，此聲明是處理特定應用的。**

* **aud：** audience。讀取JWT的數據那一方必須在aud中找到自己，或忽略掉JWT中的數據。
* **exp：** ecpiration。被視為JWT無效的時間。
* **nbf：** not before。當前時間。
* **iat：** issued at。JWT發行的時間。
* **jti：** JWT ID。區分其他具有相似內容的JWT，以確保JWT的唯一性。

>**所有的聲明，只要不在 registered claims 裡的，不是 private claims 就是 public claims。**

* **Private Claims：** 用於特定情況的臨時聲明。因此，必須注意防止衝突
* **Public Claims：** 用戶可以註冊其聲明，以防止衝突，使用抗衝突名稱命名的聲明(例如，在名稱前添加 namespace)。
### **JWT 流程**
**1.** 伺服器收到登入請求後驗證使用者
**2.** 伺服器端產生並且回傳只能在伺服器端驗證的Token
**3.** Token被回傳後，存在客戶端
**4.** 以後客戶端像伺服器端發送請求時，皆附帶Token讓伺服器驗證
**5.** 若伺服器端在請求中沒有找到Token，回傳錯誤，有找到則驗證。
### **JWT 適用情況**
* ==**授權(Authorization)：**== 使用者從 Client 端登入後，該使用者再次對 Server 端發送請求的時候，會夾帶著 JWT，允許使用者存取該 token 有權限的資源。
* ==**訊息交換(Information Exchange)：**== JWT 可以透過公鑰/私鑰來做簽章，讓我們可以知道是誰發送這個 JWT，此外，由於簽章是使用 header 和 payload 計算的，因此還可以驗證內容是否遭到篡改。
***
## **2.Mongoose**
### **Mongoose是什麼**
Mongoose是對MongoDB的操作工具，是對MongoDB操作的library，包含了搜尋、新增、刪除、更改等常用方法。

讓node js操作MongoDB資料庫變得更加靈活

**安裝mongoose**
> npm install mongoose
> yarn add mongoose 

### **也許是與資料庫互動最好的方式**
>**兩種與資料庫互動的方法**
>* **使用資料庫的原生語言(例 SQL)**
>* **使用對象數據模型(ODM)/對象關係模型(ORM)**

**ODM(Object-Document Mapping)**
> **物件文件對映，就是預先定義好了類型的規則，省去了校驗的步驟。**

**ORM(Object Relational Mapping)**
>**資料都是以「物件的方式」來撰寫，當物件與表資料之間存在映射關係的時候，就可以讓我們在開發程式時，無須操作許多繁瑣的 SQL 語句，可以減少那些對資料庫進行基本操作的程式開發。**
***
## **3.DataBase Index**
### **Index的作用**
>

***
## **4.NoSQL and RDBMS**
### **NoSQL**
> **NoSQL(Not Only SQL)非關聯式資料庫為特定資料模型建立，不需要定義schema。**

**NoSQL的結構**
* **資料庫由collection組成**
* **collection中每一筆為一份doucument**
* **document中的格式不須一致**
* **以CAP theorem為概念設計**
![](https://i.imgur.com/t4YcRmP.png)



**CAP的定義**

>關聯式資料庫比較注重CA，C較為重視嚴謹，A較為重視效能，因此有P的才能視為NoSQL，所以NoSQL的組合只有PA跟PC兩種組合。但是RDBMS也有CP的情況。

>PA是注重效能，而PC是注重資料的一致性。

* **一致性(Consistency)：** 在每個時間點資料跟數據都是一樣的。
* **可用性(Availability)：** 每次的request都會有回應，不管是成功還是失敗。
* **分區容錯(Partition tolerance)：** 確保資料不見，不會對系統造成影響。

**非關聯式資料庫的種類**

* **鍵值資料庫(Key-Value Database)：**
![](https://i.imgur.com/RGyix3y.png)
* **列導向資料庫(Column-Oriented Database)：**
 ![](https://i.imgur.com/V1EMv5e.png)
* **文檔資料庫(Document-Oriented Database)：**
![](https://i.imgur.com/JcOY4qB.png)

**NoSQL優點**
> * 可以管理大規模資料，非關聯式資料庫可以使用分散式儲存資料，存取更大量的資料。
> * 資料系統設計較為自由，可以比較自由的去做規劃設計。
> * 其中一個資料庫節點損壞的時候不會影響到其他資料
> 儲存空間需要擴充時只需要新增一台普通的硬體即可。
> * 讀取不需要等待，執行的效率可能會比關連式資料庫好。

**NoSQL使用時機**

>需要儲存大量資料，對於未來有大量擴充需求的系統，會更容易地去擴充，擴充成本較低。
>NoSQL的schema不需要固定，且資料結構為任意結構，schema需要變動或是不固定、或是在開發初期。
### **RDBMS**
> **RDBMS(Relational Database Management System)關聯式資料庫，是由多個資料表(Table)組成，資料表可以關聯起來，可以透過主鍵與外鍵連結多個資料表之間的關係**

> * **主鍵：** 用來識別資料的唯一性，是不可重複的值。
> * **外鍵：** 用來建立與另一資料表的關係，且值必須與另一資料表主鍵相同。

**RDBMS的特點**
* **由資料表(Table)組成，row代表一筆資料，column代表欄位名稱。**
* **Schema必須先定義好。**
* **只接受同樣格式資料的插入與修改。**
* **使用SQL(Structured Querying Language)來管理、查詢資料。**
* **可以做較複雜的查詢**
![](https://i.imgur.com/pWqUJI8.png)

**RDBMS使用時機**

需要ACID的情況下。RDBMS可以同步一致的更新到資料庫上。保證了資料的一致性。
>**ACID：為保證transaction是正確的所需具備的四個特性。**
* **原子性(Atomicity)：** 不可分割、不可簡略。
* **一致性(Consistency)：** 寫入的資料必須完全符合所有的預設。 
* **隔離性(lsolation)：** 防止多個事件執行時由於交叉執行導致數據的不一致。 
* **持久性(Durability)：** 對數據的修改是永久的，即使系統故障也不會丟失。 

**RDBMS的水平擴充**


### **COMPARE**

<table>
	<tr>
		<th>Compare</th>
		<th>NoSQL</th>
		<th>RDBMS</th>
	</tr>
	＜tr>
		<th>資料庫組成</th>
		<th>
			資料表:table<br>水平欄位:Row</br>垂直欄位:Column</br>
		</th>
		<th>一份資料:Document<br>集合:Collection</br>集合組成:DataBase</br>
		</th>
	</tr>
	<tr>
		<th>CAP定義</th>
		<th>AP:犧牲一致性<br>CP:犧牲可用性</th>
		<th>CA:犧牲可區容錯性<br>CP:犧牲可用性(分散式關聯式資料庫)</th>
	</tr>
	<tr>
		<th>ACID定義</th>
		<th>X</th>
		<th>所有資料必須符合</th>
	</tr>
	<tr>
		<th>資料庫擴充方式</th>
		<th>水平擴充 and 垂直擴充</th>
		<th>垂直擴充 and 水平擴充(較複雜)</th>
	</tr>
	<tr>
		<th>ORM/ODM</th>
		<th>ODM(Object-Document Mapping)</th>
		<th>ORM(Object Relational Mapping)</th>
	</tr>
	<tr>
		<th>一個節點損壞是否影響使用</th>
		<th>不影響</th>
		<th>會影響</th>
	</tr>
	<tr>
		<th>Schema</th>
		<th>不需定義</th>
		<th>需定義</th>
	</tr>
</table>

***
## **5.Mobx and redux**
### **Mobx**

### **Redux**
***
## **6.functional programming**
***
## **7.Mutable and Immutable**
### **Immutable**
### **Mutable**
***
## **8.CORS**
***
