{"id":6879,"date":"2026-03-09T04:01:53","date_gmt":"2026-03-09T04:01:53","guid":{"rendered":"https:\/\/onfa.us\/?p=6879"},"modified":"2026-03-09T04:01:53","modified_gmt":"2026-03-09T04:01:53","slug":"refresh-token-la-gi","status":"publish","type":"post","link":"https:\/\/onfa.us\/vi\/refresh-token-la-gi\/","title":{"rendered":"Refresh Token L\u00e0 G\u00ec? C\u01a1 Ch\u1ebf Ho\u1ea1t \u0110\u1ed9ng &#038; C\u00e1ch L\u01b0u Tr\u1eef An To\u00e0n"},"content":{"rendered":"\n<p><span style=\"font-weight: 400;\">Hi\u1ec3u \u0111\u00fang <\/span><b>refresh token l\u00e0 g\u00ec<\/b><span style=\"font-weight: 400;\"> l\u00e0 b\u01b0\u1edbc n\u1ec1n t\u1ea3ng \u0111\u1ec3 x\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng x\u00e1c th\u1ef1c an to\u00e0n, \u0111\u1eb7c bi\u1ec7t khi \u1ee9ng d\u1ee5ng c\u1ea7n duy tr\u00ec \u0111\u0103ng nh\u1eadp d\u00e0i h\u1ea1n cho ng\u01b0\u1eddi d\u00f9ng. Refresh token cho ph\u00e9p b\u1ea1n t\u1ea1o m\u1edbi access token m\u00e0 kh\u00f4ng y\u00eau c\u1ea7u \u0111\u0103ng nh\u1eadp l\u1ea1i, gi\u00fap tr\u1ea3i nghi\u1ec7m m\u01b0\u1ee3t h\u01a1n v\u00e0 gi\u1ea3m t\u1ea3i cho m\u00e1y ch\u1ee7. Trong h\u1ec7 th\u1ed1ng web hi\u1ec7n \u0111\u1ea1i, c\u01a1 ch\u1ebf ho\u1ea1t \u0111\u1ed9ng c\u1ee7a refresh token c\u0169ng li\u00ean quan ch\u1eb7t ch\u1ebd \u0111\u1ebfn b\u1ea3o m\u1eadt, cookie, token rotation v\u00e0 c\u00e1ch l\u01b0u tr\u1eef an to\u00e0n.<\/span><\/p>\n<figure id=\"attachment_6880\" aria-describedby=\"caption-attachment-6880\" style=\"width: 800px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-6880 size-full\" src=\"https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-la-gi_-Giai-thich-khai-niem-co-ban-giup-nguoi-moi-hieu-ro-refresh-token-la-gi-trong-he-thong-xac-thuc-nguoi-dung.png\" alt=\"Refresh-Token-la-gi-Giai-thich-khai-niem-co-ban-giup-nguoi-moi-hieu-ro-refresh-token-la-gi-trong-he-thong-xac-thuc-nguoi-dung\" width=\"800\" height=\"500\" title=\"\" srcset=\"https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-la-gi_-Giai-thich-khai-niem-co-ban-giup-nguoi-moi-hieu-ro-refresh-token-la-gi-trong-he-thong-xac-thuc-nguoi-dung.png 800w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-la-gi_-Giai-thich-khai-niem-co-ban-giup-nguoi-moi-hieu-ro-refresh-token-la-gi-trong-he-thong-xac-thuc-nguoi-dung-300x188.png 300w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-la-gi_-Giai-thich-khai-niem-co-ban-giup-nguoi-moi-hieu-ro-refresh-token-la-gi-trong-he-thong-xac-thuc-nguoi-dung-150x94.png 150w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-la-gi_-Giai-thich-khai-niem-co-ban-giup-nguoi-moi-hieu-ro-refresh-token-la-gi-trong-he-thong-xac-thuc-nguoi-dung-768x480.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-6880\" class=\"wp-caption-text\">Refresh Token l\u00e0 g\u00ec_ Gi\u1ea3i th\u00edch kh\u00e1i ni\u1ec7m c\u01a1 b\u1ea3n gi\u00fap ng\u01b0\u1eddi m\u1edbi hi\u1ec3u r\u00f5 refresh token l\u00e0 g\u00ec trong h\u1ec7 th\u1ed1ng x\u00e1c th\u1ef1c ng\u01b0\u1eddi d\u00f9ng<\/figcaption><\/figure>\n<h2><b>Refresh Token L\u00e0 G\u00ec?\u00a0<\/b><\/h2>\n<h3><b>T\u1ea1i sao l\u1ea1i t\u1ed3n t\u1ea1i refresh token?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">\u0110\u1ec3 hi\u1ec3u <\/span><b>refresh token l\u00e0 g\u00ec<\/b><span style=\"font-weight: 400;\">, b\u1ea1n c\u1ea7n n\u1eafm r\u1eb1ng access token th\u01b0\u1eddng c\u00f3 th\u1eddi h\u1ea1n r\u1ea5t ng\u1eafn nh\u1eb1m gi\u1ea3m r\u1ee7i ro b\u1ea3o m\u1eadt. Khi access token h\u1ebft hi\u1ec7u l\u1ef1c, \u1ee9ng d\u1ee5ng s\u1ebd d\u00f9ng refresh token \u0111\u1ec3 y\u00eau c\u1ea7u server c\u1ea5p token m\u1edbi m\u00e0 kh\u00f4ng y\u00eau c\u1ea7u ng\u01b0\u1eddi d\u00f9ng \u0111\u0103ng nh\u1eadp l\u1ea1i. \u0110\u00e2y l\u00e0 l\u00fd do refresh token tr\u1edf th\u00e0nh m\u1ed9t ph\u1ea7n kh\u00f4ng th\u1ec3 thi\u1ebfu trong h\u1ec7 th\u1ed1ng OAuth v\u00e0 API hi\u1ec7n \u0111\u1ea1i.<\/span><\/p>\n<h3><b>Refresh token kh\u00e1c g\u00ec so v\u1edbi c\u00e1c lo\u1ea1i token kh\u00e1c?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Refresh token c\u00f3 th\u1eddi h\u1ea1n d\u00e0i h\u01a1n, m\u1ee9c \u0111\u1ed9 nh\u1ea1y c\u1ea3m cao h\u01a1n v\u00e0 b\u1eaft bu\u1ed9c ph\u1ea3i l\u01b0u tr\u1eef an to\u00e0n h\u01a1n access token. Kh\u00f4ng gi\u1ed1ng token truy c\u1eadp, refresh token kh\u00f4ng \u0111\u01b0\u1ee3c g\u1eedi trong m\u1ed7i request, m\u00e0 ch\u1ec9 d\u00f9ng khi c\u1ea7n l\u00e0m m\u1edbi phi\u00ean \u0111\u0103ng nh\u1eadp. \u0110i\u1ec1u n\u00e0y gi\u00fap gi\u1ea3m nguy c\u01a1 l\u1ed9 th\u00f4ng tin nh\u1ea1y c\u1ea3m v\u00e0 k\u00e9o d\u00e0i th\u1eddi gian phi\u00ean \u0111\u0103ng nh\u1eadp.<\/span><\/p>\n<h3><b>T\u00ednh ch\u1ea5t: th\u1eddi h\u1ea1n, m\u1ee9c \u0111\u1ed9 nh\u1ea1y c\u1ea3m, vai tr\u00f2 trong h\u1ec7 th\u1ed1ng x\u00e1c th\u1ef1c<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Khi t\u00ecm hi\u1ec3u <\/span><b>refresh token l\u00e0 g\u00ec<\/b><span style=\"font-weight: 400;\">, b\u1ea1n s\u1ebd th\u1ea5y \u0111\u00e2y l\u00e0 lo\u1ea1i token d\u00e0i h\u1ea1n, c\u00f3 th\u1ec3 t\u1ed3n t\u1ea1i h\u00e0ng ng\u00e0y ho\u1eb7c h\u00e0ng th\u00e1ng t\u00f9y c\u1ea5u h\u00ecnh. V\u00ec \u0111\u01b0\u1ee3c d\u00f9ng \u0111\u1ec3 t\u1ea1o access token, refresh token mang t\u00ednh nh\u1ea1y c\u1ea3m cao v\u00e0 tr\u1edf th\u00e0nh m\u1ee5c ti\u00eau c\u1ee7a hacker. Do \u0111\u00f3 m\u1ecdi h\u1ec7 th\u1ed1ng c\u1ea7n c\u01a1 ch\u1ebf rotation, thu h\u1ed3i v\u00e0 l\u01b0u tr\u1eef an to\u00e0n b\u1eb1ng cookie HttpOnly.<\/span><\/p>\n<h2><b>Refresh Token D\u00f9ng \u0110\u1ec3 L\u00e0m G\u00ec?<\/b><\/h2>\n<figure id=\"attachment_6881\" aria-describedby=\"caption-attachment-6881\" style=\"width: 800px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-6881 size-full\" src=\"https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-dung-de-lam-gi_-Phan-tich-vai-tro-quan-trong-giup-duy-tri-phien-dang-nhap-va-lam-ro-refresh-token-la-gi-trong-ung-dung-web_app.png\" alt=\"Refresh-Token-dung-de-lam-gi-Phan-tich-vai-tro-quan-trong-giup-duy-tri-phien-dang-nhap-va-lam-ro-refresh-token-la-gi-trong-ung-dung-web-app\" width=\"800\" height=\"500\" title=\"\" srcset=\"https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-dung-de-lam-gi_-Phan-tich-vai-tro-quan-trong-giup-duy-tri-phien-dang-nhap-va-lam-ro-refresh-token-la-gi-trong-ung-dung-web_app.png 800w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-dung-de-lam-gi_-Phan-tich-vai-tro-quan-trong-giup-duy-tri-phien-dang-nhap-va-lam-ro-refresh-token-la-gi-trong-ung-dung-web_app-300x188.png 300w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-dung-de-lam-gi_-Phan-tich-vai-tro-quan-trong-giup-duy-tri-phien-dang-nhap-va-lam-ro-refresh-token-la-gi-trong-ung-dung-web_app-150x94.png 150w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-dung-de-lam-gi_-Phan-tich-vai-tro-quan-trong-giup-duy-tri-phien-dang-nhap-va-lam-ro-refresh-token-la-gi-trong-ung-dung-web_app-768x480.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-6881\" class=\"wp-caption-text\">Refresh Token d\u00f9ng \u0111\u1ec3 l\u00e0m g\u00ec_ Ph\u00e2n t\u00edch vai tr\u00f2 quan tr\u1ecdng gi\u00fap duy tr\u00ec phi\u00ean \u0111\u0103ng nh\u1eadp v\u00e0 l\u00e0m r\u00f5 refresh token l\u00e0 g\u00ec trong \u1ee9ng d\u1ee5ng web_app<\/figcaption><\/figure>\n<h3><b>Gia h\u1ea1n access token m\u00e0 kh\u00f4ng c\u1ea7n \u0111\u0103ng nh\u1eadp l\u1ea1i<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">C\u00f4ng d\u1ee5ng l\u1edbn nh\u1ea5t khi t\u00ecm hi\u1ec3u <\/span><b>refresh token l\u00e0 g\u00ec<\/b><span style=\"font-weight: 400;\"> ch\u00ednh l\u00e0 kh\u1ea3 n\u0103ng c\u1ea5p l\u1ea1i access token m\u1edbi m\u00e0 kh\u00f4ng y\u00eau c\u1ea7u ng\u01b0\u1eddi d\u00f9ng nh\u1eadp l\u1ea1i m\u1eadt kh\u1ea9u. \u0110i\u1ec1u n\u00e0y gi\u00fap lu\u1ed3ng x\u00e1c th\u1ef1c li\u1ec1n m\u1ea1ch h\u01a1n, \u0111\u1eb7c bi\u1ec7t trong c\u00e1c d\u1ecbch v\u1ee5 y\u00eau c\u1ea7u \u0111\u0103ng nh\u1eadp l\u00e2u d\u00e0i.<\/span><\/p>\n<h3><b>Gi\u00fap c\u1ea3i thi\u1ec7n tr\u1ea3i nghi\u1ec7m ng\u01b0\u1eddi d\u00f9ng<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Khi \u1ee9ng d\u1ee5ng t\u1ef1 \u0111\u1ed9ng l\u00e0m m\u1edbi access token ph\u00eda backend, ng\u01b0\u1eddi d\u00f9ng s\u1ebd kh\u00f4ng b\u1ecb tho\u00e1t ra \u0111\u1ed9t ng\u1ed9t ho\u1eb7c g\u1eb7p l\u1ed7i \u201csession expired\u201d. C\u01a1 ch\u1ebf n\u00e0y gi\u00fap website, mobile app v\u00e0 API ho\u1ea1t \u0111\u1ed9ng m\u01b0\u1ee3t m\u00e0 h\u01a1n.<\/span><\/p>\n<h3><b>Gi\u1ea3m t\u1ea3i cho m\u00e1y ch\u1ee7 x\u00e1c th\u1ef1c (Auth Server)<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Refresh token gi\u00fap gi\u1ea3m s\u1ed1 l\u1ea7n x\u00e1c th\u1ef1c l\u1ea1i b\u1eb1ng m\u1eadt kh\u1ea9u v\u00e0 gi\u1ea3m \u00e1p l\u1ef1c cho m\u00e1y ch\u1ee7 x\u00e1c th\u1ef1c. \u0110i\u1ec1u n\u00e0y \u0111\u1eb7c bi\u1ec7t quan tr\u1ecdng \u0111\u1ed1i v\u1edbi h\u1ec7 th\u1ed1ng c\u00f3 l\u01b0\u1ee3ng ng\u01b0\u1eddi d\u00f9ng l\u1edbn.<\/span><\/p>\n<h2><b>Kh\u00e1c Bi\u1ec7t Gi\u1eefa Access Token V\u00e0 Refresh Token<\/b><\/h2>\n<h3><b>So s\u00e1nh chi ti\u1ebft<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Khi nghi\u00ean c\u1ee9u <\/span><b>refresh token l\u00e0 g\u00ec<\/b><span style=\"font-weight: 400;\">, b\u1ea1n c\u1ea7n ph\u00e2n bi\u1ec7t r\u00f5 s\u1ef1 <\/span><span style=\"font-weight: 400;\">kh\u00e1c bi\u1ec7t gi\u1eefa access v\u00e0 refresh token<\/span><span style=\"font-weight: 400;\">:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Access token: s\u1ed1ng ng\u1eafn, g\u1eedi trong m\u1ed7i request.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Refresh token: s\u1ed1ng d\u00e0i, ch\u1ec9 d\u00f9ng \u0111\u1ec3 c\u1ea5p token m\u1edbi.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Access token c\u00f3 th\u1ec3 l\u00e0 JWT; refresh token th\u01b0\u1eddng l\u00e0 chu\u1ed7i ng\u1eabu nhi\u00ean.<\/span><\/li>\n<\/ul>\n<h3><b>Access token c\u00f3 n\u00ean l\u00e0 JWT kh\u00f4ng?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">JWT ph\u00f9 h\u1ee3p l\u00e0m access token do mang th\u00f4ng tin (claim) v\u00e0 c\u00f3 c\u01a1 ch\u1ebf x\u00e1c minh b\u1eb1ng ch\u1eef k\u00fd s\u1ed1. Tuy nhi\u00ean JWT c\u0169ng c\u00f3 r\u1ee7i ro n\u1ebfu th\u1eddi h\u1ea1n qu\u00e1 d\u00e0i, n\u00ean c\u1ea7n k\u1ebft h\u1ee3p refresh token \u0111\u00fang c\u00e1ch.<\/span><\/p>\n<h3><b>Refresh token c\u00f3 c\u1ea7n l\u00e0 JWT kh\u00f4ng?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Refresh token kh\u00f4ng c\u1ea7n l\u00e0 JWT v\u00ec vi\u1ec7c ch\u1ee9a th\u00f4ng tin b\u00ean trong c\u00f3 th\u1ec3 l\u00e0m t\u0103ng r\u1ee7i ro b\u1ea3o m\u1eadt. Chu\u1ed7i ng\u1eabu nhi\u00ean (opaque token) th\u01b0\u1eddng an to\u00e0n h\u01a1n v\u00e0 d\u1ec5 b\u1ecb thu h\u1ed3i h\u01a1n.<\/span><\/p>\n<h3><b>Khi n\u00e0o N\u00caN v\u00e0 KH\u00d4NG N\u00caN s\u1eed d\u1ee5ng refresh token<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Refresh token ph\u00f9 h\u1ee3p cho \u1ee9ng d\u1ee5ng y\u00eau c\u1ea7u phi\u00ean \u0111\u0103ng nh\u1eadp l\u00e2u d\u00e0i. Tuy nhi\u00ean v\u1edbi c\u00e1c d\u1ecbch v\u1ee5 nh\u1ea1y c\u1ea3m ho\u1eb7c API server-to-server, vi\u1ec7c d\u00f9ng refresh token c\u00f3 th\u1ec3 kh\u00f4ng c\u1ea7n thi\u1ebft.<\/span><\/p>\n<h2><b>C\u01a1 Ch\u1ebf Ho\u1ea1t \u0110\u1ed9ng C\u1ee7a Refresh Token<\/b><\/h2>\n<figure id=\"attachment_6882\" aria-describedby=\"caption-attachment-6882\" style=\"width: 800px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-6882 size-full\" src=\"https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Co-che-hoat-dong-cua-Refresh-Token_-Mo-ta-quy-trinh-cap-moi-access-token-de-nguoi-doc-hieu-sau-hon-refresh-token-la-gi-va-cach-no-van-hanh.png\" alt=\"Co-che-hoat-dong-cua-Refresh-Token-Mo-ta-quy-trinh-cap-moi-access-token-de-nguoi-doc-hieu-sau-hon-refresh-token-la-gi-va-cach-no-van-hanh\" width=\"800\" height=\"500\" title=\"\" srcset=\"https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Co-che-hoat-dong-cua-Refresh-Token_-Mo-ta-quy-trinh-cap-moi-access-token-de-nguoi-doc-hieu-sau-hon-refresh-token-la-gi-va-cach-no-van-hanh.png 800w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Co-che-hoat-dong-cua-Refresh-Token_-Mo-ta-quy-trinh-cap-moi-access-token-de-nguoi-doc-hieu-sau-hon-refresh-token-la-gi-va-cach-no-van-hanh-300x188.png 300w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Co-che-hoat-dong-cua-Refresh-Token_-Mo-ta-quy-trinh-cap-moi-access-token-de-nguoi-doc-hieu-sau-hon-refresh-token-la-gi-va-cach-no-van-hanh-150x94.png 150w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Co-che-hoat-dong-cua-Refresh-Token_-Mo-ta-quy-trinh-cap-moi-access-token-de-nguoi-doc-hieu-sau-hon-refresh-token-la-gi-va-cach-no-van-hanh-768x480.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-6882\" class=\"wp-caption-text\">C\u01a1 ch\u1ebf ho\u1ea1t \u0111\u1ed9ng c\u1ee7a Refresh Token_ M\u00f4 t\u1ea3 quy tr\u00ecnh c\u1ea5p m\u1edbi access token \u0111\u1ec3 ng\u01b0\u1eddi \u0111\u1ecdc hi\u1ec3u s\u00e2u h\u01a1n refresh token l\u00e0 g\u00ec v\u00e0 c\u00e1ch n\u00f3 v\u1eadn h\u00e0nh<\/figcaption><\/figure>\n<h3><b>Lu\u1ed3ng OAuth2.0: Authorization \u2192 Access Token \u2192 Refresh Token<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">\u0110\u1ec3 hi\u1ec3u s\u00e2u <\/span><b>refresh token l\u00e0 g\u00ec<\/b><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">c\u01a1 ch\u1ebf Refresh token<\/span><span style=\"font-weight: 400;\"> c\u1ea7n n\u1eafm c\u00e1ch n\u00f3 \u0111\u01b0\u1ee3c t\u1ea1o ra trong OAuth2.0. Khi ng\u01b0\u1eddi d\u00f9ng \u0111\u0103ng nh\u1eadp, h\u1ec7 th\u1ed1ng \u1ee7y quy\u1ec1n c\u1ea5p m\u1ed9t access token ng\u1eafn h\u1ea1n v\u00e0 m\u1ed9t refresh token d\u00e0i h\u1ea1n. M\u1ed7i khi access token h\u1ebft h\u1ea1n, \u1ee9ng d\u1ee5ng g\u1eedi refresh token l\u00ean m\u00e1y ch\u1ee7 \u0111\u1ec3 xin token m\u1edbi, kh\u00f4ng c\u1ea7n ng\u01b0\u1eddi d\u00f9ng \u0111\u0103ng nh\u1eadp l\u1ea1i.<\/span><\/p>\n<h3><b>Chu k\u1ef3: c\u1ea5p \u2013 s\u1eed d\u1ee5ng \u2013 gia h\u1ea1n \u2013 thu h\u1ed3i<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Refresh token tr\u1ea3i qua m\u1ed9t chu k\u1ef3 g\u1ed3m t\u1ea1o m\u1edbi, d\u00f9ng \u0111\u1ec3 gia h\u1ea1n access token v\u00e0 b\u1ecb thu h\u1ed3i khi kh\u00f4ng c\u00f2n h\u1ee3p l\u1ec7. Lu\u1ed3ng ho\u1ea1t \u0111\u1ed9ng n\u00e0y gi\u00fap h\u1ec7 th\u1ed1ng duy tr\u00ec b\u1ea3o m\u1eadt v\u00e0 \u0111\u1ea3m b\u1ea3o refresh token kh\u00f4ng b\u1ecb s\u1eed d\u1ee5ng sai m\u1ee5c \u0111\u00edch. Vi\u1ec7c hi\u1ec3u r\u00f5 chu k\u1ef3 n\u00e0y gi\u00fap b\u1ea1n bi\u1ebft ch\u00ednh x\u00e1c <\/span><b>refresh token d\u00f9ng \u0111\u1ec3 l\u00e0m g\u00ec<\/b><span style=\"font-weight: 400;\"> trong ki\u1ebfn tr\u00fac hi\u1ec7n \u0111\u1ea1i.<\/span><\/p>\n<h3><b>Khi n\u00e0o access token h\u1ebft h\u1ea1n?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Access token th\u01b0\u1eddng h\u1ebft h\u1ea1n sau v\u00e0i ph\u00fat \u0111\u1ebfn v\u00e0i gi\u1edd \u0111\u1ec3 tr\u00e1nh r\u1ee7i ro b\u1ecb \u0111\u00e1nh c\u1eafp. Khi x\u00e1c th\u1ef1c th\u1ea5t b\u1ea1i v\u00ec h\u1ebft h\u1ea1n, backend s\u1ebd y\u00eau c\u1ea7u refresh token \u0111\u1ec3 t\u1ea1o m\u1edbi. \u0110\u00e2y l\u00e0 c\u01a1 ch\u1ebf b\u1ea3o m\u1eadt b\u1eaft bu\u1ed9c, v\u00e0 l\u00e0 l\u00fd do <\/span><b>refresh token l\u00e0 g\u00ec<\/b><span style=\"font-weight: 400;\"> tr\u1edf th\u00e0nh c\u00e2u h\u1ecfi quan tr\u1ecdng khi thi\u1ebft k\u1ebf API.<\/span><\/p>\n<h3><b>Khi n\u00e0o server t\u1eeb ch\u1ed1i refresh token?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">M\u00e1y ch\u1ee7 c\u00f3 th\u1ec3 t\u1eeb ch\u1ed1i refresh token khi token h\u1ebft h\u1ea1n, b\u1ecb thu h\u1ed3i, b\u1ecb s\u1eed d\u1ee5ng t\u1eeb thi\u1ebft b\u1ecb l\u1ea1 ho\u1eb7c vi ph\u1ea1m ch\u00ednh s\u00e1ch b\u1ea3o m\u1eadt. \u0110\u00e2y l\u00e0 ph\u1ea7n quan tr\u1ecdng trong c\u01a1 ch\u1ebf b\u1ea3o m\u1eadt token c\u1ee7a OAuth, \u0111\u1eb7c bi\u1ec7t v\u1edbi c\u00e1c h\u1ec7 th\u1ed1ng l\u1edbn.<\/span><\/p>\n<h3><b>Token rotation (chu\u1ea9n b\u1ea3o m\u1eadt m\u1edbi c\u1ee7a OAuth 2.1)<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Token rotation t\u1ea1o m\u1ed9t refresh token m\u1edbi m\u1ed7i l\u1ea7n s\u1eed d\u1ee5ng \u0111\u1ec3 h\u1ea1n ch\u1ebf t\u1ea5n c\u00f4ng \u0111\u00e1nh c\u1eafp token. N\u1ebfu token c\u0169 b\u1ecb hacker chi\u1ebfm \u0111\u01b0\u1ee3c, h\u1ec7 th\u1ed1ng s\u1ebd ph\u00e1t hi\u1ec7n ngay v\u00e0 v\u00f4 hi\u1ec7u h\u00f3a. \u0110\u00e2y l\u00e0 l\u00fd do m\u1ecdi t\u00e0i li\u1ec7u gi\u1ea3i th\u00edch <\/span><b>refresh token l\u00e0 g\u00ec<\/b><span style=\"font-weight: 400;\"> \u0111\u1ec1u nh\u1ea5n m\u1ea1nh t\u00ednh quan tr\u1ecdng c\u1ee7a rotation.<\/span><\/p>\n<h2><b>Refresh Token (JWT) \u2013 C\u00f3 N\u00ean D\u00f9ng Kh\u00f4ng?<\/b><\/h2>\n<figure id=\"attachment_6883\" aria-describedby=\"caption-attachment-6883\" style=\"width: 800px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-6883 size-full\" src=\"https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-JWT-\u2013-Co-nen-dung-khong_-Danh-gia-uu-\u2013-nhuoc-diem-de-quyet-dinh-refresh-token-la-gi-va-khi-nao-nen-ap-dung.png\" alt=\"Refresh-Token-JWT-\u2013-Co-nen-dung-khong-Danh-gia-uu-\u2013-nhuoc-diem-de-quyet-dinh-refresh-token-la-gi-va-khi-nao-nen-ap-dung\" width=\"800\" height=\"500\" title=\"\" srcset=\"https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-JWT-\u2013-Co-nen-dung-khong_-Danh-gia-uu-\u2013-nhuoc-diem-de-quyet-dinh-refresh-token-la-gi-va-khi-nao-nen-ap-dung.png 800w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-JWT-\u2013-Co-nen-dung-khong_-Danh-gia-uu-\u2013-nhuoc-diem-de-quyet-dinh-refresh-token-la-gi-va-khi-nao-nen-ap-dung-300x188.png 300w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-JWT-\u2013-Co-nen-dung-khong_-Danh-gia-uu-\u2013-nhuoc-diem-de-quyet-dinh-refresh-token-la-gi-va-khi-nao-nen-ap-dung-150x94.png 150w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-JWT-\u2013-Co-nen-dung-khong_-Danh-gia-uu-\u2013-nhuoc-diem-de-quyet-dinh-refresh-token-la-gi-va-khi-nao-nen-ap-dung-768x480.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-6883\" class=\"wp-caption-text\">Refresh Token (JWT) \u2013 C\u00f3 n\u00ean d\u00f9ng kh\u00f4ng_ \u0110\u00e1nh gi\u00e1 \u01b0u \u2013 nh\u01b0\u1ee3c \u0111i\u1ec3m \u0111\u1ec3 quy\u1ebft \u0111\u1ecbnh refresh token l\u00e0 g\u00ec v\u00e0 khi n\u00e0o n\u00ean \u00e1p d\u1ee5ng<\/figcaption><\/figure>\n<h3><b>Refresh token d\u1ea1ng JWT l\u00e0 g\u00ec?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">M\u1ed9t s\u1ed1 h\u1ec7 th\u1ed1ng s\u1eed d\u1ee5ng JWT l\u00e0m refresh token, ch\u1ee9a th\u00f4ng tin m\u00e3 h\u00f3a v\u00e0 c\u00f3 ch\u1eef k\u00fd s\u1ed1. Tuy nhi\u00ean khi ph\u00e2n t\u00edch <\/span><b>refresh token l\u00e0 g\u00ec<\/b><span style=\"font-weight: 400;\">, b\u1ea1n s\u1ebd th\u1ea5y JWT kh\u00f4ng ph\u1ea3i l\u1ef1a ch\u1ecdn t\u1ed1t nh\u1ea5t v\u00ec kh\u00f3 thu h\u1ed3i v\u00e0 mang nhi\u1ec1u th\u00f4ng tin nh\u1ea1y c\u1ea3m.<\/span><\/p>\n<h3><b>\u01afu \u0111i\u1ec3m<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">JWT l\u00e0m refresh token gi\u00fap x\u00e1c th\u1ef1c nhanh h\u01a1n v\u00e0 gi\u1ea3m truy c\u1eadp v\u00e0o c\u01a1 s\u1edf d\u1eef li\u1ec7u. C\u01a1 ch\u1ebf k\u00fd s\u1ed1 c\u0169ng \u0111\u1ea3m b\u1ea3o token kh\u00f4ng b\u1ecb gi\u1ea3 m\u1ea1o. Nh\u01b0ng \u0111i\u1ec1u n\u00e0y \u0111i k\u00e8m nhi\u1ec1u h\u1ea1n ch\u1ebf trong th\u1ef1c t\u1ebf.<\/span><\/p>\n<h3><b>Nh\u01b0\u1ee3c \u0111i\u1ec3m<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Refresh token (JWT) kh\u00f3 thu h\u1ed3i v\u00e0 d\u1ec5 l\u1ed9 d\u1eef li\u1ec7u n\u1ebfu b\u1ecb gi\u1ea3i m\u00e3. N\u1ebfu h\u1ec7 th\u1ed1ng kh\u00f4ng thi\u1ebft k\u1ebf \u0111\u00fang, hacker c\u00f3 th\u1ec3 d\u00f9ng token \u0111\u1ebfn khi h\u1ebft h\u1ea1n. \u0110\u00e2y l\u00e0 l\u00fd do nhi\u1ec1u chuy\u00ean gia b\u1ea3o m\u1eadt kh\u00f4ng khuy\u1ebfn kh\u00edch d\u00f9ng JWT l\u00e0m refresh token.<\/span><\/p>\n<h3><b>Tr\u01b0\u1eddng h\u1ee3p n\u00ean d\u00f9ng JWT l\u00e0m refresh token<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">JWT ph\u00f9 h\u1ee3p trong h\u1ec7 th\u1ed1ng kh\u00f4ng y\u00eau c\u1ea7u thu h\u1ed3i token ngay l\u1eadp t\u1ee9c ho\u1eb7c ho\u1ea1t \u0111\u1ed9ng offline-first. Tuy nhi\u00ean b\u1ea1n ph\u1ea3i k\u1ebft h\u1ee3p rotation v\u00e0 c\u01a1 ch\u1ebf blacklist \u0111\u1ec3 tr\u00e1nh l\u1ed9 l\u1ecdt d\u1eef li\u1ec7u.<\/span><\/p>\n<h3><b>Tr\u01b0\u1eddng h\u1ee3p KH\u00d4NG n\u00ean d\u00f9ng JWT cho refresh token<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Kh\u00f4ng n\u00ean d\u00f9ng JWT cho refresh token khi d\u1eef li\u1ec7u nh\u1ea1y c\u1ea3m, y\u00eau c\u1ea7u thu h\u1ed3i ngay l\u1eadp t\u1ee9c ho\u1eb7c khi m\u1ee9c \u0111\u1ed9 b\u1ea3o m\u1eadt c\u1ea7n cao. \u0110\u00e2y l\u00e0 khuy\u1ebfn ngh\u1ecb ph\u1ed5 bi\u1ebfn trong m\u1ecdi t\u00e0i li\u1ec7u v\u1ec1 b\u1ea3o m\u1eadt token trong h\u1ec7 th\u1ed1ng web.<\/span><\/p>\n<h2><b>Refresh Token L\u01b0u \u1ede \u0110\u00e2u L\u00e0 An To\u00e0n Nh\u1ea5t?<\/b><\/h2>\n<figure id=\"attachment_6884\" aria-describedby=\"caption-attachment-6884\" style=\"width: 800px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-6884 size-full\" src=\"https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-luu-o-dau-la-an-toan-nhat_-So-sanh-cac-phuong-an-luu-tru-giup-dam-bao-bao-mat-khi-trien-khai-refresh-token-la-gi.png\" alt=\"Refresh-Token-luu-o-dau-la-an-toan-nhat-So-sanh-cac-phuong-an-luu-tru-giup-dam-bao-bao-mat-khi-trien-khai-refresh-token-la-gi\" width=\"800\" height=\"500\" title=\"\" srcset=\"https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-luu-o-dau-la-an-toan-nhat_-So-sanh-cac-phuong-an-luu-tru-giup-dam-bao-bao-mat-khi-trien-khai-refresh-token-la-gi.png 800w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-luu-o-dau-la-an-toan-nhat_-So-sanh-cac-phuong-an-luu-tru-giup-dam-bao-bao-mat-khi-trien-khai-refresh-token-la-gi-300x188.png 300w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-luu-o-dau-la-an-toan-nhat_-So-sanh-cac-phuong-an-luu-tru-giup-dam-bao-bao-mat-khi-trien-khai-refresh-token-la-gi-150x94.png 150w, https:\/\/onfa.us\/wp-content\/uploads\/2026\/03\/Refresh-Token-luu-o-dau-la-an-toan-nhat_-So-sanh-cac-phuong-an-luu-tru-giup-dam-bao-bao-mat-khi-trien-khai-refresh-token-la-gi-768x480.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-6884\" class=\"wp-caption-text\">Refresh Token l\u01b0u \u1edf \u0111\u00e2u l\u00e0 an to\u00e0n nh\u1ea5t_ So s\u00e1nh c\u00e1c ph\u01b0\u01a1ng \u00e1n l\u01b0u tr\u1eef gi\u00fap \u0111\u1ea3m b\u1ea3o b\u1ea3o m\u1eadt khi tri\u1ec3n khai refresh token l\u00e0 g\u00ec<\/figcaption><\/figure>\n<h3><b>So s\u00e1nh c\u00e1c n\u01a1i l\u01b0u tr\u1eef<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Khi nghi\u00ean c\u1ee9u <\/span><b>refresh token l\u00e0 g\u00ec<\/b><span style=\"font-weight: 400;\">, v\u1ecb tr\u00ed l\u01b0u tr\u1eef l\u00e0 v\u1ea5n \u0111\u1ec1 s\u1ed1ng c\u00f2n. LocalStorage d\u1ec5 b\u1ecb XSS, c\u00f2n sessionStorage b\u1ecb m\u1ea5t khi \u0111\u00f3ng tab. Cookie HttpOnly th\u01b0\u1eddng l\u00e0 l\u1ef1a ch\u1ecdn an to\u00e0n nh\u1ea5t v\u00ec kh\u00f4ng th\u1ec3 truy c\u1eadp b\u1eb1ng JavaScript.<\/span><\/p>\n<h3><b>L\u1ed7i ch\u1ebft ng\u01b0\u1eddi: l\u01b0u refresh token trong localStorage<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">L\u01b0u refresh token trong localStorage khi\u1ebfn hacker d\u1ec5 d\u00e0ng l\u1ea5y c\u1eafp khi trang b\u1ecb d\u00ednh XSS. \u0110\u00e2y l\u00e0 sai l\u1ea7m m\u00e0 nhi\u1ec1u l\u1eadp tr\u00ecnh vi\u00ean m\u1edbi m\u1eafc ph\u1ea3i. Trong m\u1ecdi t\u00e0i li\u1ec7u b\u1ea3o m\u1eadt, \u0111\u00e2y \u0111\u01b0\u1ee3c xem l\u00e0 l\u1ed7i nghi\u00eam tr\u1ecdng nh\u1ea5t.<\/span><\/p>\n<h3><b>N\u00ean d\u00f9ng cookie + backend rotation \u0111\u1ec3 ch\u1ed1ng XSS<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">C\u00e1ch an to\u00e0n nh\u1ea5t l\u00e0 l\u01b0u refresh token trong cookie HttpOnly k\u1ebft h\u1ee3p rotation \u1edf backend. Khi token b\u1ecb l\u1ed9, h\u1ec7 th\u1ed1ng s\u1ebd ngay l\u1eadp t\u1ee9c v\u00f4 hi\u1ec7u h\u00f3a token c\u0169 v\u00e0 ph\u00e1t hi\u1ec7n b\u1ea5t th\u01b0\u1eddng.<\/span><\/p>\n<h3><b>V\u00ec sao cookie HttpOnly \u0111\u01b0\u1ee3c c\u1ed9ng \u0111\u1ed3ng b\u1ea3o m\u1eadt khuy\u00ean d\u00f9ng<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Cookie HttpOnly kh\u00f4ng th\u1ec3 b\u1ecb truy c\u1eadp b\u1edfi JavaScript n\u00ean ch\u1ed1ng XSS r\u1ea5t t\u1ed1t. \u0110\u00e2y l\u00e0 l\u00fd do d\u00f9ng cookie l\u00e0 ti\u00eau chu\u1ea9n cho m\u1ecdi h\u1ec7 th\u1ed1ng x\u00e1c th\u1ef1c l\u1edbn nh\u01b0 Google, Facebook.<\/span><\/p>\n<h2><b>M\u1ed1i Quan H\u1ec7 Gi\u1eefa Access Token \u2013 Refresh Token \u2013 JWT<\/b><\/h2>\n<h3><b>Access Token c\u00f3 th\u1ec3 l\u00e0 JWT<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Ph\u1ea7n l\u1edbn access token l\u00e0 JWT \u0111\u1ec3 gi\u00fap API server x\u00e1c minh ch\u1eef k\u00fd nhanh. Vi\u1ec7c n\u00e0y kh\u00f4ng \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn refresh token, nh\u01b0ng b\u1ea1n v\u1eabn c\u1ea7n hi\u1ec3u r\u00f5<\/span><b> refresh token l\u00e0 g\u00ec<\/b><span style=\"font-weight: 400;\"> \u0111\u1ec3 x\u1eed l\u00fd \u0111\u00fang lu\u1ed3ng x\u00e1c th\u1ef1c.<\/span><\/p>\n<h3><b>Refresh Token c\u00f3 th\u1ec3 l\u00e0 chu\u1ed7i ng\u1eabu nhi\u00ean (opaque token)<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Chu\u1ed7i ng\u1eabu nhi\u00ean gi\u00fap d\u1ec5 thu h\u1ed3i, gi\u1ea3m r\u1ee7i ro l\u1ed9 th\u00f4ng tin. \u0110\u00e2y l\u00e0 c\u00e1ch ho\u1ea1t \u0111\u1ed9ng ph\u1ed5 bi\u1ebfn c\u1ee7a c\u00e1c n\u1ec1n t\u1ea3ng l\u1edbn nh\u01b0 Auth0 v\u00e0 AWS Cognito.<\/span><\/p>\n<h3><b>T\u1ea1i sao kh\u00f4ng n\u00ean l\u01b0u th\u00f4ng tin nh\u1ea1y c\u1ea3m trong refresh token<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">N\u1ebfu ch\u1ee9a d\u1eef li\u1ec7u quan tr\u1ecdng, refresh token d\u1ec5 tr\u1edf th\u00e0nh m\u1ee5c ti\u00eau t\u1ea5n c\u00f4ng. Hacker c\u00f3 th\u1ec3 tr\u00edch xu\u1ea5t claim v\u00e0 d\u00f9ng \u0111\u1ec3 khai th\u00e1c h\u1ec7 th\u1ed1ng.<\/span><\/p>\n<h3><b>JSON Web Token: \u01b0u, nh\u01b0\u1ee3c, r\u1ee7i ro<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">JWT c\u00f3 hi\u1ec7u n\u0103ng cao v\u00e0 d\u1ec5 d\u00f9ng, nh\u01b0ng c\u0169ng c\u00f3 r\u1ee7i ro l\u1edbn n\u1ebfu th\u1eddi h\u1ea1n qu\u00e1 d\u00e0i. Vi\u1ec7c k\u1ebft h\u1ee3p access token ng\u1eafn h\u1ea1n v\u00e0 refresh token d\u00e0i h\u1ea1n gi\u00fap h\u1ec7 th\u1ed1ng c\u00e2n b\u1eb1ng gi\u1eefa an to\u00e0n v\u00e0 tr\u1ea3i nghi\u1ec7m.<\/span><\/p>\n<h2><b>C\u00e1c M\u00f4 H\u00ecnh B\u1ea3o M\u1eadt Token Trong H\u1ec7 Th\u1ed1ng Web<\/b><\/h2>\n<h3><b>Why Access Token th\u01b0\u1eddng ng\u1eafn h\u1ea1n?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Access token ng\u1eafn h\u1ea1n gi\u1ea3m r\u1ee7i ro khi hacker \u0111\u00e1nh c\u1eafp token. \u0110\u00e2y l\u00e0 nguy\u00ean t\u1eafc quan tr\u1ecdng khi thi\u1ebft k\u1ebf x\u00e1c th\u1ef1c. Nh\u1edd refresh token, h\u1ec7 th\u1ed1ng v\u1eabn gi\u1eef tr\u1ea3i nghi\u1ec7m m\u01b0\u1ee3t m\u00e0.<\/span><\/p>\n<h3><b>V\u00ec sao Refresh Token c\u1ea7n b\u1ea3o m\u1eadt \u1edf m\u1ee9c cao nh\u1ea5t<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Refresh token c\u1ea5p l\u1ea1i access token n\u00ean \u0111\u1ed9 nh\u1ea1y c\u1ea3m r\u1ea5t cao. Vi\u1ec7c hi\u1ec3u refresh token l\u00e0 g\u00ec gi\u00fap b\u1ea1n bi\u1ebft r\u1eb1ng token n\u00e0y ph\u1ea3i \u0111\u01b0\u1ee3c b\u1ea3o v\u1ec7 b\u1eb1ng cookie HttpOnly, rotation v\u00e0 IP\/device binding.<\/span><\/p>\n<h3><b>Token rotation &amp; IP\/device binding<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Rotation gi\u00fap thay token m\u1ed7i l\u1ea7n s\u1eed d\u1ee5ng. K\u1ebft h\u1ee3p IP binding gi\u00fap ch\u1ed1ng vi\u1ec7c d\u00f9ng token t\u1eeb v\u1ecb tr\u00ed l\u1ea1. \u0110\u00e2y l\u00e0 k\u1ef9 thu\u1eadt b\u1ea3o m\u1eadt ti\u00ean ti\u1ebfn \u0111\u01b0\u1ee3c OAuth 2.1 khuy\u1ebfn ngh\u1ecb.<\/span><\/p>\n<h3><b>Token blacklist, whitelist &amp; database invalidation<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Danh s\u00e1ch \u0111en gi\u00fap thu h\u1ed3i token ngay l\u1eadp t\u1ee9c. Danh s\u00e1ch tr\u1eafng gi\u1edbi h\u1ea1n token h\u1ee3p l\u1ec7 theo phi\u00ean \u0111\u0103ng nh\u1eadp. \u0110\u00e2y l\u00e0 n\u1ec1n t\u1ea3ng c\u1ee7a b\u1ea3o m\u1eadt API.<\/span><\/p>\n<h3><b>C\u00e1ch API server x\u00e1c minh access token &amp; refresh token<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">API server x\u00e1c minh ch\u1eef k\u00fd JWT khi access token \u0111\u1ebfn. Khi refresh token \u0111\u01b0\u1ee3c d\u00f9ng, h\u1ec7 th\u1ed1ng ki\u1ec3m tra trong c\u01a1 s\u1edf d\u1eef li\u1ec7u \u0111\u1ec3 x\u00e1c minh t\u00ednh h\u1ee3p l\u1ec7.<\/span><\/p>\n<h2><b>C\u00e1c Sai L\u1ea7m Nguy Hi\u1ec3m Khi S\u1eed D\u1ee5ng Refresh Token<\/b><\/h2>\n<h3><b>L\u01b0u token trong localStorage \u2192 d\u1ec5 b\u1ecb XSS l\u1ea5y c\u1eafp<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">\u0110\u00e2y l\u00e0 l\u1ed7i ph\u1ed5 bi\u1ebfn nh\u1ea5t. Khi b\u1ecb XSS, hacker l\u1ea5y tr\u1ecdn refresh token v\u00e0 chi\u1ebfm t\u00e0i kho\u1ea3n v\u0129nh vi\u1ec5n.<\/span><\/p>\n<h3><b>Kh\u00f4ng rotation token \u2192 hacker chi\u1ebfm t\u00e0i kho\u1ea3n v\u0129nh vi\u1ec5n<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Kh\u00f4ng xoay v\u00f2ng token khi\u1ebfn vi\u1ec7c l\u1ed9 token tr\u1edf n\u00ean c\u1ef1c k\u1ef3 nguy hi\u1ec3m. Rotation l\u00e0 b\u1eaft bu\u1ed9c trong m\u1ecdi h\u1ec7 th\u1ed1ng hi\u1ec7n \u0111\u1ea1i.<\/span><\/p>\n<h3><b>D\u00f9ng refresh token qu\u00e1 d\u00e0i h\u1ea1n<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Refresh token qu\u00e1 d\u00e0i h\u1ea1n t\u0103ng kh\u1ea3 n\u0103ng b\u1ecb \u0111\u00e1nh c\u1eafp. Th\u1eddi h\u1ea1n h\u1ee3p l\u00fd th\u01b0\u1eddng l\u00e0 15\u201330 ng\u00e0y.<\/span><\/p>\n<h3><b>Tr\u1ea3 token b\u1eb1ng JSON t\u1eeb API (kh\u00f4ng b\u1ea3o m\u1eadt)<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Kh\u00f4ng n\u00ean tr\u1ea3 refresh token trong JSON. Cookie HttpOnly m\u1edbi l\u00e0 chu\u1ea9n.<\/span><\/p>\n<h2><b>V\u00ed D\u1ee5 D\u1ec5 Hi\u1ec3u: Lu\u1ed3ng L\u00e0m M\u1edbi Access Token<\/b><\/h2>\n<h3><b>V\u00ed d\u1ee5 SPA (React\/Vue)<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">SPA l\u01b0u access token trong memory v\u00e0 refresh token trong cookie. Khi access token h\u1ebft h\u1ea1n, frontend g\u1ecdi API <\/span><span style=\"font-weight: 400;\">\/refresh<\/span><span style=\"font-weight: 400;\"> \u0111\u1ec3 l\u1ea5y token m\u1edbi.<\/span><\/p>\n<h3><b>V\u00ed d\u1ee5 Mobile App<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">\u1ee8ng d\u1ee5ng mobile l\u01b0u refresh token trong secure storage. \u0110\u00e2y l\u00e0 c\u00e1ch t\u1ed1i \u01b0u nh\u1ea5t \u0111\u1ec3 ch\u1ed1ng l\u1ed9 token.<\/span><\/p>\n<h3><b>V\u00ed d\u1ee5 Backend (Node.js\/Java\/PHP)<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Backend l\u01b0u refresh token trong DB v\u00e0 x\u00e1c minh trong m\u1ed7i l\u1ea7n l\u00e0m m\u1edbi. \u0110\u00e2y l\u00e0 m\u00f4 h\u00ecnh \u0111\u01a1n gi\u1ea3n nh\u01b0ng an to\u00e0n.<\/span><\/p>\n<h3><b>V\u00ed d\u1ee5 API minh h\u1ecda (JSON request\/response)<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Request <\/span><span style=\"font-weight: 400;\">\/refresh<\/span><span style=\"font-weight: 400;\">: g\u1eedi refresh token trong cookie.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"> Response: tr\u1ea3 v\u1ec1 access token m\u1edbi v\u00e0 rotation refresh token.<\/span><\/p>\n<h2><b>K\u1ebft Lu\u1eadn<\/b><\/h2>\n<p><span style=\"font-weight: 400;\">Hi\u1ec3u r\u00f5 r<\/span><b>efresh token l\u00e0 g\u00ec<\/b><span style=\"font-weight: 400;\"> gi\u00fap b\u1ea1n thi\u1ebft k\u1ebf h\u1ec7 th\u1ed1ng x\u00e1c th\u1ef1c an to\u00e0n v\u00e0 m\u01b0\u1ee3t m\u00e0 h\u01a1n. Refresh token h\u1ed7 tr\u1ee3 t\u1ea1o m\u1edbi access token, duy tr\u00ec phi\u00ean \u0111\u0103ng nh\u1eadp v\u00e0 t\u0103ng m\u1ee9c \u0111\u1ed9 b\u1ea3o m\u1eadt. Khi \u00e1p d\u1ee5ng \u0111\u00fang c\u00e1ch \u2014 \u0111\u1eb7c bi\u1ec7t trong web app, mobile app v\u00e0 API \u2014 refresh token s\u1ebd c\u1ea3i thi\u1ec7n tr\u1ea3i nghi\u1ec7m ng\u01b0\u1eddi d\u00f9ng v\u00e0 b\u1ea3o v\u1ec7 h\u1ec7 th\u1ed1ng to\u00e0n di\u1ec7n h\u01a1n.<\/span><\/p>\n<h2><b>FAQ<\/b><\/h2>\n<h3><b>Refresh token c\u00f3 th\u1eddi h\u1ea1n bao l\u00e2u?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Th\u01b0\u1eddng t\u1eeb 7\u201330 ng\u00e0y t\u00f9y h\u1ec7 th\u1ed1ng. M\u1ed9t s\u1ed1 d\u1ecbch v\u1ee5 d\u00f9ng rotation \u0111\u1ec3 k\u00e9o d\u00e0i th\u1eddi gian s\u1eed d\u1ee5ng.<\/span><\/p>\n<h3><b>Access token h\u1ebft h\u1ea1n th\u00ec sao?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Frontend g\u1ecdi endpoint <\/span><span style=\"font-weight: 400;\">\/refresh<\/span><span style=\"font-weight: 400;\"> \u0111\u1ec3 t\u1ea1o token m\u1edbi. \u0110\u00e2y l\u00e0 c\u01a1 ch\u1ebf ch\u00ednh c\u1ee7a refresh token.<\/span><\/p>\n<h3><b>Refresh token c\u00f3 th\u1ec3 b\u1ecb hack kh\u00f4ng?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">C\u00f3. Do \u0111\u00f3 l\u01b0u trong cookie HttpOnly l\u00e0 b\u1eaft bu\u1ed9c.<\/span><\/p>\n<h3><b>C\u00f3 th\u1ec3 l\u01b0u refresh token trong cookie kh\u00f4ng?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">C\u00f3. \u0110\u00e2y l\u00e0 c\u00e1ch \u0111\u01b0\u1ee3c khuy\u1ebfn ngh\u1ecb r\u1ed9ng r\u00e3i.<\/span><\/p>\n<h3><b>L\u00e0m sao bi\u1ebft refresh token b\u1ecb l\u1ed9?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Server ph\u00e1t hi\u1ec7n khi token b\u1ecb d\u00f9ng t\u1eeb thi\u1ebft b\u1ecb l\u1ea1 ho\u1eb7c IP b\u1ea5t th\u01b0\u1eddng.<\/span><\/p>\n<h3><b>Refresh token c\u00f3 th\u1ec3 d\u00f9ng nhi\u1ec1u l\u1ea7n kh\u00f4ng?<\/b><\/h3>\n<p><span style=\"font-weight: 400;\">Kh\u00f4ng. V\u1edbi rotation, m\u1ed7i token ch\u1ec9 d\u00f9ng \u0111\u00fang 1 l\u1ea7n.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hi\u1ec3u \u0111\u00fang refresh token l\u00e0 g\u00ec l\u00e0 b\u01b0\u1edbc n\u1ec1n t\u1ea3ng \u0111\u1ec3 x\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng x\u00e1c th\u1ef1c an to\u00e0n, \u0111\u1eb7c bi\u1ec7t khi \u1ee9ng d\u1ee5ng c\u1ea7n duy tr\u00ec \u0111\u0103ng nh\u1eadp d\u00e0i h\u1ea1n cho ng\u01b0\u1eddi d\u00f9ng. Refresh token cho ph\u00e9p b\u1ea1n t\u1ea1o m\u1edbi access token m\u00e0 kh\u00f4ng y\u00eau c\u1ea7u \u0111\u0103ng nh\u1eadp l\u1ea1i, gi\u00fap tr\u1ea3i nghi\u1ec7m m\u01b0\u1ee3t h\u01a1n [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":6885,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-6879","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-knowledge"],"_links":{"self":[{"href":"https:\/\/onfa.us\/vi\/wp-json\/wp\/v2\/posts\/6879","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/onfa.us\/vi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/onfa.us\/vi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/onfa.us\/vi\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/onfa.us\/vi\/wp-json\/wp\/v2\/comments?post=6879"}],"version-history":[{"count":1,"href":"https:\/\/onfa.us\/vi\/wp-json\/wp\/v2\/posts\/6879\/revisions"}],"predecessor-version":[{"id":6886,"href":"https:\/\/onfa.us\/vi\/wp-json\/wp\/v2\/posts\/6879\/revisions\/6886"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/onfa.us\/vi\/wp-json\/wp\/v2\/media\/6885"}],"wp:attachment":[{"href":"https:\/\/onfa.us\/vi\/wp-json\/wp\/v2\/media?parent=6879"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/onfa.us\/vi\/wp-json\/wp\/v2\/categories?post=6879"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/onfa.us\/vi\/wp-json\/wp\/v2\/tags?post=6879"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}