<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Owali Ullah Shawon</title>
    <description>The latest articles on DEV Community by Owali Ullah Shawon (@owalishawon).</description>
    <link>https://dev.to/owalishawon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F771155%2Fea759b41-40d8-4bd7-b813-611b99a74bc6.jpg</url>
      <title>DEV Community: Owali Ullah Shawon</title>
      <link>https://dev.to/owalishawon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/owalishawon"/>
    <language>en</language>
    <item>
      <title>Secure Your Node.js API Like a Bank Vault</title>
      <dc:creator>Owali Ullah Shawon</dc:creator>
      <pubDate>Fri, 16 May 2025 10:41:18 +0000</pubDate>
      <link>https://dev.to/owalishawon/secure-your-nodejs-api-like-a-bank-vault-4d8b</link>
      <guid>https://dev.to/owalishawon/secure-your-nodejs-api-like-a-bank-vault-4d8b</guid>
      <description>&lt;p&gt;In the world of web development, building a Node.js API is the easy part. Keeping it safe? That’s where the real challenge begins.&lt;/p&gt;

&lt;p&gt;Think of your API as a digital bank vault — holding sensitive data, guarding against intruders, and expected to run 24/7 without a hitch. But without the right security layers, that vault is just a fancy box waiting to be cracked open.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;🛡️ 1. Use Helmet.js — Your First Line of Defense&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You wouldn't leave your front door unlocked. Helmet.js is the digital equivalent of installing a high-end security system on your Node.js server.&lt;/p&gt;

&lt;p&gt;Add it to your app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const helmet = require('helmet');
app.use(helmet());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Helmet sets various HTTP headers to protect against common vulnerabilities like Cross-Site Scripting (XSS), clickjacking, and more.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;🚧 2. Rate Limiting — Keep the Bots at Bay&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You don’t want someone trying to brute-force your API with thousands of requests per second. That’s where rate limiting comes in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install express-rate-limit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add a rate limiter middleware:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 100, // limit each IP to 100 requests per window
});

app.use(limiter);

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Why it matters:&lt;/strong&gt; Stops DDoS attempts, brute-force logins, and API abuse in their tracks.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;🌐 3. CORS — Lock Down Who Can Talk to You&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;CORS (Cross-Origin Resource Sharing) determines who can interact with your API from the browser. A poorly configured CORS policy is an open invitation to attackers.&lt;/p&gt;

&lt;p&gt;Instead of this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app.use(cors()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const corsOptions = {
  origin: ['&amp;lt;https://yourfrontend.com&amp;gt;'],
  methods: ['GET', 'POST'],
  credentials: true,
};

app.use(cors(corsOptions));Only allow trusted domains and HTTP methods.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  &lt;strong&gt;🔐 4. Authentication — Say No to DIY Tokens&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Rolling your own authentication is like designing your lock and assuming no one will pick it. Use industry-standard solutions like JWT (JSON Web Tokens) or OAuth2.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;JWT Example:&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const jwt = require('jsonwebtoken');

const token = jwt.sign({ userId: 123 }, 'your-secret-key', { expiresIn: '1h' });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On protected routes, verify the token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const decoded = jwt.verify(token, 'your-secret-key')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Best practice:&lt;/strong&gt; Store secrets securely using .env files and rotate them regularly.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;🧼 5. Input Sanitization — Don’t Let Hackers Slip In&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Every piece of user input is a potential Trojan horse. SQL injections, XSS attacks, and script injections all start with unchecked input.&lt;/p&gt;

&lt;p&gt;Use libraries like xss-clean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install xss-clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And add it as middleware:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const xss = require('xss-clean');
app.use(xss());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, validate inputs using packages like express-validator or Joi to enforce strong typing and format.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Rule of thumb:&lt;/strong&gt; Trust nothing, validate everything.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;🧾 Final Thoughts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Securing your Node.js API isn't just a checkbox — it’s a mindset. Like any high-value target, your backend must be protected with layers of defense. Think of it like a bank vault: steel doors, motion sensors, keycards, and armed guards all working together.&lt;/p&gt;

&lt;p&gt;Here’s your quick checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Helmet for HTTP header security&lt;/li&gt;
&lt;li&gt;✅ Rate limiting to block API abuse&lt;/li&gt;
&lt;li&gt;✅ Strict CORS policies&lt;/li&gt;
&lt;li&gt;✅ Standardized auth with JWT/OAuth2&lt;/li&gt;
&lt;li&gt;✅ Input sanitization and validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lock it down now — before someone else finds the door.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want more security tips?&lt;/strong&gt; Comment or connect with me on &lt;a href="https://github.com/OwaliShawon" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub,&lt;/strong&gt;&lt;/a&gt; let’s build safer APIs together.&lt;/p&gt;

</description>
      <category>node</category>
      <category>security</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>localtunnel vs ngrok</title>
      <dc:creator>Owali Ullah Shawon</dc:creator>
      <pubDate>Wed, 07 May 2025 06:43:09 +0000</pubDate>
      <link>https://dev.to/owalishawon/localtunnel-vs-ngrok-2p38</link>
      <guid>https://dev.to/owalishawon/localtunnel-vs-ngrok-2p38</guid>
      <description>&lt;p&gt;সম্প্রতি, আমি এমন কিছু ডেভেলপমেন্ট কাজ করেছি যেখানে আমার লোকালহোস্টকে বাইরের দুনিয়ার জন্য HTTPS সাইট হিসেবে উন্মুক্ত করা প্রয়োজন হয়েছিল। এটি শুধু সাময়িক এবং ডেভেলপমেন্টের স্বার্থেই ছিল। &lt;/p&gt;

&lt;p&gt;এই প্রক্রিয়াটি শেখার সময় আমি দুটি খুব সহজ ও উপকারী টুল সম্পর্কে জানতে পারি: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ngrok&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;localtunnel&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;এই দুই অ্যাপ্লিকেশন মূলত একই কাজ করে, তবে কিছু উল্লেখযোগ্য পার্থক্য রয়েছে।&lt;/p&gt;

&lt;p&gt;আমাদের প্রয়োজনে, এই দুটি টুলই ব্যবহারযোগ্য। তবে (ফ্রি ভার্সনে) দুটি প্রধান পার্থক্য আছে:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ngrok&lt;/strong&gt; অনেক বেশি স্থিতিশীল। আমি এটি দিনের পর দিন চালিয়ে রেখেছিলাম কোনো সমস্যা ছাড়াই। এটি দীর্ঘ সময় ধরে ডেভেলপমেন্ট চলার সময় খুবই সুবিধাজনক, কারণ আপনাকে বারবার এটি পরীক্ষা করতে হয় না।&lt;/p&gt;

&lt;p&gt;তবে, আপনি যদি প্রতি বছর অন্তত $60 না দেন, তাহলে আপনি একটি নির্দিষ্ট সাবডোমেইন ব্যবহার করতে পারবেন না। উদাহরণস্বরূপ, আপনি যদি প্রথমবার আপনার লোকালহোস্টের port 8000-এ URL ম্যাপ করেন, তাহলে আপনি পেতে পারেন:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://1bdb-45-248-148-177.ngrok-free.app -&amp;gt; localhost:8000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;কিন্তু, আপনি যদি এটি বন্ধ করে আবার চালু করেন, তাহলে সাবডোমেইনটি হবে ভিন্ন, যেমন:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://pPma78.ngrok-free.app -&amp;gt; localhost:8000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;আপনার ডেভেলপমেন্ট প্রক্রিয়ার অন্য কোনো অংশ যদি নির্দিষ্ট URL-এর ওপর নির্ভর করে, তাহলে এটি খুবই ঝামেলার হয়ে দাঁড়ায়। বিশেষ করে, যখন আমি একটি &lt;strong&gt;Slack App&lt;/strong&gt; ডেভেলপ করছিলাম, তখন আমাকে সেই URL যেসব জায়গায় ব্যবহার করা হয়েছে, যেমন Slack App-এ থাকা দুইটি URL, সব জায়গায় গিয়ে পরিবর্তন করতে হতো এবং নতুন URL দিয়ে পুনরায় ভেরিফিকেশন করতে হতো। এটি বেশ কষ্টকর।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;localtunnel&lt;/strong&gt; এই সাবডোমেইন পরিবর্তনের সমস্যাটি দূর করে দেয় কারণ এটি আপনাকে বিনামূল্যে নিজের পছন্দের সাবডোমেইন অনুরোধ করার সুযোগ দেয়। অর্থাৎ, আপনি যখনই লোকালহোস্টের কোনো port-এ টানেল চালু করবেন, সেটি সব সময় হতে পারে:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://shawon.loca.lt&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lt &lt;span class="nt"&gt;--port&lt;/span&gt; 3000 &lt;span class="nt"&gt;--subdomain&lt;/span&gt; shawon
your url is: &lt;span class="o"&gt;[&lt;/span&gt;https://shawon.loca.lt]&lt;span class="o"&gt;(&lt;/span&gt;https://shawon.loca.lt/&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;তবে, localtunnel ততটা স্থিতিশীল নয়। এটি প্রায়ই বন্ধ হয়ে যায়। তাই আপনাকে টার্মিনালটি নজরে রাখতে হয়। ভালো দিক হলো, এটি আবার চালু করতে এক মুহূর্তই লাগে এবং আপনাকে আর কিছু পরিবর্তন করতে হয় না।&lt;/p&gt;

</description>
      <category>tunnel</category>
      <category>http</category>
    </item>
  </channel>
</rss>
