# **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'  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為概念設計**  **CAP的定義** >關聯式資料庫比較注重CA,C較為重視嚴謹,A較為重視效能,因此有P的才能視為NoSQL,所以NoSQL的組合只有PA跟PC兩種組合。但是RDBMS也有CP的情況。 >PA是注重效能,而PC是注重資料的一致性。 * **一致性(Consistency):** 在每個時間點資料跟數據都是一樣的。 * **可用性(Availability):** 每次的request都會有回應,不管是成功還是失敗。 * **分區容錯(Partition tolerance):** 確保資料不見,不會對系統造成影響。 **非關聯式資料庫的種類** * **鍵值資料庫(Key-Value Database):**  * **列導向資料庫(Column-Oriented Database):**  * **文檔資料庫(Document-Oriented Database):**  **NoSQL優點** > * 可以管理大規模資料,非關聯式資料庫可以使用分散式儲存資料,存取更大量的資料。 > * 資料系統設計較為自由,可以比較自由的去做規劃設計。 > * 其中一個資料庫節點損壞的時候不會影響到其他資料 > 儲存空間需要擴充時只需要新增一台普通的硬體即可。 > * 讀取不需要等待,執行的效率可能會比關連式資料庫好。 **NoSQL使用時機** >需要儲存大量資料,對於未來有大量擴充需求的系統,會更容易地去擴充,擴充成本較低。 >NoSQL的schema不需要固定,且資料結構為任意結構,schema需要變動或是不固定、或是在開發初期。 ### **RDBMS** > **RDBMS(Relational Database Management System)關聯式資料庫,是由多個資料表(Table)組成,資料表可以關聯起來,可以透過主鍵與外鍵連結多個資料表之間的關係** > * **主鍵:** 用來識別資料的唯一性,是不可重複的值。 > * **外鍵:** 用來建立與另一資料表的關係,且值必須與另一資料表主鍵相同。 **RDBMS的特點** * **由資料表(Table)組成,row代表一筆資料,column代表欄位名稱。** * **Schema必須先定義好。** * **只接受同樣格式資料的插入與修改。** * **使用SQL(Structured Querying Language)來管理、查詢資料。** * **可以做較複雜的查詢**  **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** ***
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up