Почему Django добавляет 1 секунду к времени жизни cookie?
Я пытаюсь реализовать JWT-аутентификацию, используя django-graphql-jwt на бэкенде и nuxt3 на фронтенде. Мой токен и refresh_token хранятся в куках, и я обернул GraphQLView в декоратор jwt_cookie, который автоматически проверяет наличие jwt-токена в куке, а также его валидность. В общем, все работает отлично. Когда я отправляю запрос на авторизацию, бэкенд возвращает мне заголовки "Set-Cookie" для JWT и JWT_REFRESH_TOKEN с датой истечения срока действия, что автоматически удаляет их, как только они становятся недействительными, что экономит мне много кода/логики на фронтенде.
Однако есть один очень неприятный момент - Django зачем-то добавляет 1 секунду к времени жизни куки в функции set_cookie, и это все портит. Вот код Django:
def set_cookie(
self,
key,
value="",
max_age=None,
expires=None,
path="/",
domain=None,
secure=False,
httponly=False,
samesite=None,
):
self.cookies[key] = value
if expires is not None:
if isinstance(expires, datetime.datetime):
if timezone.is_naive(expires):
expires = timezone.make_aware(expires, datetime.timezone.utc)
delta = expires - datetime.datetime.now(tz=datetime.timezone.utc)
# Add one second so the date matches exactly (a fraction of
# time gets lost between converting to a timedelta and
# then the date string).
# Here's what I mean ↓↓↓
delta += datetime.timedelta(seconds=1)
# Just set max_age - the max_age logic will set expires.
expires = None
if max_age is not None:
raise ValueError("'expires' and 'max_age' can't be used together.")
max_age = max(0, delta.days * 86400 + delta.seconds)
else:
self.cookies[key]["expires"] = expires
else:
...
Я вижу комментарий от Django, но я все еще не понимаю, что он означает.
Возможно, это не критичная проблема, но я просто не могу понять, зачем они это сделали. В результате такого поведения в течение 1 секунды после истечения срока действия токена он все еще находится в куках пользователя, и это не кажется мне правильным. Я могу решить эту проблему, вычитая 1 секунду при создании cookies, но это кажется огромной занозой в заднице, и я хотел бы избежать непредсказуемых ошибок, которые могут возникнуть из-за этого нововведения.
Буду признателен за ваши ответы и объяснения :)