рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
JWT рдкреНрд░рдорд╛рдгреАрдХрд░рдг (JSON рд╡реЗрдм рдЯреЛрдХрди) рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдорд╛рди рд╡рд░реНрджреА, рд╕реБрд╕рдВрдЧрдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рддрдВрддреНрд░ рд╣реИред JWT рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрдВ рд░рд╛рдЬреНрдп рдХреЛ рдХрдо рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорд╛рдкрддрд╛ рд╣реИред рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
JWT рдХреЗ рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЕрдХреНрд╕рд░ рдпрд╣ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: рдЯреЛрдХрди рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд╣рд╛рдВ рдФрд░ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ? рдпрджрд┐ рд╣рдо рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╕рдмрд╕реЗ рдЖрдо рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
- HTML5 рд╡реЗрдм рд╕рдВрдЧреНрд░рд╣рдг (рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рдпрд╛ рд╕реЗрд╢рдирд╕реНрдЯреЛрд░реЗрдЬ)
- рдХреБрдХреАрдЬрд╝
рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рджреЛрдиреЛрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рджреЛрдиреЛрдВ рд╣реА рдХреБрдВрдЬреА-рдореВрд▓реНрдп рд╡рд╛рд▓реЗ рдЬреЛрдбрд╝реЗ рдХреЗ рдирд┐рдпрдорд┐рдд рднрдВрдбрд╛рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЙрдирдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИрдВред рдЕрдВрддрд░ рднрдВрдбрд╛рд░рдг рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╣реИред
рд╡реЗрдм рд╕рдВрдЧреНрд░рд╣рдг (рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ / рд╕реЗрд╢рдирд╕реНрдЯреЛрд░реЗрдЬ) рдЙрд╕реА рдбреЛрдореЗрди рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХрд┐рд╕реА рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗрдм рд╕реНрдЯреЛрд░реЗрдЬ рддрдХ рд╣реИ, рдФрд░ рдпрд╣ рдХреНрд░реЙрд╕-рд╕рд╛рдЗрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ (XSS) рд╣рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рднреЗрджреНрдпрддрд╛ рдмрдирд╛рддрд╛ рд╣реИред рд╕реНрдЯреЛрд░реЗрдЬ рдЗрдВрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ, рд╡реЗрдм рд╕реНрдЯреЛрд░реЗрдЬ рд╕реНрдЯреЛрд░реЗрдЬ рдФрд░ рд╢реЗрдпрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрд╕ рд╕рд╣рд╛рдпрдХ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдЕрдкрдбреЗрдЯ (F5) рдпрд╛ рдЯреИрдм рдХреЛ рдмрдВрдж рдХрд░рддреЗ рд╕рдордп рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рд╕реНрдерд┐рддрд┐ рдФрд░ рдкреГрд╖реНрда рд╕рдВрдЦреНрдпрд╛, рдлрд╝рд┐рд▓реНрдЯрд░ рдЖрджрд┐ред
рдЯреЛрдХрди рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреБрдХреАрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
HttpOnly рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдХреАрдЬрд╝ XSS рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ
рд╣реИрдВ ред httpOnly рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рдкрд░ рдХреБрдХреАрдЬрд╝ рдХреЛ рдкрдврд╝рдиреЗ, рд▓рд┐рдЦрдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдзреНрд╡рдЬ рд╣реИред рд╡реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЯреЛрдХрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдЧрд╛, рдФрд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрдЧрд╛ред
рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ
рд╕реБрд░рдХреНрд╖рд┐рдд рдзреНрд╡рдЬ рднреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдХреАрдЬрд╝ рдХреЗрд╡рд▓ HTTPS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрдВред рдЗрди рдлрд╛рдпрджреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореЗрд░реА рдкрд╕рдВрдж рдХреБрдХреАрдЬрд╝ рдкрд░ рдЧрд┐рд░ рдЧрдИред
рдпрд╣ рд▓реЗрдЦ рдПрд╕рдкреАрдП рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ ASP.NET рдХреЛрд░ рд╡реЗрдм рдПрдк рдореЗрдВ httpOnly рд╕реБрд░рдХреНрд╖рд┐рдд рдХреБрдХреАрдЬрд╝ + JSON рд╡реЗрдм рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдФрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдХрд▓реНрдк рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореВрд▓ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВред
рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛
HTTPS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рд░рд┐рд╢реНрддреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рддреБрд░рдВрдд рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рдореЗрдВ HTTPS рдХрдиреЗрдХреНрд╢рди рд╣реЛред
рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ HTTPS рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдмрдВрдз рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрдИ рд╢рд╛рдирджрд╛рд░ рд╡рд┐рд╡рд░рдг рд╕рд╛рдордиреЗ рдЖрдПрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ HTTPS рдХреЗ рд╕рд╛рде рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреБрдХреАрдЬрд╝ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд░рдХреНрд╖рд┐рдд-рдиреАрддрд┐рдпрд╛рдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреАред
рдореИрдВ рдУрдПрд╕ рд╡рд┐рдВрдбреЛрдЬ 10, рд╕рд░реНрд╡рд░ - рдПрдПрд╕рдкреА.рдиреЗрдЯ рдХреЛрд░, рдПрд╕рдкреАрдП - рд░рд┐рдПрдХреНрдЯ рдкрд░ рдПрдЪрдЯреАрдЯреАрдкреАрдПрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред
рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп
HTTPS рдзреНрд╡рдЬ рдХреЗ
рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ASP.NET Core рдореЗрдВ HTTPS рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдмрдирд╛рддреЗ рд╕рдордп рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЧреБрдг рдореЗрдВ рд╕рдВрдЧрдд рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВред
рдПрд╕рдкреАрдП рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
"рд╕реНрдЯрд╛рд░реНрдЯ" рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ
" HTTPS = true" рдкрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореЗрд░рд╛ рд╕реЗрдЯрдЕрдк рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
'start': 'set HTTPS=true&&rimraf ./build&&react-scripts start'
рдореИрдВ рдЖрдкрдХреЛ рдЕрдиреНрдп рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдорд╛рд╣реМрд▓ рдХреЗ рд▓рд┐рдП HTTPS рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛
рд╣реВрдВ- create-react-app.dev/docs/use-https-in-developmentASP.NET рдХреЛрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
JWT рд╕реЗрдЯрдЕрдк
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рднреА рд▓реЗрдЦ рд╕реЗ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдХрд╛ рд╕рдмрд╕реЗ рдЖрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕
options.RequireHttpsMetadata = true;
рд╕рд╛рде
options.RequireHttpsMetadata = true;
рд╣рдорд╛рд░реЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг HTTPS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
ConfigureServices services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => { options.RequireHttpsMetadata = true; options.SaveToken = true; options.TokenValidationParameters = new TokenValidationParameters {
рдПрдХ CORS рдиреАрддрд┐ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
рдорд╣рддреНрд╡рдкреВрд░реНрдг :
AllowCredentials()
рдиреАрддрд┐ рдореЗрдВ
AllowCredentials()
рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
XMLHttpRequest.withCredentials рд╕реЗ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреБрдХреА рд╡рд╛рдкрд╕ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕ рдкрд░ рдФрд░ рдмрд╛рдж рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВред
рдпрджрд┐ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдХ рд╣реА рдореВрд▓ рдкрд░ рд╣реИрдВ, рддреЛ рдиреАрдЪреЗ рд╕рдВрдкреВрд░реНрдг рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
ConfigureServices services.AddCors();
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ app.UseCors(x => x .WithOrigins("https://localhost:3000")
рдХреБрдХреА рдиреАрддрд┐ рдХреА рд╕реНрдерд╛рдкрдирд╛
рд╕реЗрдирд╛ рдХреА рдиреАрддрд┐ рдХреЛ httpOnly рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ
MinimumSameSitePolicy = SameSiteMode.Strict;
рд╕реЗрдЯ
MinimumSameSitePolicy = SameSiteMode.Strict;
- рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдХреА рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреНрд░реЙрд╕-рдСрд░рд┐рдЬрд┐рдирд▓ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ app.UseCookiePolicy(new CookiePolicyOptions { MinimumSameSitePolicy = SameSiteMode.Strict, HttpOnly = HttpOnlyPolicy.Always, Secure = CookieSecurePolicy.Always });
рд╕реБрд░рдХреНрд╖рд┐рдд рдЯреЛрдХрди рд╡рд┐рдирд┐рдордп рдХрд╛ рд╡рд┐рдЪрд╛рд░
рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рд╣рдо рджреЛ рдХрд╛рдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ:
- HTTPOnly рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдЭрдВрдбреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ HTTP рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЯреЛрдХрди рдЯреЙрд╕ рдХрд░реЗрдВред
- рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЙрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП:
- рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╕рдордп httpOnly рдХреБрдХреА рдореЗрдВ рдЯреЛрдХрди рд▓рд┐рдЦреЗрдВ рдФрд░ рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВред
- рдпрджрд┐ рдХреБрдХреАрдЬрд╝ рдореЗрдВ рдПрдХ рдЯреЛрдХрди рд╣реИ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ HTTP рд╣реЗрдбрд░ рдореЗрдВ рдЯреЛрдХрди рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
- рдпрджрд┐ рдХреБрдХреАрдЬрд╝ рдореЗрдВ рдХреЛрдИ рдЯреЛрдХрди рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣реЗрдбрд░ рдЦрд╛рд▓реА рд╣реЛрдЧрд╛, рдФрд░ рдЕрдиреБрд░реЛрдз рдЕрдзрд┐рдХреГрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
middleware
рдЖрдиреЗ рд╡рд╛рд▓реЗ HTTP рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЯреЛрдХрди рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреБрдВрдЬреА рдХреЗ рддрд╣рдд рдХреБрдХреА рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
".AspNetCore.Application.Id" ред рдореИрдВ рдПрдХ рдРрд╕реЗ рдирд╛рдо рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдпрд╛ рдЯреЛрдХрди рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рдПрдХ рдХреБрдХреА рдПрд╕реНрдкреЗрдиреЗрдЯрдХреЛрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХреА рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдмрд╛рдд рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╣рдорд▓рд╛рд╡рд░ рдХрдИ рд╕рд┐рд╕реНрдЯрдо рдЪрд░ рдХреЛ рджреЗрдЦреЗрдЧрд╛ рдФрд░ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдХрд┐ рдХреМрди рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдЧреЗ рдЬрд╛рдПрдЧрд╛ред рдмреЗрд╢рдХ, рдЕрдЧрд░ рд╡рд╣ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдРрд╕реЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдЗрд╕ рдЯреЛрдХрди рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рд┐рдЦреЗрдВрдЧреЗред рдпрд╣ рдПрдХ HTTP рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ app.Use(async (context, next) => { var token = context.Request.Cookies[".AspNetCore.Application.Id"]; if (!string.IsNullOrEmpty(token)) context.Request.Headers.Add("Authorization", "Bearer " + token); await next(); }); app.UseAuthentication();
рд╣рдо рдЗрд╕ рддрд░реНрдХ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗрд╡рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЛ рдмрдВрдж рди рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред
рдХреБрдХреАрдЬрд╝ рдореЗрдВ рдорд╛рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рддрд░реНрдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
if (result.Succeeded) HttpContext.Response.Cookies.Append(".AspNetCore.Application.Id", token, new CookieOptions { MaxAge = TimeSpan.FromMinutes(60) });
рд╣рдорд╛рд░реА рдХреБрдХреА-рдиреАрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЗрди рдХреБрдХреАрдЬрд╝ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ httpOnly рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреБрдХреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдЙрдирдХреА рдиреАрддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдХреБрдХреА рдореЗрдВ, рдЖрдк рдЬреАрд╡рди рднрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MaxAge рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЯреЛрдХрди рдЬрд╛рд░реА рдХрд░рддреЗ рд╕рдордп JWT рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рддрд╛рдХрд┐ рдХреБрдХреА рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рдмрд╛рдж рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПред рдХреБрдХреА рдХреА рдЕрдиреНрдп рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЗрдбрд░ рдХреЛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ:
context.Response.Headers.Add("X-Content-Type-Options", "nosniff"); context.Response.Headers.Add("X-Xss-Protection", "1"); context.Response.Headers.Add("X-Frame-Options", "DENY");
- X-Content-Type-Options рд╣реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ MIME рд╕реВрдБрдШрдиреЗ рдХреА рдХрдордЬреЛрд░рд┐рдпреЛрдВ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рднреЗрджреНрдпрддрд╛ рддрдм рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдХреЛрдИ рд╕рд╛рдЗрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рд╛рдордЧреНрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреБрдЫ рдФрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╣рдорд▓рд╛рд╡рд░реЛрдВ рдХреЛ рдХреНрд░реЙрд╕-рд╕рд╛рдЗрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдпрд╛ рдХрд┐рд╕реА рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗ рд╕рдХрддрд╛ рд╣реИред
- рд╕рднреА рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди XSS рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреНрд╖рдорддрд╛рдПрдВ рд╣реИрдВ, рдЬреЛ рдкреЗрдЬ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ XSS рднреЗрджреНрдпрддрд╛ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╡реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХреНрд╕-рдПрдХреНрд╕рдПрд╕рдПрд╕-рд╕реБрд░рдХреНрд╖рд╛ рд╣реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред
- рдПрдХреНрд╕-рдлрд╝реНрд░реЗрдо-рдСрдкреНрд╢рдВрд╕ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдХреЛ рдПрдХ HTML рдлреНрд░реЗрдо рдХреЗ рдЕрдВрджрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рди рдХрд░реЗрдВред рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдХреНрд▓рд┐рдХрдЬреИрдХрд┐рдВрдЧ рдкреНрд░рдпрд╛рд╕реЛрдВ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдореИрдВрдиреЗ рд╕рднреА рд╕реБрд░реНрдЦрд┐рдпреЛрдВ рд╕реЗ рджреВрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реАрдХреЗ рд╣реИрдВред рдореИрдВ рдЖрдкрдХреЛ Securityheaders.com рд╕рдВрд╕рд╛рдзрди рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдЬрд╛рдВрдЪ рд╕реВрдЪреА рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдПрд╕рдкреАрдП рдЧреНрд░рд╛рд╣рдХ рд╕реЗрдЯрдЕрдк
рдЬрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореВрд▓ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЖрдкрдХреЛ
XMLHttpRequest.withCredentials рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛ред
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рдкреЗрдЯрд╛:
import axios from "axios"; const api = axios.create({ baseURL: process.env.REACT_APP_API_URL }); api.interceptors.request.use(request => requestInterceptor(request)) const requestInterceptor = (request) => { request.withCredentials = true; return request; } export default api;
рд╣рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐
withCredentials = true рд╡рд╣рд╛рдБ рд╣реИ ред
XMLHttpRequest.withCredentials рдЧреБрдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрд░реЙрд╕-рдбреЛрдореЗрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдХреБрдХреАрдЬрд╝, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╣реЗрдбрд░ рдпрд╛ рдЯреАрдПрд▓рдПрд╕ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЬреИрд╕реЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред
рдЗрд╕ рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднреЗрдЬреЗ рдЧрдП рдХреБрдХреАрдЬрд╝ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рдХрд┐рд╕реА рдЕрдиреНрдп рдбреЛрдореЗрди рд╕реЗ XMLHttpRequest рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ withCredentials рдзреНрд╡рдЬ рдХреЛ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЛрдореЗрди рдкрд░ рдХреБрдХреА рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реА рдХреБрдХреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рд╕рд╣реЗрдЬреА рдирд╣реАрдВ рдЬрд╛рдПрдЧреА, рдЕрд░реНрдерд╛рддред рд╣рдо рдХреБрдХреА рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рднреЗрдЬ рдкрд╛рдПрдВрдЧреЗ, рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛ JWT рдХреЗ рд╕рд╛рде рд╡рд╛рдВрдЫрд┐рдд рдХреБрдХреА рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреА рдФрд░ рд╣рдорд╛рд░реЗ HTTP рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдмрд┐рдпрд░рд░ рдЯреЛрдХрди рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдпрд╣ рд╕рдм рдХрд┐рд╕ рд▓рд┐рдП рд╣реИ?
рдКрдкрд░, рдореИрдВрдиреЗ рдЯреЛрдХрди рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рдПрдХ XSS- рдкреНрд░рддрд┐рд░реЛрдзреА рддрд░реАрдХреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рдЖрдЗрдП, рдКрдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреЗрдЦреЗрдВред
рдпрджрд┐ рдЖрдк рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо
рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдЭрдВрдбреЗ
httpOnly рдФрд░
рд╕реБрд░рдХреНрд╖рд┐рдд рджреЗрдЦрддреЗ рд╣реИрдВ:

рдЪрд▓реЛ рдХреНрд░рд╢-рдЯреЗрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдХреБрдХреАрдЬрд╝ рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:

рд╣рдо '' рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдХреБрдХреАрдЬрд╝ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реНрдерд╛рди рд╕реЗ рд╕реБрд▓рдн рдирд╣реАрдВ рд╣реИрдВ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдкрдврд╝рдирд╛ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред
рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдХрд░рдг рдпрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдорджрдж рд╕реЗ рдЗрди рдХреБрдХреАрдЬрд╝ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЬреЛ рднреА рдЙрдкрдХрд░рдг рдЖрдЬрд╝рдорд╛рдП рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реНрдерд╛рди рд╕реЗ рдореВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╣рд╛ рд╣реИред
рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ
рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдирд┐рд░реНрджреЗрд╢ README.MD рдореЗрдВ рд╣реИрдВ
UPD: CSRF рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рдВрд░рдХреНрд╖рдг
ASP.NET рдХреЛрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рдорд┐рдбрд┐рд▓рд╡реЗрдпрд░ рд╕реЗрд╡рд╛рдПрдВXsrfProtectionMiddleware.cs public class XsrfProtectionMiddleware { private readonly IAntiforgery _antiforgery; private readonly RequestDelegate _next; public XsrfProtectionMiddleware(RequestDelegate next, IAntiforgery antiforgery) { _next = next; _antiforgery = antiforgery; } public async Task InvokeAsync(HttpContext context) { context.Response.Cookies.Append( ".AspNetCore.Xsrf", _antiforgery.GetAndStoreTokens(context).RequestToken, new CookieOptions {HttpOnly = false, Secure = true, MaxAge = TimeSpan.FromMinutes(60)}); await _next(context); } }
MiddlewareExtensions.cs public static class MiddlewareExtensions { public static IApplicationBuilder UseXsrfProtection(this IApplicationBuilder builder, IAntiforgery antiforgery) => builder.UseMiddleware<XsrfProtectionMiddleware>(antiforgery); }
ConfigureServices services.AddAntiforgery(options => { options.HeaderName = "x-xsrf-token"; }); services.AddMvc();
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ app.UseAuthentication(); app.UseXsrfProtection(antiforgery);
рдПрд╕рдкреАрдП рд╕реЗрдЯрдЕрдк
api.axios.js import axios from "axios"; import cookie from 'react-cookies'; const api = axios.create({ baseURL: process.env.REACT_APP_API_URL }); api.interceptors.request.use(request => requestInterceptor(request)) const requestInterceptor = (request) => { request.headers['x-xsrf-token'] = cookie.load('.AspNetCore.Xsrf') return request; } export default api;
рдХреЗ рдЙрдкрдпреЛрдЧ
рд╣рдорд╛рд░реЗ рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП
[AutoValidateAntiforgeryToken]
рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╛ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП
[ValidateAntiForgeryToken]
рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред