Secure sessions with Node.js, Express.js, and NginX as an SSL Proxy
| Secure sessions are easy, but not very well documented. |
| Here's a recipe for secure sessions in Node.js when NginX is used as an SSL proxy: |
|
|
| The desired configuration for using NginX as an SSL proxy is to offload SSL processing |
| and to put a hardened web server in front of your Node.js application, like: |
|
|
| [NODE.JS APP] <- HTTP -> [NginX] <- HTTPS -> [PUBLIC INTERNET] <-> [CLIENT] |
|
|
| Edit for express 4.X and >: Express no longer uses Connect as its middleware framework, it implements its own now. |
|
|
| To do this, here's what you need to do: |
| // 1. In your main App, setup up sessions: |
|
|
| app.enable('trust proxy'); |
| app.use(express.bodyParser()); |
| app.use(express.cookieParser()); |
| app.use(express.session({ |
| secret: 'Super Secret Password', |
| proxy: true, |
| key: 'session.sid', |
| cookie: {secure: true}, |
| //NEVER use in-memory store for production - I'm using mongoose/mongodb here |
| store: new sessionStore() |
| })); |
| # 2. Configure nginx to do SSL and forward all the required headers that COnnect needs to do secure sessions: |
|
|
| server { |
| listen 443; |
| server_name localhost; |
| ssl on; |
| ssl_certificate /etc/nginx/nodeapp.crt; |
| ssl_certificate_key /etc/nginx/nodeapp.key; |
| ssl_session_timeout 5m; |
| ssl_protocols SSLv2 SSLv3 TLSv1; |
| ssl_ciphers HIGH:!aNULL:!MD5; |
| ssl_prefer_server_ciphers on; |
|
|
| location / { |
| # THESE ARE IMPORTANT |
| proxy_set_header X-Real-IP $remote_addr; |
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| # This is what tells Connect that your session can be considered secure, |
| # even though the protocol node.js sees is only HTTP: |
| proxy_set_header X-Forwarded-Proto $scheme; |
| proxy_set_header Host $http_host; |
| proxy_set_header X-NginX-Proxy true; |
| proxy_read_timeout 5m; |
| proxy_connect_timeout 5m; |
| proxy_pass http://nodeserver; |
| proxy_redirect off; |
| } |
| } |
ref: https://gist.github.com/nikmartin/5902176