← Backend← Backend
BackendBackend19 Th7, 2026Jul 19, 202618 phút đọc16 min read

Nền tảng Internet & WebInternet & Web Fundamentals

Thuộc bộ kiến thức Backend Roadmap.

Tổng quan

Mọi backend bạn xây dựng đều nằm ở cuối một chuỗi dài gồm các network, protocol và máy chủ. Người dùng gõ một URL hoặc app gọi một API, và chỉ trong vài trăm mili-giây, một packet rời khỏi thiết bị của họ, đi qua các router và cáp quang biển, được giải mã, được parse, được định tuyến tới process của bạn, rồi được trả lời. Nếu không hiểu chuỗi này, bạn sẽ chẩn đoán sai latency, cấu hình sai TLS, làm rò rỉ cookie, và bối rối vì DNS caching.

Note này xây dựng mô hình tư duy mà một backend developer thực sự cần:

Lý thuyết networking sâu hơn (các tầng OSI, routing protocol, subnetting, congestion control) nằm ở ../../network-engineer/README.md. Ở đây ta giữ ở độ cao mà một backend engineer làm việc hằng ngày, và liên kết chéo tới Web Servers, APIsWeb Security khi các chủ đề đi sâu hơn.

Kiến thức nền tảng

Internet hoạt động thế nào

Internet là một “network của các network”, cùng thống nhất một cách chung để đánh địa chỉ và chuyển tiếp dữ liệu. Các ý tưởng cốt lõi:

Thuộc tínhTCPUDP
Kết nốiCó (handshake)Không
Giao nhận tin cậyCó (retransmit)Không
Thứ tựKhông
OverheadCao hơnThấp hơn
Dùng điển hìnhHTTP(S), SSH, DBDNS, video, game, QUIC

Ghép các tầng lại cho một API call bình thường: payload JSON của bạn được bọc bởi HTTP, chạy trên TLS (với HTTPS), chạy trên TCP, chạy trên IP, được mang bởi tầng physical/link (Ethernet, Wi-Fi, cáp quang). Mỗi tầng chỉ quan tâm header của chính nó và coi tầng trên là payload không cần hiểu.

DNS và tên miền

Con người dùng tên (api.example.com); network định tuyến bằng IP address. DNS (Domain Name System) là cơ sở dữ liệu phân tán, phân cấp, dùng để dịch tên thành địa chỉ (và nhiều hơn thế).

Tên miền (domain name) là gì. Domain name là một nhãn dễ đọc, được đăng ký trong không gian tên DNS toàn cầu, đọc từ phải qua trái theo các cấp:

api.example.com.
│   │       │  └── root (dấu chấm cuối, thường ngầm định)
│   │       └───── TLD (top-level domain): com, org, io, dev...
│   └───────────── SLD (second-level domain): example — phần bạn đăng ký/sở hữu
└───────────────── subdomain / hostname: api

Bạn thuê một domain từ một registrar (Namecheap, Cloudflare, Google Domains). Registrar ghi nhận các authoritative nameserver của bạn với registry của TLD. Các nameserver này lưu các DNS record của bạn.

Luồng resolution (phân giải). Khi một client cần IP của www.example.com:

  1. App hỏi stub resolver của OS, resolver này hỏi một recursive resolver (của ISP, hoặc 1.1.1.1 / 8.8.8.8).
  2. Nếu chưa có trong cache, resolver hỏi một root nameserver: “ai quản lý .com?” → nhận về các TLD nameserver của .com.
  3. Resolver hỏi một TLD server của .com: “ai là authoritative cho example.com?” → nhận về các authoritative nameserver của example.com.
  4. Resolver hỏi authoritative server để lấy A record của www.example.com → nhận 93.184.216.34.
  5. Resolver cache câu trả lời theo TTL của record và trả về cho client.

Đây là lý do thay đổi DNS không tức thời: cache ở mọi cấp tuân theo TTL của record. TTL thấp thì lan truyền nhanh hơn nhưng tăng tải query.

Các loại record thường gặp.

RecordMục đíchVí dụ giá trị
AHostname → IPv493.184.216.34
AAAAHostname → IPv62606:2800:220:1::1946
CNAMEAlias tới một tên khácexample.com.
MXMail server (kèm priority)10 mail.example.com.
TXTText tùy ý (SPF, xác minh domain, DKIM)"v=spf1 include:_spf.google.com ~all"
NSỦy quyền một zone cho nameserverns1.cloudflare.com.
SOAMetadata của zone (serial, TTL)
SRVVị trí service (host + port)10 5 5060 sip.example.com.
CAACA nào được phép cấp cert0 issue "letsencrypt.org"

Kiểm tra DNS bằng dig:

# A record và kết quả phân giải
$ dig www.example.com A +noall +answer
www.example.com.  86400  IN  A  93.184.216.34

# Xem từng bước các authoritative server được dùng
$ dig +trace example.com

# Query một loại record cụ thể với một resolver cụ thể
$ dig @1.1.1.1 example.com MX +short

Hosting

Hosting đơn giản là có một máy luôn bật, có thể tiếp cận qua một public IP, đang chạy process backend của bạn. Các mô hình đánh đổi giữa mức độ kiểm soát và gánh nặng vận hành:

Mô hìnhBạn nhận đượcBạn quản lýPhù hợp cho
Shared hostingMột phần của một server dùng chung nhiều tenantGần như không gìSite nhỏ, rẻ
VPSMột virtual machine với tài nguyên riêngOS, runtime, deploy, vá lỗiKiểm soát đầy đủ, quy mô vừa
Dedicated serverNguyên một máy vật lýMọi thứ (kể cả giới hạn phần cứng)Hiệu năng/cô lập tối đa
Cloud (IaaS/PaaS)VM theo yêu cầu, DB managed, load balancer, autoscalingTùy (ít hơn với PaaS)Co giãn linh hoạt, đa số team
Serverless (FaaS)Chạy function theo từng request; không phải quản serverChỉ code của bạnWorkload dồn cục/hướng sự kiện

Xu hướng là đi lên nấc thang trừu tượng: từ thuê phần cứng đến thuê năng lực. Serverless (AWS Lambda, Cloud Functions) loại bỏ hoàn toàn việc quản server và scale về 0, đổi lại có cold start và giới hạn thời gian chạy. Container + orchestration (Docker + Kubernetes) nằm ở giữa. Xem Web Servers để hiểu process thực sự nhận kết nối trên host.

Khái niệm chính

HTTP là gì

HTTP (HyperText Transfer Protocol) là protocol tầng application, dạng text, theo mô hình request-response, mà client và server dùng để trao đổi message. Các đặc tính chính:

Cấu trúc request:

GET /api/users/42 HTTP/1.1        ← method, path, version (request line)
Host: api.example.com             ← các header
Accept: application/json
Authorization: Bearer eyJhbGci...
                                  ← dòng trống ngăn cách header với body

Cấu trúc response:

HTTP/1.1 200 OK                   ← version, status code, reason (status line)
Content-Type: application/json    ← các header
Content-Length: 51
Cache-Control: no-store

{"id":42,"name":"Ada","role":"admin"}   ← body

HTTP method

Method là động từ — thể hiện ý định của request.

MethodMục đíchSafeIdempotentCó body
GETĐọc một resourceKhông
HEADNhư GET nhưng chỉ headerKhông
POSTTạo mới / kích hoạt hành độngKhôngKhông
PUTThay thế toàn bộ resourceKhông
PATCHCập nhật một phần resourceKhôngKhông
DELETEXóa một resourceKhôngKhông
OPTIONSHỏi những gì được phép (CORS preflight)Không

HTTP status code

Mã ba chữ số, nhóm theo chữ số đầu:

DảiNhómVí dụ thường gặp
1xxInformational100 Continue, 101 Switching Protocols
2xxSuccess200 OK, 201 Created, 204 No Content
3xxRedirection301 Moved Permanently, 302 Found, 304 Not Modified
4xxClient error400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 409 Conflict, 422 Unprocessable Entity, 429 Too Many Requests
5xxServer error500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout

Lưu ý cho backend: 401 nghĩa là “chưa xác thực” (không có/sai credentials); 403 nghĩa là “đã xác thực nhưng không được phép”. Trả 201 kèm header Location khi tạo mới. Dùng 429 kèm header Retry-After cho rate limiting. Đừng bao giờ trả 200 kèm payload lỗi — client và proxy dựa vào status code.

HTTP header

Header là metadata dạng Name: Value. Các nhóm bạn sẽ dùng liên tục:

HeaderChiềuMục đích
HostRequestVirtual host nào (bắt buộc trong HTTP/1.1)
Content-TypeCả haiMedia type của body (application/json, text/html)
Content-LengthCả haiKích thước body tính bằng byte
AcceptRequestMedia type client xử lý được
AuthorizationRequestCredentials (Bearer <token>, Basic ...)
User-AgentRequestDanh tính phần mềm client
Cache-ControlCả haiQuy tắc cache (no-store, max-age=3600)
ETag / If-None-MatchCả haiRequest có điều kiện / kiểm tra cache
LocationResponseĐích redirect hoặc URL resource vừa tạo
Set-Cookie / CookieResp / ReqTrao đổi cookie
Access-Control-Allow-OriginResponseChính sách CORS
X-Forwarded-ForRequestIP client gốc phía sau proxy/LB

HTTP là stateless, nên cookie dùng để mang state qua nhiều request. Server gửi Set-Cookie; browser lưu lại và gửi kèm ở các request sau tới domain đó qua header Cookie.

Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Lax; Max-Age=3600; Path=/

Các thuộc tính quan trọng về bảo mật (chi tiết ở Web Security):

Giải pháp stateless thay thế (JWT trong Authorization) tránh việc lưu session phía server nhưng khó thu hồi (revoke) hơn.

HTTPS, SSL/TLS

HTTPS là HTTP chạy bên trong một kênh mã hóa TLS (Transport Layer Security) (SSL là tiền thân đã lỗi thời của TLS — hãy dùng TLS 1.2/1.3). TLS đảm bảo ba điều:

  1. Confidentiality (bảo mật) — traffic được mã hóa; kẻ nghe lén chỉ thấy ciphertext.
  2. Integrity (toàn vẹn) — mọi sửa đổi bị phát hiện qua message authentication code.
  3. Authentication (xác thực) — server chứng minh danh tính bằng một certificate được ký bởi một Certificate Authority (CA) đáng tin, nên bạn biết mình đang nói chuyện với example.com thật.

TLS 1.3 handshake (đơn giản hóa):

  1. ClientHello — client gửi phiên bản TLS hỗ trợ, các cipher suite, và một key-share (public key ephemeral).
  2. ServerHello — server chọn cipher, gửi key-share của nó và certificate (chứa public key, domain, và chữ ký của CA).
  3. Xác minh — client kiểm tra chuỗi certificate lên tới một root CA đáng tin, kiểm domain, hạn dùng, và trạng thái thu hồi.
  4. Sinh khóa — cả hai bên cùng suy ra một symmetric session key giống nhau từ các key-share đã trao đổi (ECDHE), đem lại forward secrecy.
  5. Dữ liệu application được mã hóa truyền bằng cipher đối xứng nhanh (ví dụ AES-GCM).

TLS 1.3 hoàn tất trong một round trip (1-RTT), có thể resume 0-RTT. TLS 1.2 cần hai. Certificate thường được cấp miễn phí bởi Let’s Encrypt (90 ngày, tự động gia hạn) hoặc bởi các CA thương mại. Việc terminate TLS thường diễn ra ở load balancer hoặc reverse proxy — xem Web Servers.

Browser và client (từ góc nhìn backend)

Từ góc nhìn backend, một browser chỉ là một HTTP client — nhưng là loại giàu tính năng. Nó gửi gì và làm gì:

Các client không phải browser (mobile app, curl, service khác) cũng nói HTTP nhưng bỏ qua render, cookie mặc định, và CORS. Backend của bạn không nên giả định là browser.

Vòng đời request từ đầu đến cuối

Điều thực sự diễn ra khi một client gọi https://api.example.com/users/42:

  1. Parse URL — scheme (https), host (api.example.com), port (443 ngầm định), path, query.
  2. DNS resolution — hostname → IP (cache → recursive resolver → root → TLD → authoritative), như trên.
  3. TCP handshake — SYN / SYN-ACK / ACK tới IP trên port 443.
  4. TLS handshake — thương lượng cipher, xác minh certificate, sinh session key.
  5. Gửi HTTP request — request line + header + body tùy chọn, qua kênh đã mã hóa.
  6. Đường đi trên network — packet đi qua các router/CDN edge về phía server.
  7. Xử lý phía server — một reverse proxy / load balancer có thể terminate TLS và định tuyến tới một backend instance; web server (xem Web Servers) chuyển request cho application của bạn, application chạy middleware (auth, logging), route tới handler, query database/cache, và dựng response.
  8. Trả HTTP response — status line + header + body đi ngược lại trên cùng kết nối.
  9. Client xử lý — parse status/header, giải nén, đi theo redirect, áp dụng cache, và (với browser) render hoặc (với API client) deserialize JSON.
  10. Tái sử dụng hoặc đóng kết nối — keep-alive/multiplexing của HTTP2 tái dùng kết nối cho các request sau; nếu không thì đóng.

Bạn có thể quan sát phần lớn quá trình này bằng curl -v:

$ curl -v https://api.example.com/users/42
*   Trying 93.184.216.34:443...
* Connected to api.example.com (93.184.216.34) port 443
* TLS 1.3 handshake, cipher TLS_AES_256_GCM_SHA384
* Server certificate: CN=api.example.com; issuer: Let's Encrypt
> GET /users/42 HTTP/2                ← các header request ta gửi
> Host: api.example.com
> user-agent: curl/8.4.0
> accept: */*
>
< HTTP/2 200                          ← các header response ta nhận
< content-type: application/json
< cache-control: no-store
<
{"id":42,"name":"Ada"}

Best Practices

Tài liệu tham khảo

Part of the Backend Roadmap knowledge base.

Overview

Every backend you build lives at the far end of a long chain of networks, protocols, and machines. A user types a URL or an app fires an API call, and within a few hundred milliseconds a packet leaves their device, crosses routers and undersea cables, is decrypted, parsed, routed to your process, and answered. If you do not understand that chain, you will misdiagnose latency, misconfigure TLS, leak cookies, and be surprised by DNS caching.

This note builds the mental model a backend developer actually needs:

Deeper networking theory (OSI layers, routing protocols, subnetting, congestion control) lives in ../../network-engineer/README.md. Here we stay at the altitude a backend engineer works at day to day, and cross-link to Web Servers, APIs, and Web Security where the topics deepen.

Fundamentals

How the internet works

The internet is a network of networks that agree on a common way to address and forward data. The core ideas:

PropertyTCPUDP
ConnectionYes (handshake)No
Reliable deliveryYes (retransmits)No
OrderingYesNo
OverheadHigherLower
Typical useHTTP(S), SSH, DBDNS, video, gaming, QUIC

Putting the layers together for a normal API call: your JSON payload is wrapped by HTTP, which rides on TLS (for HTTPS), which rides on TCP, which rides on IP, which is carried by the physical/link layer (Ethernet, Wi-Fi, fiber). Each layer only cares about its own header and treats the layer above as opaque payload.

DNS and domain names

Humans use names (api.example.com); the network routes on IP addresses. DNS (Domain Name System) is the distributed, hierarchical database that translates names to addresses (and more).

What a domain name is. A domain name is a human-readable label registered in the global DNS namespace, read right-to-left in levels:

api.example.com.
│   │       │  └── root (the trailing dot, usually implicit)
│   │       └───── TLD (top-level domain): com, org, io, dev...
│   └───────────── SLD (second-level domain): example — what you register/own
└───────────────── subdomain / hostname: api

You lease a domain from a registrar (Namecheap, Cloudflare, Google Domains). The registrar records your authoritative nameservers with the TLD registry. Those nameservers hold your DNS records.

Resolution flow. When a client needs the IP for www.example.com:

  1. The app asks the OS stub resolver, which asks a recursive resolver (your ISP’s, or 1.1.1.1 / 8.8.8.8).
  2. If not cached, the resolver asks a root nameserver: “who handles .com?” → gets the .com TLD nameservers.
  3. Resolver asks a .com TLD server: “who is authoritative for example.com?” → gets example.com’s authoritative nameservers.
  4. Resolver asks the authoritative server for the www.example.com A record → gets 93.184.216.34.
  5. The resolver caches the answer for its TTL and returns it to the client.

This is why DNS changes are not instant: caches at every level honor the record’s TTL. Lower TTLs propagate faster but increase query load.

Common record types.

RecordPurposeExample value
AHostname → IPv493.184.216.34
AAAAHostname → IPv62606:2800:220:1::1946
CNAMEAlias to another nameexample.com.
MXMail servers (with priority)10 mail.example.com.
TXTArbitrary text (SPF, domain verification, DKIM)"v=spf1 include:_spf.google.com ~all"
NSDelegates a zone to nameserversns1.cloudflare.com.
SOAZone metadata (serial, TTLs)
SRVService location (host + port)10 5 5060 sip.example.com.
CAAWhich CAs may issue certs0 issue "letsencrypt.org"

Inspect DNS with dig:

# A record and the resolution path
$ dig www.example.com A +noall +answer
www.example.com.  86400  IN  A  93.184.216.34

# See which authoritative servers are used, step by step
$ dig +trace example.com

# Query a specific record type against a specific resolver
$ dig @1.1.1.1 example.com MX +short

Hosting

Hosting is simply having a machine that is always on, reachable on a public IP, running your backend process. The models trade off control against operational burden:

ModelWhat you getYou manageGood for
Shared hostingA slice of one server shared with many tenantsAlmost nothingSmall sites, cheap
VPSA virtual machine with dedicated resourcesOS, runtime, deploys, patchingFull control, moderate scale
Dedicated serverA whole physical machineEverything (incl. hardware limits)Max performance/isolation
Cloud (IaaS/PaaS)On-demand VMs, managed DBs, load balancers, autoscalingVaries (less on PaaS)Elastic scale, most teams
Serverless (FaaS)Run functions per-request; no servers to manageJust your codeSpiky/event-driven workloads

The trend is up the abstraction ladder: from renting hardware to renting capabilities. Serverless (AWS Lambda, Cloud Functions) removes server management entirely and scales to zero, at the cost of cold starts and execution limits. Containers + orchestration (Docker + Kubernetes) sit in between. See Web Servers for the process that actually accepts connections on the host.

Key Concepts

What HTTP is

HTTP (HyperText Transfer Protocol) is the application-layer, text-based, request-response protocol that clients and servers use to exchange messages. Key properties:

Request structure:

GET /api/users/42 HTTP/1.1        ← method, path, version (request line)
Host: api.example.com             ← headers
Accept: application/json
Authorization: Bearer eyJhbGci...
                                  ← blank line separates headers from body

Response structure:

HTTP/1.1 200 OK                   ← version, status code, reason (status line)
Content-Type: application/json    ← headers
Content-Length: 51
Cache-Control: no-store

{"id":42,"name":"Ada","role":"admin"}   ← body

HTTP methods

The method is the verb — the intent of the request.

MethodPurposeSafeIdempotentBody
GETRead a resourceYesYesNo
HEADLike GET, headers onlyYesYesNo
POSTCreate / trigger an actionNoNoYes
PUTReplace a resource entirelyNoYesYes
PATCHPartially update a resourceNoNoYes
DELETERemove a resourceNoYesNo
OPTIONSAsk what’s allowed (CORS preflight)YesYesNo

HTTP status codes

Three-digit codes grouped by first digit:

RangeClassCommon examples
1xxInformational100 Continue, 101 Switching Protocols
2xxSuccess200 OK, 201 Created, 204 No Content
3xxRedirection301 Moved Permanently, 302 Found, 304 Not Modified
4xxClient error400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 409 Conflict, 422 Unprocessable Entity, 429 Too Many Requests
5xxServer error500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout

Backend tips: 401 means “not authenticated” (no/invalid credentials); 403 means “authenticated but not allowed”. Return 201 with a Location header on creation. Use 429 with a Retry-After header for rate limiting. Never return 200 with an error payload — clients and proxies rely on the code.

HTTP headers

Headers are Name: Value metadata. Categories you will use constantly:

HeaderDirectionPurpose
HostRequestWhich virtual host (required in HTTP/1.1)
Content-TypeBothMedia type of the body (application/json, text/html)
Content-LengthBothBody size in bytes
AcceptRequestMedia types the client can handle
AuthorizationRequestCredentials (Bearer <token>, Basic ...)
User-AgentRequestClient software identity
Cache-ControlBothCaching rules (no-store, max-age=3600)
ETag / If-None-MatchBothConditional requests / cache validation
LocationResponseRedirect target or created-resource URL
Set-Cookie / CookieResp / ReqCookie exchange
Access-Control-Allow-OriginResponseCORS policy
X-Forwarded-ForRequestOriginal client IP behind a proxy/LB

Cookies and state

HTTP is stateless, so cookies carry state across requests. The server sends Set-Cookie; the browser stores it and returns it on subsequent requests to that domain via the Cookie header.

Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Lax; Max-Age=3600; Path=/

Security-critical attributes (details in Web Security):

Stateless alternatives (JWTs in Authorization) avoid server-side session storage but can’t be revoked as easily.

HTTPS, SSL/TLS

HTTPS is HTTP running inside a TLS (Transport Layer Security) encrypted channel (SSL is TLS’s deprecated predecessor — use TLS 1.2/1.3). TLS provides three guarantees:

  1. Confidentiality — traffic is encrypted; eavesdroppers see only ciphertext.
  2. Integrity — tampering is detected via message authentication codes.
  3. Authentication — the server proves its identity via a certificate signed by a trusted Certificate Authority (CA), so you know you’re talking to the real example.com.

The TLS 1.3 handshake (simplified):

  1. ClientHello — client sends supported TLS version, cipher suites, and a key-share (ephemeral public key).
  2. ServerHello — server picks the cipher, sends its key-share and its certificate (containing its public key and domain, signed by a CA).
  3. Verification — client validates the certificate chain up to a trusted root CA, checks the domain, expiry, and revocation.
  4. Key derivation — both sides derive the same symmetric session key from the exchanged key-shares (ECDHE), giving forward secrecy.
  5. Encrypted application data flows using the fast symmetric cipher (e.g. AES-GCM).

TLS 1.3 completes this in one round trip (1-RTT), with 0-RTT resumption possible. TLS 1.2 needed two. Certificates are commonly issued free by Let’s Encrypt (90-day, auto-renewed) or by commercial CAs. Termination often happens at a load balancer or reverse proxy — see Web Servers.

Browsers and clients (from the backend’s view)

From your backend’s perspective, a browser is just an HTTP client — but a feature-rich one. What it sends and does:

Non-browser clients (mobile apps, curl, other services) speak the same HTTP but skip rendering, cookies-by-default, and CORS. Your backend should not assume a browser.

The end-to-end request lifecycle

What actually happens when a client calls https://api.example.com/users/42:

  1. URL parse — scheme (https), host (api.example.com), port (443 implied), path, query.
  2. DNS resolution — hostname → IP (cache → recursive resolver → root → TLD → authoritative), as above.
  3. TCP handshake — SYN / SYN-ACK / ACK to the IP on port 443.
  4. TLS handshake — negotiate cipher, validate certificate, derive session key.
  5. HTTP request sent — request line + headers + optional body, over the encrypted channel.
  6. Network path — packets traverse routers/CDN edges toward the server.
  7. Server-side processing — a reverse proxy / load balancer may terminate TLS and route to a backend instance; the web server (see Web Servers) hands the request to your application, which runs middleware (auth, logging), routes to a handler, queries the database/cache, and builds a response.
  8. HTTP response returned — status line + headers + body travel back over the same connection.
  9. Client handles it — parses the status/headers, decompresses, follows redirects, applies caching, and (for a browser) renders or (for an API client) deserializes the JSON.
  10. Connection reuse or close — keep-alive/HTTP2 multiplexing reuses the connection for subsequent requests; otherwise it closes.

You can watch most of this with curl -v:

$ curl -v https://api.example.com/users/42
*   Trying 93.184.216.34:443...
* Connected to api.example.com (93.184.216.34) port 443
* TLS 1.3 handshake, cipher TLS_AES_256_GCM_SHA384
* Server certificate: CN=api.example.com; issuer: Let's Encrypt
> GET /users/42 HTTP/2                ← request headers we send
> Host: api.example.com
> user-agent: curl/8.4.0
> accept: */*
>
< HTTP/2 200                          ← response headers we get
< content-type: application/json
< cache-control: no-store
<
{"id":42,"name":"Ada"}

Best Practices

References