Unix laikspiedoli JWT un tokenu derīguma termiņam — kā tas darbojas

Ja kādreiz esat atkodējis JWT un redzējis kaut ko līdzīgu "exp": 1744070400, jūs esat sastapies ar Unix laikspiedoliem vienā no to visbiežākajiem praktiskajiem pielietojumiem. JSON Web Token derīguma termiņa sistēma ir pilnībā balstīta uz Unix laiku — un, kad saprotat, kā tā darbojas, tokenu problēmu atkļūdošana kļūst daudz vienkāršāka.

Unix laikspiedola pārveidotājs jebkuru neapstrādātu laikspiedola skaitli uzreiz pārvērš cilvēklasāmā datumā. Šis raksts skaidro, kā JWT prasības izmanto Unix laikspiedolus, kā aprēķināt derīguma termiņus un kur parasti rodas kļūdas.

Ko patiesībā nozīmē exp un iat

Atkodēta JWT payload izskatās apmēram šādi:

{
  "sub": "user_12345",
  "iat": 1743984000,
  "exp": 1744070400,
  "role": "admin"
}

Gan iat (issued at), gan exp (expiry) ir Unix laikspiedoli — sekunžu skaits kopš 1970. gada 1. janvāra 00:00:00 UTC. Tam nav nekā kopīga ar jūsu servera lokālo laika joslu; tas vienmēr ir balstīts uz UTC.

iat: 1743984000 nozīmē, ka tokens tika izsniegts tajā konkrētajā sekundē. exp: 1744070400 nozīmē, ka tokens kļūst nederīgs tajā sekundē. Starpība starp tiem — 86 400 sekundes — ir tokena atļautais derīguma ilgums. Šajā gadījumā tieši 24 stundas.

Lai pārbaudītu, kādam datumam šie laikspiedoli atbilst, ielīmējiet jebkuru no skaitļiem Unix laikspiedola pārveidotājā. 1743984000 atbilst 2026. gada 7. aprīlim 00:00:00 UTC. 1744070400 atbilst 2026. gada 8. aprīlim 00:00:00 UTC.

Kā tiek aprēķināts tokena derīguma ilgums

Loģika ir vienkārša. Kad serveris izsniedz tokenu, tas:

1. Iegūst pašreizējo Unix laikspiedolu (sauksim to par now) 2. Pieskaita vēlamo derīguma ilgumu sekundēs 3. Iestata šo summu kā exp prasību

Tokenam uz 1 stundu: exp = now + 3600 Tokenam uz 24 stundām: exp = now + 86400 Tokenam uz 7 dienām: exp = now + 604800 Tokenam uz 30 dienām: exp = now + 2592000

Kad klients iesniedz tokenu, serveris pārbauda, vai pašreizējais laikspiedols ir mazāks par exp. Ja current_time > exp, tokens tiek noraidīts kā beidzies.

Matemātika ir tikai veselo skaitļu aritmētika — bez laika joslu pārrēķiniem, bez kalendāra loģikas, bez mēnešu garuma robežgadījumiem. Tas ir viens no iemesliem, kāpēc Unix laikspiedoli tam labi der.

Bieži tokenu derīguma ilgumi pēc lietojuma

Tokena tipsTipisks derīguma ilgumsSekundes
Īslaicīgs piekļuves tokens15 minūtes900
Standarta piekļuves tokens1 stunda3 600
API piekļuves tokens24 stundas86 400
Atsvaidzināšanas tokens7 dienas604 800
Ilgstošs atsvaidzināšanas tokens30 dienas2 592 000
“Atcerēties mani” tokens90 dienas7 776 000
E-pasta apstiprinājuma saite24–72 stundas86 400–259 200
Paroles atiestatīšanas saite15–60 minūtes900–3 600

Paroles atiestatīšanas un e-pasta apstiprinājuma tokeniem jābūt īsiem — tie ir vienreizlietojami un sensitīvi. Atsvaidzināšanas tokeni var būt garāki, jo tie tiek glabāti droši un tos var atsaukt servera pusē.

Derīguma termiņa problēmu atkļūdošana

Ja tokens tiek noraidīts negaidīti, pirmais solis ir to atkodēt un pārbaudīt exp lauku. Lielākajai daļai JWT bibliotēku ir decode funkcija, kas nepārbauda parakstu — noderīgi apskatei, kad vēlaties vienkārši nolasīt prasības.

Kad jums ir exp vērtība, ielīmējiet to Unix laikspiedola pārveidotājā, lai iegūtu cilvēklasāmu derīguma beigu laiku. Salīdziniet to ar pašreizējo laiku. Ja tokens beidzās pirms trim stundām, ir skaidrs, ka problēma ir novecojis tokens. Ja derīguma termiņš ir nākotnē, bet tokens tomēr tiek noraidīts, problēma ir citur — paraksta neatbilstība, nepareiza audience prasība vai pulksteņa nobīde.

Pulksteņa nobīde ir bieža problēma sadalītās sistēmās. Ja izsniedzošā servera un pārbaudošā servera pulksteņi atšķiras par vairāk nekā dažām sekundēm, tokeni var tikt noraidīti kā beigušies, kad tā nav, vai pieņemti, kad tiem jau vajadzētu būt beigušiem. Lielākā daļa JWT bibliotēku ļauj nelielu nobīdes toleranci — parasti no 30 sekundēm līdz 5 minūtēm.

Šeit palīdz iat prasība. Ja iat ir nākotnē no pārbaudošā servera skatpunkta, izsniedzošā servera pulkstenis iet uz priekšu. Ja exp - iat neatbilst gaidītajam tokena derīguma ilgumam, izsniegšanas laikā kaut kas nogāja greizi.

Sekundes pret milisekundēm: bieža JWT kļūda

Unix laikspiedoli ir sekundēs. JavaScript Date.now() atgriež milisekundes. Šī neatbilstība izraisa kļūdas, kuras var būt grūti pamanīt.

Ja jūsu Node.js kods dara šādi:

const exp = Date.now() + 3600; // Nepareizi: Date.now() ir milisekundēs

Jūs esat iestatījis derīguma beigas aptuveni 1 milisekundi nākotnē (pašreizējās milisekundes + 3600 milisekundes = būtībā tagad). Tokens tiks noraidīts uzreiz.

Pareizā versija:

const exp = Math.floor(Date.now() / 1000) + 3600; // Pareizi: vispirms pārvērš uz sekundēm

13 ciparu skaitlis JWT exp laukā ir skaidra pazīme, ka nejauši izmantotas milisekundes. Standarta Unix laikspiedoli 2026. gadā ir 10 ciparu. Ja redzat exp: 1744070400000, tas atbilst kaut kam ap 57 000. gadu — skaidrs signāls, ka milisekundes ir nonākušas sekundēm paredzētajā laukā.

nbf prasība: “ne agrāk kā”

JWT atbalsta arī nbf (not before) prasību, arī Unix laikspiedolu. Tā nosaka agrāko laiku, kad tokens ir derīgs. Ja current_time < nbf, tokens tiek noraidīts pat tad, ja tas vēl nav beidzies.

Tas ir noderīgi tokeniem, kuriem jākļūst derīgiem tikai nākotnē — plānots piekļuves piešķīrums, laika ierobežota lejupielādes saite vai tokens, kas izdots pirms plānota notikuma. nbf un exp kombinācija nosaka precīzu derīguma logu.

Piemērs: `json { "nbf": 1744070400, "exp": 1744156800 } `

Šis tokens kļūst derīgs 2026. gada 8. aprīlī 00:00:00 UTC un beidzas 2026. gada 9. aprīlī 00:00:00 UTC — 24 stundu logs, kas sākas nākotnē.

Tokenu atsaukšana pirms derīguma beigām

Viens bezstāvokļa JWT dizaina ierobežojums ir tas, ka jūs nevarat atsaukt tokenu pirms tā exp laika, neuzturot servera puses stāvokli. Ja lietotājs izrakstās vai tokens tiek kompromitēts, tas tehniski paliek derīgs līdz termiņa beigām — ja vien neieviesīsiet bloķēšanas sarakstu.

Izplatītas pieejas:

  • Īslaicīgi piekļuves tokeni + atsvaidzināšanas tokeni: Turiet piekļuves tokenus īsus (15 minūtes), lai tie ātri beigtos. Atsauciet atsvaidzināšanas tokenus izrakstoties. Piekļuves tokens drīz beigsies pats.
  • Tokenu bloķēšanas saraksts: Glabājiet atsaukto tokenu ID (parasti jti prasību) servera pusē līdz brīdim, kad to exp paiet. Vairāk izmaksu, bet ļauj nekavējoties atsaukt.
  • Tokenu rotācija: Katram atsvaidzināšanas pieprasījumam izsniedziet jaunu piekļuves tokenu un padariet veco nederīgu.

Unix laikspiedols exp laukā ir derīguma ārējā robeža. Jūsu lietotnes loģika nosaka, vai tokens šajā logā patiesībā ir jāpieņem.

Praktiska tokena derīguma nolasīšana

Ja atkļūdojat API un vēlaties ātri pārbaudīt, vai tokens ir beidzies, jums nav vajadzīga pilna JWT bibliotēka. Atkodējiet payload (JWT vidējo daļu) no base64, izparsējiet JSON un salīdziniet exp ar pašreizējo Unix laikspiedolu.

Pārlūkprogrammas konsolē: `javascript const payload = JSON.parse(atob(token.split('.')[1])); console.log('Expires:', new Date(payload.exp * 1000).toISOString()); console.log('Expired:', Date.now() / 1000 > payload.exp); `

Vai arī vienkārši ielīmējiet exp vērtību Unix laikspiedola pārveidotājā, lai iegūtu cilvēklasāmu datumu bez jebkāda koda rakstīšanas. Tas parasti ir ātrākais veids, kā ražošanā atbildēt uz jautājumu “vai šis tokens jau ir beidzies?”.