Understanding URLs and HTTP: My Deep Dive into Web Communication
Security

Understanding URLs and HTTP: My Deep Dive into Web Communication

Building on my web server knowledge, I explored the fascinating world of URLs and HTTP protocols. From URL anatomy to HTTP headers, here's everything I discovered about how browsers and servers actually communicate - including some mind-blowing security implications.

P
Parham Forati
Author
September 14, 2025
10 min read
1290 views
Network SecurityOWASPHTTPURLWeb ProtocolsBrowser Security

Understanding URLs and HTTP: My Deep Dive into Web Communication

MARKDOWN
1<!-- meta: Learn how url and http really work! web server security owasp , beginner apache configuration -->

In my previous blog posts, we've been exploring the fundamentals of web security and networking. Today, I'm excited to share what I discovered about URLs and HTTP - the building blocks that make the web work. This stuff absolutely blew my mind when I realized how much depth there is behind every simple web request we make!

Let me walk you through what I learned, and trust me, by the end of this you'll see URLs and HTTP requests in a completely different light.

URLs: More Complex Than You Think

So here's something that surprised me - URLs aren't just simple addresses. They're actually incredibly structured, and understanding this structure is crucial for both web development and security.

The Anatomy of a URL

When I first learned the complete syntax of a URL, I was shocked at how many components there actually are:

<schema>://<user>:<password>@<host>:<port>/<path>?<query>#<frag>

Let me break this down with a real example. Imagine our friend Mamad is accessing his company's internal dashboard:

https://mamad:secret123@company.internal:8080/dashboard/reports?year=2024&dept=sales#summary

Here's what each part means:

Loading diagram...

Schema (https): This tells us we're using HTTPS protocol. Other examples include http, ftp, dns, etc.

User (mamad) & Password (secret123): These are optional authentication credentials. Most modern sites don't use this method anymore because it's insecure - the credentials are visible in the URL!

Host (company.internal): This is the only non-optional part! It must be something that can resolve to an IP address.

Port (8080): Here's something I found interesting - every protocol has a default port. HTTP uses 80, HTTPS uses 443. But you can specify a different one if needed.

The Critical Third Slash: That / after the port is super important! It marks where the host information ends and where the web server takes over. Everything before this slash is handled by TCP connection, everything after is the web server's job.

Path (/dashboard/reports): This can be a file or directory. Here's a key insight I learned - everything is actually a file from the web server's perspective, but it's the server's job to figure out what to do with it.

Query (?year=2024&dept=sales): These are key-value pairs separated by &. The ? marks the end of the path and beginning of query parameters.

Fragment (#summary): Here's something cool - this part never gets sent to the server! It stays on the client side only. Perfect example: when you click a table of contents link on a webpage and it jumps to a section, that's the fragment working with the element's ID.

URL Parsing Process

Let me show you what happens when Mamad enters a URL:

Loading diagram...

The Attack Potential (Security Alert!)

Now here's where things get really interesting from a security perspective. Check out this perfectly valid URL according to URL syntax rules:

http://http://http://@http://http://?http://#http://

This blew my mind! This is an example of URL confusion attacks. Attackers use these kinds of malformed but technically valid URLs to:

  • Bypass URL filters
  • Confuse parsing logic
  • Trick users about where they're actually going
  • Exploit differences in how different parsers handle URLs

HTTP: The Language of the Web

Once the browser parses the URL, it needs to communicate with the web server. That's where HTTP comes in - and man, there's so much more to it than I initially thought!

The Two-Part Conversation

HTTP communication is like a structured conversation:

  • Request Message: What our browser builds and sends
  • Response Message: What we get back from the server

Let me show you what this looks like:

Loading diagram...

Request Line: The Opening Statement

The request line follows this exact structure:

Method SP Request-URL SP HTTP-Version CRLF

Let me break this down with Mamad's dashboard request:

HTTP
1GET /dashboard/reports?year=2024&dept=sales HTTP/1.1

Method (GET): This is the HTTP verb telling the server what action to perform. Common ones include:

  • GET: Retrieve data
  • POST: Send data to create something
  • DELETE: Remove a resource
  • HEAD: Same as GET but only return headers (no body)

SP (Space): The separator defined by the protocol - ASCII character 32.

Request-URL: The path and query from our original URL.

HTTP-Version: Usually HTTP/1.1 or HTTP/2.

CRLF: ASCII 13 + 10 (carriage return + line feed) - this is how HTTP knows the line ended.

Status Line: The Server's Response

The server responds with a status line:

HTTP-Version SP Status-Code SP Reason-Phrase CRLF

Example:

HTTP
1HTTP/1.1 200 OK

The status codes are genius in their design:

  • 2xx: Success (like 200 OK)
  • 3xx: Redirection (like 301 Moved Permanently)
  • 4xx: Client error (like 404 Not Found)
  • 5xx: Server error (like 500 Internal Server Error)

The first digit tells you the category immediately!

Headers: The Metadata Magic

Headers are additional information sent with requests and responses. They follow this structure:

field-name ":" [field-value] CRLF

Here's something crucial I learned: headers and body are separated by a blank line (CRLF CRLF). This double line break is universal across HTTP - it's how parsers know "headers are done, body starts now."

Let me show you some essential headers with examples:

HTTP
1GET /dashboard/reports HTTP/1.1 2Host: company.internal:8080 3User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 4Referer: https://company.internal:8080/dashboard/ 5Cookie: session_id=abc123; user_pref=dark_mode 6Content-Length: 0

HOST: Not optional! Specifies the server host. This enables virtual hosting - multiple websites on one server.

Referer: Shows where Mamad came from (the previous page).

User-Agent: Identifies Mamad's browser and system.

Cookie: Sends stored cookies from browser to server.

Content-Length: Size of the request/response body in bytes.

For responses, you might see:

HTTP
1HTTP/1.1 200 OK 2Content-Type: text/html; charset=utf-8 3Set-Cookie: new_session=xyz789; HttpOnly; Secure 4Location: https://company.internal:8080/dashboard/reports/2024 5Content-Length: 1234

Content-Type: Tells the browser what kind of data this is.

Set-Cookie: Server telling browser to store a cookie.

Location: Used for redirects - tells browser where to go next.

Complete HTTP Transaction Example

Let me put it all together with Mamad's dashboard access:

Loading diagram...

The Security Implications

Here's what really opened my eyes - HTTP headers can be attack vectors:

Header Injection: If user input isn't properly sanitized, attackers can inject malicious headers.

Host Header Attacks: Manipulating the Host header can lead to cache poisoning or password reset poisoning.

User-Agent Spoofing: Attackers can impersonate different browsers or systems.

Cookie Security: Cookies without HttpOnly and Secure flags are vulnerable to XSS and man-in-the-middle attacks.

Practical Examples and Code

Let me show you how to work with URLs and HTTP in different contexts:

JavaScript URL Manipulation

JAVASCRIPT
1// Parse a URL 2const url = new URL('https://mamad:secret@company.internal:8080/dashboard?year=2024#summary'); 3 4console.log(url.protocol); // 'https:' 5console.log(url.username); // 'mamad' 6console.log(url.password); // 'secret' 7console.log(url.hostname); // 'company.internal' 8console.log(url.port); // '8080' 9console.log(url.pathname); // '/dashboard' 10console.log(url.search); // '?year=2024' 11console.log(url.hash); // '#summary' 12 13// Modify query parameters 14url.searchParams.set('dept', 'sales'); 15url.searchParams.append('active', 'true'); 16console.log(url.toString()); // Updated URL with new parameters

HTTP Request with Headers (Python)

PYTHON
1import requests 2 3# Mamad's dashboard request 4url = 'https://company.internal:8080/dashboard/reports' 5headers = { 6 'User-Agent': 'MyApp/1.0', 7 'Accept': 'application/json', 8 'Cookie': 'session_id=abc123' 9} 10params = { 11 'year': '2024', 12 'dept': 'sales' 13} 14 15response = requests.get(url, headers=headers, params=params) 16 17print(f"Status Code: {response.status_code}") 18print(f"Headers: {response.headers}") 19print(f"Content: {response.text}")

Building HTTP Requests Manually

PYTHON
1# Raw HTTP request construction 2def build_http_request(method, path, host, headers=None, body=None): 3 request_line = f"{method} {path} HTTP/1.1\r\n" 4 5 # Host header is required 6 host_header = f"Host: {host}\r\n" 7 8 # Add custom headers 9 header_lines = "" 10 if headers: 11 for name, value in headers.items(): 12 header_lines += f"{name}: {value}\r\n" 13 14 # Content-Length for body 15 content_length = "" 16 if body: 17 content_length = f"Content-Length: {len(body)}\r\n" 18 19 # Blank line separates headers from body 20 blank_line = "\r\n" 21 22 # Construct full request 23 request = request_line + host_header + header_lines + content_length + blank_line 24 25 if body: 26 request += body 27 28 return request 29 30# Example usage 31http_request = build_http_request( 32 method="GET", 33 path="/dashboard/reports?year=2024", 34 host="company.internal:8080", 35 headers={ 36 "User-Agent": "CustomClient/1.0", 37 "Accept": "text/html" 38 } 39) 40 41print(http_request)

Security Considerations Throughout

As I learned about URLs and HTTP, the security implications became crystal clear:

URL Security Issues

  • Open Redirects: Malicious URLs that redirect to attacker sites
  • SSRF (Server-Side Request Forgery): Tricking servers into making requests to internal systems
  • URL Confusion: Using malformed URLs to bypass filters

HTTP Security Headers

HTTP
1Strict-Transport-Security: max-age=31536000; includeSubDomains 2Content-Security-Policy: default-src 'self' 3X-Frame-Options: DENY 4X-Content-Type-Options: nosniff

Best Practices I Learned

  1. Always validate and sanitize URL inputs
  2. Use HTTPS everywhere
  3. Implement proper authentication (not URL-based)
  4. Set secure cookie flags
  5. Validate all headers on the server side
  6. Use Content Security Policy headers

Quick Reference Guide

Here's my cheat sheet for URLs and HTTP:

URL Components

<schema>://<user>:<password>@<host>:<port>/<path>?<query>#<frag>

Common HTTP Methods

  • GET: Retrieve data
  • POST: Create/submit data
  • PUT: Update/replace data
  • DELETE: Remove data
  • HEAD: Get headers only
  • OPTIONS: Get available methods

HTTP Status Code Categories

  • 1xx: Informational
  • 2xx: Success
  • 3xx: Redirection
  • 4xx: Client Error
  • 5xx: Server Error

Essential Headers

  • Host: Target server (required)
  • User-Agent: Client identification
  • Content-Type: Data format
  • Content-Length: Body size
  • Cookie: Client-stored data
  • Authorization: Authentication info

HTTP Message Structure

Request/Status Line
Header: value
Another-Header: value
[blank line]
Optional body content

Wrapping Up

This deep dive into URLs and HTTP really opened my eyes to how much complexity lies beneath every web request. What looks like a simple click or page load involves intricate parsing, structured communication, and multiple security considerations.

The key takeaways for me were:

  • URLs are far more complex than they appear on the surface
  • HTTP is a beautifully structured protocol with clear rules
  • Security considerations are embedded throughout both concepts
  • Understanding these fundamentals is crucial for both development and security

Next time you type a URL or see an HTTP request, you'll know exactly what's happening under the hood! In my next post, I'll be diving into how servers actually process these requests and the magic that happens on the backend.

What did you find most surprising about URLs and HTTP? I'd love to hear your thoughts!

Understanding URLs and HTTP: My Deep Dive into Web Communication