முக்கிய விஷயங்கள்
- Website, admin panel, college ERP மாதிரி App-க்கு Server Session + HttpOnly cookie தான் பெருசா சரி.
- Public API, Android, React Native-க்கு short Access Token. JWT-ஐ localStorage-ல போடாதீங்க.
- JWT signed தான், secret இல்ல. Payload-ஐ யார் வேணாலும் படிக்கலாம்.
- Google OAuth identity prove பண்ணும். அப்புறமும் உங்க Session நீங்களே start பண்ணணும்.
- Password-க்கு Argon2id. MD5 வேண்டாம். Plain SHA-256-ம் வேண்டாம்.
- Access Token சில நிமிஷம். Refresh Token rotate பண்ணுங்க. இல்லனா Session-யே போதும்.
Authentication அப்படின்னா என்ன?
Website, admin panel, college ERP மாதிரி App-க்கு Server Session + HttpOnly cookie தான் பெருசா சரி; public API, Android, React Native-க்கு short Access Token தான். இந்த article-ல Session, JWT, Google OAuth மூணையும் எப்போ எது போடணும், JWT-ஐ localStorage-ல வைக்கக் கூடாத காரணம், OAuth identity prove பண்ணிட்டாலும் session நீங்களே start பண்ணணும், password-க்கு Argon2id, Access Token சில நிமிஷம் — hostel project-ல token copy பண்ணி admin ஆன பாடத்தோட சொல்றோம்.
Session, JWT, Google button — இதெல்லாம் identity-க்கு proof தான். அடுத்த கதவு Authorization. அதாவது இந்த User /admin திறக்கலாமா, இல்ல /orders மட்டும்தானா. Panel-ல இந்த ரெண்டு word-ஐயும் கலந்து சொன்னா interviewer note எடுக்குறத நிறுத்திடுவார்.
Campus interview-ல இத முதல்ல கேப்பாங்க. காரணம் எளிசு. YouTube video follow பண்ணினீங்களா, இல்ல ஒரு உண்மையான App ship பண்ணினீங்களான்னு இங்கே தெரியும்.
Session-ஆ Token-ஆ உங்க App-க்கு எது?
T. Nagar பக்கத்துல ஒரு சின்ன hotel நினைச்சு பாருங்க. Session Login அதாவது front desk diary. Password சரின்னா Server "user 42 உள்ள வந்துட்டாரு"னு எழுதி வைக்கும். Browser-க்கு ஒரு random Session id Cookie-ல போகும். ஒவ்வொரு Request-லும் Browser அந்த Cookie-ஐ அனுப்பும். Server diary திறந்து பார்க்கும். வெளியே தள்ளணுமா? அந்த row-ஐ delete பண்ணுங்க. முடிஞ்சது.
Token வேற மாதிரி. Guest pocket-ல ஒரு laminated pass. Kitchen desk-ஐ call பண்ணாது. Pass-ஐ படிச்சுட்டு வேலை நடக்கும். Android, Web, partner API எல்லாம் ஒரே Server-ஐ அடிக்கும்போது இது handy. Stolen pass-ஐ இப்போவே கொல்லணும்னா தான் கஷ்டம்.
College ERP, Flipkart மாதிரி catalogue, internal dashboard — இதெல்லாத்துக்கும் Server Session போதும். Cookie HttpOnly, Secure, SameSite ஆ இருக்கணும். Public API அல்லது React Native-ன்னா short Token கொடுங்க.
JWT-ஐ localStorage-ல போடுறது modern இல்ல. XSS வந்தா room key-யே எடுத்துட்டு போயிடும். HttpOnly இருக்கிறது JavaScript-ஆல Cookie-ஐ தூக்க முடியாதுனு.
import express from "express";
import session from "express-session";
const app = express();
app.use(session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: true,
secure: process.env.NODE_ENV === "production",
sameSite: "lax",
maxAge: 1000 * 60 * 60 * 8
}
}));
app.post("/login", async function (req, res) {
req.session.userId = 42;
res.json({ ok: true });
});Essay படிக்க பிடிக்கலன்னா இந்த மூணு வரி போதும். Website, admin panel-க்கு Session + Cookie. User-ஐ வெளியே தள்ளணும்னா session row delete. API, mobile-க்கு JWT Access Token — revoke கஷ்டம், blocklist வைக்காட்டி முடியாது. Google OAuth social button மட்டும். அப்புறமும் Session உங்க கையில தான்.
JWT உள்ளே என்ன இருக்கு?
மூணு Base64 துண்டு. நடுவுல dot. Header, payload, signature. ஒன்னு jwt.io-ல paste பண்ணுங்க. Payload தெரியும். அதாவது JWT lock பண்ணி வைக்கல. Sign பண்ணி வைச்சிருக்கோம். யாரும் படிக்கலாம். மாத்தி அனுப்பினா signature உடையும் — அந்த check தான் காப்பாற்றும்.
உதாரணமாக, payload-ல role: admin போட்டு edit பண்ணி அனுப்பினா, signature verify பண்ணாத Server அதை நம்பிடும். Password, Aadhaar, card number JWT-ல போடாதீங்க. படிக்கறது யாருக்கு வேணும்னாலும் சுலபம்.
இன்னொரு பயம். Token already வெளியே போனா, expiry வரைக்கும் நம்புற மாதிரி இருக்கும். Server-ல diary இல்ல. அதனால Access Token-ஐ 15 நிமிஷம் மாதிரி குறைவா வைங்க. Secret-ஐ Git-ல போடாதீங்க. Verify-ஐ உங்களே decode பண்ணி skip பண்ணாதீங்க. Library கொடுக்குற jwtVerify வழியே போங்க.
import { SignJWT, jwtVerify } from "jose";
const secret = new TextEncoder().encode(process.env.JWT_SECRET);
const token = await new SignJWT({ sub: "42", role: "user" })
.setProtectedHeader({ alg: "HS256" })
.setIssuedAt()
.setExpirationTime("15m")
.sign(secret);
const { payload } = await jwtVerify(token, secret);
console.log(payload.sub);jose மாதிரி maintained library use பண்ணுங்க. Unsigned Token-ஐ ஏற்காதீங்க. Algorithm-ஐ Client சொன்னத நம்பாதீங்க. Server-ல நீங்க fix பண்ணின algorithm மட்டும்.
Google-ல Login எப்படி பண்ணலாம்?
OAuth அப்படின்னா, Password உங்ககிட்ட கேட்காம Google-கிட்டே கேட்டு identity confirm பண்றது. User Google-ல already Login ஆயிருப்பார். உங்க App-க்கு ஒரு permission screen. Approve பண்ணினா Google ஒரு code தரும். அதை Server-லயே Token-ஆ மாத்தி, email / sub வாங்குங்க.
இங்கே பலர் செய்யற தப்பு: Google சொன்னா போதும்னு நினைச்சு, உங்க App-ல Session வைக்காம Browser-லயே Google Token-ஐ வைச்சுக்கிறது. Google Token உங்க Authorization இல்ல. அது Google-க்கு proof. உங்க /orders, உங்க /admin — அதெல்லாம் உங்க Server தான் முடிவு பண்ணணும்.
Flow எளிசு. Button அழுத்தினா Google-க்கு அனுப்புங்க. Callback-ல code வாங்குங்க. Google user id-ஐ உங்க users table-ல கண்டறிஞ்சு, இல்லனா create பண்ணுங்க. அப்புறம் உங்க Session start பண்ணுங்க. GPay-ல UPI pin வேற, Phone lock வேற இல்லையா. அதே மாதிரி Google identity வேற, உங்க App session வேற.
app.get("/auth/google/callback", async function (req, res) {
const code = String(req.query.code || "");
const googleUser = await exchangeCodeForGoogleUser(code);
const userId = await findOrCreateUser(googleUser.sub, googleUser.email);
req.session.userId = userId;
res.redirect("/dashboard");
});exchangeCodeForGoogleUser-ஐ Client-ல போடாதீங்க. Client secret browser-ல போகக் கூடாது. Redirect URI-ஐ Google Cloud Console-ல exact-ஆ match ஆகணும். Localhost-க்கு ஒரு URI, production domain-க்கு வேற URI.
Password-ஐ எப்படி Hash பண்ணணும்?
User Password-ஐ Database-ல plain text-ல வைக்கிற App இன்னும் campus-ல சுத்துது. அது Login இல்ல, waiting room. Hash அப்படின்னா, Password-ஐ ஒரு one-way மாற்று. திருப்பி அதே Password கிடைக்காது. Login-ல User கொடுத்த Password-ஐ மறுபடி Hash பண்ணி, வைச்சிருக்கிற Hash-ோட compare பண்ணுவோம்.
MD5 வேண்டாம். Plain SHA-256-ம் வேண்டாம். அவை fast. Fast hash என்றாலே guess பண்றதுக்கும் fast. இப்போ Node-ல Argon2id தான் முதல் choice. bcrypt இன்னும் நிறைய production-ல இருக்கு, பழைய project-ல சரி. புது App எழுதுறீங்கன்னா Argon2id.
Salt library போட்டுடும். நீங்க manual-ஆ "1234" salt போடாதீங்க. Pepper வேணும்னா Server env-ல ஒரு secret வைங்க. Hash parameters-ஐ random-ஆ குறைக்காதீங்க. Default memory-cost-ஐ ஏற்கனவே நல்லா இருக்கு.
import argon2 from "argon2";
const hash = await argon2.hash(password, { type: argon2.argon2id });
const ok = await argon2.verify(hash, password);
if (!ok) {
throw new Error("invalid credentials");
}Error message-ல "இந்த email இல்ல"னு தனியே சொல்லாதீங்க. "invalid credentials" போதும். Timing-லயே email இருக்கா இல்லையான்னு கசிக்கக் கூடாது. Reset link-ஐயும் same response தான் காட்டுங்க.
Refresh Token வேணுமா?
Access Token-ஐ 15 நிமிஷம் வைச்சா, ஒவ்வொரு காபி break-க்கும் Login கேக்கும். அதனாலதான் Refresh Token பேசுறாங்க. அதாவது சின்ன pass முடிஞ்சா, பெரிய pass காட்டி புது சின்ன pass வாங்குறது.
இங்கேயும் hotel தான். Refresh Token-ஐ Browser JavaScript-க்கு காட்டாதீங்க. HttpOnly Cookie-லயோ, mobile-ல secure storage-லயோ. ஒவ்வொரு முறை use ஆகும்போதும் பழைய Refresh-ஐ invalid பண்ணி, புது Refresh கொடுங்க. இத தான் rotation. Steal ஆன Token மறுபடி வந்தா, family முழுக்க revoke பண்ணுங்க.
Website மட்டும்தானா? Refresh வேணாம். Server Session-யே போதும். 8 மணி நேரம் Cookie, Logout-ல destroy. Microservice, mobile, partner API இதெல்லாம் இருந்தா மட்டும் Access + rotating Refresh யோசிங்க. Refresh-ஐ database-ல hash பண்ணி வைங்க. Plain Token row-ல இருக்கக் கூடாது.
யார் எந்த mistake பண்ணி trouble-ல மாட்டுறாங்க?
முதல் தப்பு: JWT-ஐ localStorage-ல போட்டு, tutorial comment-ல "production ready"னு எழுதுறது. XSS ஒண்ணு போதும்.
ரெண்டாவது: Session id-ஐ URL-ல போடுறது. Referrer header-லயே id வெளியே போகும்.
மூணாவது: CORS-ல Access-Control-Allow-Origin: * போட்டு, credentials true. Cookie எல்லாருக்குமா?
நாலாவது: Logout UI மட்டும். Server-ல session destroy இல்ல, refresh list-லயும் இல்ல. Button அழகா இருக்கும். User இன்னும் உள்ள தான்.
ஐந்தாவது: Password Hash-ஐ SHA-256(password)னு எழுதி, "encrypt பண்ணிட்டோம்"னு viva-ல சொல்றது. Encrypt வேற, Hash வேற. Interviewer அங்கேயே நிறுத்துவார்.
ஆறாவது: JWT payload-ல permission 15 field. Token பெருசாகும். Revoke முடியாது. Role மாறினா பழைய Token-ல பழைய role.
நீங்க இப்போ என்ன பண்ணணும்?
Chennai, Bengaluru, Hyderabad-ல Web interview-ல முதல் சுத்து இது தான். Zoho, Freshworks, Flipkart, Swiggy மாதிரி product team-ல Session cookie, CSRF, SameSite, Token theft கேப்பாங்க. Service company-ல கூட "JWT vs Session" whiteboard வரும். IRCTC, GPay மாதிரி Login flow பார்த்து, எங்க Session, எங்க OAuthனு பிரிச்சு சொன்னா நீங்க tutorial-ஐ தாண்டினீங்கனு தெரியும்.
Practice task சின்னது. Express-ல ஒரு /login, ஒரு /me, ஒரு /logout எழுதுங்க. Login-ல Session Cookie. /me-ல userId இல்லன்னா 401. Logout-ல session destroy. அப்புறம் ஒரு JWT-ஐ jose-ல 15m expiry-ல போட்டு, jwt.io-ல payload படிங்க. Password field இல்லையான்னு பாருங்க. கடைசியா argon2id-ல ஒரு Password Hash பண்ணி, தப்பு Password கொடுத்து verify fail ஆகறத பாருங்க.
Website கட்டுறீங்கன்னா இன்றே Session + HttpOnly-ல நிறுத்துங்க. Mobile API வேணும்னா மட்டும் short Access Token. Google button வேணும்னா identity வாங்கி, உங்க Session-யே start பண்ணுங்க. இந்த மூணு வரி நினைவு இருந்தா, hostel demo-ல அந்த silence உங்க பக்கம் வராது.




கருத்துகள் (0)
Be the first to comment!