Advanced
Security
45 mins read +100 XP

6. Auth: Password Hashing, JWT & Security

bcrypt salt hashing, signed JWT access tokens, refresh token rotation, CORS, Helmet headers, and rate limiting.

1. Overview

Node.js is an open-source, cross-platform JavaScript runtime environment built on Google Chrome's V8 engine. Unlike browser JavaScript environments that interact with DOM elements, Node.js provides C++ bindings to the host operating system, enabling file system access, network socket listening, process management, and multi-threaded background I/O operations through the **libuv** C library. The defining characteristic of Node.js is its **single-threaded, non-blocking asynchronous event-driven architecture**. While user JavaScript code runs on a single main thread, long-running I/O tasks (file reading, database queries, network requests) are delegated to the underlying OS or libuv thread pool.

2. Visual Architecture & Flow

Interactive REST API Explorer

Simulate HTTP GET, POST, PUT, DELETE endpoints with headers, request bodies, and real-time response inspection.

REST Architecture
Content-Type: application/json
Accept: application/json
User-Agent: YourLearn-Explorer/1.0
Response Data
Status: 200
45ms
{
  "status": "success",
  "results": 2,
  "data": [
    {
      "id": "usr_101",
      "name": "Alex Mercer",
      "email": "alex@example.com",
      "role": "FullStack Engineer",
      "createdAt": "2026-07-24"
    },
    {
      "id": "usr_102",
      "name": "Sarah Connor",
      "email": "sarah@example.com",
      "role": "Backend Architect",
      "createdAt": "2026-07-20"
    }
  ]
}

3. Detailed Technical Theory

### 1. The V8 Engine & C++ Bindings The V8 engine compiles JavaScript directly into native machine code using Just-In-Time (JIT) compilation before executing it. Node.js wraps V8 with native C++ abstractions (such as `uv_loop_t`, `v8::Isolate`) to expose OS-level capabilities via JavaScript core modules (`fs`, `net`, `http`, `crypto`). ### 2. The Phases of the Event Loop The **libuv Event Loop** processes events across 6 distinct phases in a continuous loop: 1. **Timers Phase**: Executes callbacks scheduled by `setTimeout()` and `setInterval()`. 2. **Pending Callbacks Phase**: Executes I/O callbacks deferred to the next loop iteration (e.g. TCP socket errors). 3. **Idle, Prepare Phase**: Used internally by Node.js for engine state maintenance. 4. **Poll Phase**: Retrieves new I/O events (network connections, incoming requests) and executes I/O related callbacks. If the poll queue is empty, the loop waits for incoming events. 5. **Check Phase**: Executes callbacks scheduled by `setImmediate()`. 6. **Close Callbacks Phase**: Executes socket close events (e.g. `socket.on('close', ...)`). ### 3. Microtasks & Macrotasks Execution Priority Between EVERY phase of the Event Loop, Node.js empties the **Microtask Queue**: - **Priority 1**: `process.nextTick()` queue. - **Priority 2**: Promise callbacks (`.then()`, `.catch()`, `async/await`). Never block the main thread with heavy synchronous computations (such as giant JSON parses or CPU-intensive loops), as this starves the Event Loop from processing incoming HTTP requests!

4. Real-World Analogy

Imagine a high-traffic Restaurant with 1 Waiter (The Single Thread) and a Kitchen Staff (The libuv Thread Pool). - The Waiter takes Customer A's order (HTTP Request) and passes the order ticket to the Kitchen Staff (Delegates I/O to libuv). - Instead of standing at the kitchen counter waiting for Customer A's steak to cook (Blocking), the Waiter immediately turns around to take Customer B's order (Non-blocking). - When Customer A's meal is ready, the Kitchen Staff dings a bell (I/O Callback pushed to Queue). - As soon as the Waiter finishes taking Customer B's order, they pick up Customer A's plate and deliver it (Event Loop callback execution).

5. Code Example: event-loop-demo.js

javascript
// Demonstrating Node.js Asynchronous Execution Order
const fs = require('fs');

console.log('1. Synchronous Start');

setTimeout(() => {
  console.log('2. setTimeout 0ms Callback (Timers Phase)');
}, 0);

setImmediate(() => {
  console.log('3. setImmediate Callback (Check Phase)');
});

Promise.resolve().then(() => {
  console.log('4. Promise Microtask');
});

process.nextTick(() => {
  console.log('5. process.nextTick Microtask (Highest Priority)');
});

console.log('6. Synchronous End');

/* Expected Console Output:
   1. Synchronous Start
   6. Synchronous End
   5. process.nextTick Microtask (Highest Priority)
   4. Promise Microtask
   2. setTimeout 0ms Callback (Timers Phase)
   3. setImmediate Callback (Check Phase)
*/