using LiteNetLib; namespace ServerLib.Service; public class Session { public string? Token { get; set; } public string? Username { get; set; } public int HashKey { get; init; } public NetPeer Peer { get; set; } // 패킷 레이트 리미팅 private int packetCount; private long windowStartTicks; // 초당 허용 패킷 수 public int MaxPacketsPerSecond { get; set; } // 연속 초과 횟수 public int RateLimitViolations { get; private set; } // 패킷 수신 시 호출. 초당 제한 초과 시 true 반환. public bool CheckRateLimit() { long now = Environment.TickCount64; // 1초(1000ms) 윈도우 초과 시 리셋 if (now - windowStartTicks >= 1000) { windowStartTicks = now; packetCount = 0; } packetCount++; if (packetCount > MaxPacketsPerSecond) { RateLimitViolations++; return true; // 제한 초과 } return false; } // 위반 카운트 초기화 public void ResetViolations() { RateLimitViolations = 0; } public Session(int hashKey, NetPeer peer, int maxPacketsPerSecond = 60) { HashKey = hashKey; Peer = peer; Token = null; MaxPacketsPerSecond = maxPacketsPerSecond; packetCount = 0; windowStartTicks = Environment.TickCount64; RateLimitViolations = 0; } }