diff --git a/nginx.conf b/nginx.conf index 9f7e5e32..a986996a 100644 --- a/nginx.conf +++ b/nginx.conf @@ -38,6 +38,10 @@ server { proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; proxy_read_timeout 3600s; + + proxy_set_header X-Real-IP $remote_addr; # X-Real-IP 헤더로 실제 IP 전달 + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # X-Forwarded-For 헤더로 실제 IP 전달 + proxy_set_header X-Forwarded-Proto $scheme; # 클라이언트의 프로토콜 전달 } # WebSocket 요청 프록시 @@ -50,5 +54,9 @@ server { proxy_cache_bypass $http_upgrade; proxy_read_timeout 3600s; proxy_send_timeout 3600s; + + proxy_set_header X-Real-IP $remote_addr; # X-Real-IP 헤더로 실제 IP 전달 + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # X-Forwarded-For 헤더로 실제 IP 전달 + proxy_set_header X-Forwarded-Proto $scheme; # 클라이언트의 프로토콜 전달 } } \ No newline at end of file diff --git a/server/src/chat/chat.gateway.ts b/server/src/chat/chat.gateway.ts index 045b98f6..6fae33af 100644 --- a/server/src/chat/chat.gateway.ts +++ b/server/src/chat/chat.gateway.ts @@ -103,7 +103,7 @@ export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect { if (this.dayInit) { this.dayInit = false; - this.emitMidnightMessage(); + await this.emitMidnightMessage(); } this.server.emit('message', broadcastPayload); diff --git a/server/src/common/logger/logger.interceptor.ts b/server/src/common/logger/logger.interceptor.ts index 1c37c209..301b772c 100644 --- a/server/src/common/logger/logger.interceptor.ts +++ b/server/src/common/logger/logger.interceptor.ts @@ -6,6 +6,7 @@ import { } from '@nestjs/common'; import { finalize } from 'rxjs'; import { WinstonLoggerService } from './logger.service'; +import { Request } from 'express'; @Injectable() export class LoggingInterceptor implements NestInterceptor { @@ -18,11 +19,7 @@ export class LoggingInterceptor implements NestInterceptor { if (!url.includes('register') && !url.includes('login')) { this.logger.log( JSON.stringify({ - host: - request.headers['x-forwarded-for'] || - request.headers['CF-Connecting-IP'] || - request.socket?.remoteAddress || - 'unknown', + host: this.getIp(request), method: request.method, url: request.url, body: request.body, @@ -39,4 +36,15 @@ export class LoggingInterceptor implements NestInterceptor { }), ); } + + private getIp(request: Request) { + const forwardedFor = request.headers['x-forwarded-for']; + + if (typeof forwardedFor === 'string') { + const forwardedIps = forwardedFor.split(','); + return forwardedIps[0].trim(); + } + + return request.socket.remoteAddress; + } } diff --git a/server/src/feed/feed.service.ts b/server/src/feed/feed.service.ts index 90fcc131..bef982b7 100644 --- a/server/src/feed/feed.service.ts +++ b/server/src/feed/feed.service.ts @@ -132,11 +132,7 @@ export class FeedService { response: Response, ) { const cookie = request.headers.cookie; - const ip = - request.headers['CF-Connecting-IP'] || - request.headers['x-forwarded-for'] || - request.socket?.remoteAddress || - 'unknown'; + const ip = this.getIp(request); if (ip && this.isString(ip)) { const redis = this.redisService.redisClient; const [feed, hasCookie, hasIpFlag] = await Promise.all([ @@ -219,4 +215,15 @@ export class FeedService { return dateNext.getTime() - dateCurrent.getTime(); }); } + + private getIp(request: Request) { + const forwardedFor = request.headers['x-forwarded-for']; + + if (typeof forwardedFor === 'string') { + const forwardedIps = forwardedFor.split(','); + return forwardedIps[0].trim(); + } + + return request.socket.remoteAddress; + } }