1. рдпрд╣ рдЯреВрд▓ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ
рдпрд╣ рдореБрдлреНрдд рдСрдирд▓рд╛рдЗрди рд╕реАрдХреНрд░реЗрдЯ рдЬрдирд░реЗрдЯрд░ рдЖрдкрдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕реАрдХреНрд░реЗрдЯ рдХреБрдВрдЬрд┐рдпрд╛рдБ (рдЬреИрд╕реЗ SESSION_SECRET, API рдХреБрдВрдЬрд┐рдпрд╛рдБ) рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд░реИрдВрдбрдо рдмрд╛рдЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рддрд╛ рд╣реИред рдмрд╛рдЗрдЯ рд▓рдВрдмрд╛рдИ (1тАУ512; SESSION_SECRET рдХреЗ рд▓рд┐рдП 32 рдЖрдо рд╣реИ) рдФрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ (hex, base64 рдпрд╛ base64url) рдЪреБрдиреЗрдВред рдирддреАрдЬрд╛ .env, config рдпрд╛ рдХреЛрдб рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВред рдХреЛрдИ рд╕рд╛рдЗрди-рдЕрдк рдирд╣реАрдВ, рдХреЛрдИ рд╕рд░реНрд╡рд░ рдирд╣реАрдВред рд╕рд╛рд░реА рдЬрдирд░реЗрд╢рди crypto.getRandomValues() (CSPRNG) рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреА рд╣реИред
2. рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреИрд╕реЗ рдХрд░реЗрдВ
рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд: рдмрд╛рдЗрдЯ рд▓рдВрдмрд╛рдИ рд╕реЗрдЯ рдХрд░реЗрдВ (рдЬреИрд╕реЗ 32), рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдЪреБрдиреЗрдВ (Hex, Base64 рдпрд╛ Base64 URL), рд╕реАрдХреНрд░реЗрдЯ рдмрдирд╛рдПрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдлрд┐рд░ рдХреЙрдкреА рдХрд░реЗрдВред
- рдмрд╛рдЗрдЯ рд▓рдВрдмрд╛рдИ тАФ 1тАУ512 рджрд░реНрдЬ рдХрд░реЗрдВред рдЖрдо: 16 (128-рдмрд┐рдЯ), 32 (SESSION_SECRET рдХреЗ рд▓рд┐рдП 256-рдмрд┐рдЯ)ред
- рдПрдиреНрдХреЛрдбрд┐рдВрдЧ тАФ Hex: 0-9a-f (рдкреНрд░рддрд┐ рдмрд╛рдЗрдЯ 2 рдЕрдХреНрд╖рд░)ред Base64: рд╕реНрдЯреИрдВрдбрд░реНрдб; рдХреЙрдиреНрдлрд╝рд┐рдЧ рдХреЗ рд▓рд┐рдПред Base64 URL: URL-рд╕реБрд░рдХреНрд╖рд┐рдд (+ рдпрд╛ / рдирд╣реАрдВ); URL рдореЗрдВ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдПред
- рд╕реАрдХреНрд░реЗрдЯ рдмрдирд╛рдПрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдирддреАрдЬрд╛ рдХреЙрдкреА рдХрд░реЗрдВред
3. рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рд╕рд╛рд░реА рд░реИрдВрдбрдордиреЗрд╕ Web Crypto API (crypto.getRandomValues()) рд╕реЗ рдЖрддреА рд╣реИред рдЯреВрд▓ рдЙрддрдиреЗ рд╣реА рд░реИрдВрдбрдо рдмрд╛рдЗрдЯ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ hex, base64 рдпрд╛ base64url рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд░рддрд╛ рд╣реИред рд╕рд╛рд░рд╛ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рди рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд╣реИ; рдХреБрдЫ рднреА рд╕рд░реНрд╡рд░ рдкрд░ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ред
4. рдЙрдкрдпреЛрдЧ рдФрд░ рдЙрджрд╛рд╣рд░рдг
- SESSION_SECRET тАФ 32 рдмрд╛рдЗрдЯ, hex рдпрд╛ base64; iron-session, Express рдЖрджрд┐ рдХреЗ рд▓рд┐рдП
.envрдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВред - API рдХреБрдВрдЬрд┐рдпрд╛рдБ / рдЯреЛрдХрди тАФ рдЪрд╛рд╣реА рдЧрдИ рдмрд╛рдЗрдЯ рд▓рдВрдмрд╛рдИ; URL-рд╕реБрд░рдХреНрд╖рд┐рдд рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП base64urlред
- рдХреЙрдиреНрдлрд╝рд┐рдЧ / .env тАФ Hex (32 рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП 64 рдЕрдХреНрд╖рд░) рдпрд╛ base64; env рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВред
рдЙрджрд╛рд╣рд░рдг
- 32 рдмрд╛рдЗрдЯ hex тЖТ 64 hex рдЕрдХреНрд╖рд░ (рдЬреИрд╕реЗ
SESSION_SECRETрдХреЗ рд▓рд┐рдП)ред - 32 рдмрд╛рдЗрдЯ base64 тЖТ ~44 рдЕрдХреНрд╖рд░;
.envрдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВред
5. рд╕реАрдорд╛рдПрдБ рдФрд░ рдЬреНрдЮрд╛рдд рдмрд╛рдзрд╛рдПрдБ
- рдмрд╛рдЗрдЯ рд▓рдВрдмрд╛рдИ тАФ рдкреНрд░рддрд┐ рд╕реАрдХреНрд░реЗрдЯ рдЕрдзрд┐рдХрддрдо 512 рдмрд╛рдЗрдЯред
- рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдкреЛрд░реНрдЯ тАФ
crypto.getRandomValues()рдЬрд╝рд░реВрд░реАред рд╕рднреА рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдзред - рдХреЛрдИ рдкрд░рд╕рд┐рд╕реНрдЯреЗрдВрд╕ рдирд╣реАрдВ тАФ рдЬрдирд░реЗрдЯ рдХреА рдЧрдИ рд╡реИрд▓реНрдпреВ рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рд╣реЛрддреАрдВ; рд░рдЦрдиреА рд╣реЛрдВ рддреЛ рдХреЙрдкреА рдХрд░ рд▓реЗрдВред