{"id":"fb7d1caf5992c486","repo":"gofiber/fiber","slug":"session-absolutetimeout-must-be-greater-than-or","errorCode":null,"errorMessage":"[session] AbsoluteTimeout must be greater than or equal to IdleTimeout","messagePattern":"\\[session\\] AbsoluteTimeout must be greater than or equal to IdleTimeout","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"middleware/session/config.go","lineNumber":147,"sourceCode":"//\tcfg := configDefault()\n//\tcfg := configDefault(customConfig)\nfunc configDefault(config ...Config) Config {\n\t// Return default config if nothing provided\n\tif len(config) < 1 {\n\t\treturn ConfigDefault\n\t}\n\n\t// Override default config\n\tcfg := config[0]\n\n\t// Set default values\n\tif cfg.IdleTimeout <= 0 {\n\t\tcfg.IdleTimeout = ConfigDefault.IdleTimeout\n\t}\n\n\t// Ensure AbsoluteTimeout is greater than or equal to IdleTimeout.\n\tif cfg.AbsoluteTimeout > 0 && cfg.AbsoluteTimeout < cfg.IdleTimeout {\n\t\tpanic(\"[session] AbsoluteTimeout must be greater than or equal to IdleTimeout\")\n\t}\n\n\t// Check if we have a zero-value Extractor\n\tif cfg.Extractor.Extract == nil {\n\t\tcfg.Extractor = ConfigDefault.Extractor\n\t}\n\n\tif cfg.KeyGenerator == nil {\n\t\tcfg.KeyGenerator = ConfigDefault.KeyGenerator\n\t}\n\n\tif cfg.CookieSameSite == \"\" {\n\t\tcfg.CookieSameSite = ConfigDefault.CookieSameSite\n\t}\n\n\treturn cfg\n}\n","sourceCodeStart":129,"sourceCodeEnd":165,"githubUrl":"https://github.com/gofiber/fiber/blob/9a4c7e57fe0b080a04235d28a4b0d2b4b353d58c/middleware/session/config.go#L129-L165","documentation":"The session middleware enforces that AbsoluteTimeout (the hard session lifetime cap) is not shorter than IdleTimeout (the inactivity window). If AbsoluteTimeout is set (>0) but less than IdleTimeout, configDefault() panics, because sessions would be killed by the absolute limit before an idle expiry could ever occur, making IdleTimeout meaningless.","triggerScenarios":"Calling session.New() with a Config where AbsoluteTimeout is set to a value smaller than IdleTimeout, e.g. AbsoluteTimeout: 5*time.Minute with the default IdleTimeout of 30*time.Minute.","commonSituations":"Setting AbsoluteTimeout from one config source and IdleTimeout from another, with values that cross. Reducing AbsoluteTimeout during testing without adjusting IdleTimeout. Misunderstanding which value must be larger.","solutions":["Ensure AbsoluteTimeout >= IdleTimeout (or leave AbsoluteTimeout at 0 for no absolute cap).","Derive AbsoluteTimeout from IdleTimeout in code, e.g. AbsoluteTimeout: idleTimeout * 2.","Validate the relationship in a config-loading helper before constructing the middleware."],"exampleFix":"// before\napp.Use(session.New(session.Config{\n    Store:           store,\n    IdleTimeout:     30 * time.Minute,\n    AbsoluteTimeout: 5 * time.Minute,\n}))\n// after\napp.Use(session.New(session.Config{\n    Store:           store,\n    IdleTimeout:     30 * time.Minute,\n    AbsoluteTimeout: 2 * time.Hour,\n}))","handlingStrategy":"validation","validationCode":"if cfg.AbsoluteTimeout > 0 && cfg.AbsoluteTimeout < cfg.IdleTimeout {\n    log.Fatalf(\"session: AbsoluteTimeout (%s) must be >= IdleTimeout (%s)\", cfg.AbsoluteTimeout, cfg.IdleTimeout)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Derive AbsoluteTimeout from IdleTimeout in code (e.g. idle * 4) so the relationship can't invert.","Validate timeout pairs in a config-loading helper shared across environments."],"tags":["session","config","timeout","panic"],"analyzedSha":"9a4c7e57fe0b080a04235d28a4b0d2b4b353d58c","analyzedAt":"2026-08-04T21:44:03.395Z","schemaVersion":2}