Same Origin Policy (SOP)

- Đôi khi, khi thực hiện các lệnh trong Javascript, bạn có thể gặp một lỗi như thế này
- “Access to fetch at xxx from origin null has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.

- Mặc định thì, trình duyệt chỉ cho phép JavaScript gửi các HTTP request về phía server ở “cùng một nguồn – same origin” với chỗ mà script được load. Điều này được quy định bởi same-origin policy (SOP) – quy tắc 1 nguồn, đây là một tảng đá quan trọng trong bảo mật ứng dụng web.
- Nguồn của 1 trang web là tổng hợp bởi protocol, địa chỉ máy chủ, cổng của url. Nếu không có cổng thì cổng mặc định sẽ được dùng (http thì là 80, https là 443). Ví dụ: url https://www.google.com/search có protocol là https, địa chỉ máy chủ là www.google.com và cổng port là 443. Hai url được gọi là cùng nguồn (same origin) nếu protocol, host và port đều giống nhau
- Điều này giúp web được bảo mật hơn, vì các dữ liệu đều đảm bảo chỉ đến từ nguồn ta đang truy cập.
Vấn đề giả định
- Thông thường, bất kì request nào của chúng ta đều chứa các cookie. Ở các website hiện đại, các cookie này thường chứa các thông tin bảo mật, ví dụ như thông tin tài khoản mật khẩu, … Ví dụ bạn vào 1 website nào đó, sau khi đăng nhập và lần sau vào lại trang bạn không cần đăng nhập nữa, vì trình duyệt đã nhớ thông tin đó ở đâu đó để không cần nhập lại nữa. (Điều này sẽ phức tạp hơn, nhưng sẽ không đi sâu ở đây).
- Điều này dẫn đến 1 việc, khi bạn vào trang https://hacker.com chẳng hạn, trang này sẽ tự động gửi 1 request khác sang https://nganhang.com, request này lại đang chứa hết cookie, hay các thông tin của bạn. Và hacker.com có thể đọc trộm được thông tin của bạn khi request trả về.
- ĐIều này có thể được sửa chữa bằng Same Origin Policy bên trên, hoặc SameSite=Strict trong cookie, bắt buộc 1 request khi gửi sang 1 server khác, thì chỉ đang chạy trên web đó. (tức là ở nganhang.com mới được gửi request gì chứa thông tin sang nganhang.com) để bảo mật
- Tuy nhiên, giả sử bạn đang làm 1 hệ thống thông tin thời tiết ở web thoitiet.com, và bạn muốn bạn bè mình ở các trang như baochi.com, quochung.com có thể gọi tới lấy thông tin thì lại không được. Điều đó dẫn ta tới CORS
Cross-Origin Re-source Sharing (CORS)

- Tuy nhiên, trang web chúng ta ngày càng mở rộng, ta không chỉ xuất dữ liệu từ 1 trang tĩnh duy nhất nữa. Có thể ta muốn gọi api để lấy dữ liệu từ một trang báo gì đó để hiển thị trên trang của mình, ta cần lấy dữ liệu về số ca mắc covid 19 từ đâu đó, ta cần lấy thông tin thời tiết, … Lúc này ta sẽ đi đến lí thuyết CORS.

Preflight requests
- Hiểu đơn giản, CORS là một số quy định ta có thể cài đặt ở phía nhận dữ liệu, để thông báo là: tôi cho phép ông A, ông B lấy dữ liệu, vì ông này web nhà tôi, còn các ông C, D, E thì không
- Lúc này, phía client sẽ gửi trước một “preflight request” để xem, liệu mình có quyền được truy cập dữ liệu hay không.
- Định nghĩa: Preflight request là một request sẽ xảy ra do “bình thường” thì trình duyệt sẽ chặn các requets vi phạm SOP. Lúc này trình duyệt sẽ thực hiện 1 request OPTIONS tới server để xem request có được cho phép hay không. Server có thể deny hoặc allow request với một số limit về headers và method (ví dụ như method nào được dùng, header phải thế nào, …)

- Phía Server sẽ phản hồi bằng cách gửi về 1 request với header chứa thông tin rằng các thông số cross-origin như nào thì sẽ được chấp nhận. Nếu như request ban đầu không match với các điều kiện từ phía server, hoặc server không phản hồi 1 CORS header nào, trình duyệt sẽ chặn và k gửi request.
CORS Header
- Both tức là header này có thể tồn tại ở các phản hồi từ server khi nhận request thực sự (actual) và cả request preflight. còn nếu là actual tức là header chỉ tồn tại ở phản hồi từ server khi nhận actual request (request thật), preflight nghĩa là header chỉ tồn tại ở phản hồi từ server khi nhận preflight request.
Tham khảo:
![[Java Core] B3: Cách Java quản lý dữ liệu 16 Primitive data type](https://learning.oreilly.com/api/v2/epubs/urn:orm:book:9781492091646/files/assets/f0055-02.png)
![[Java Core] B3: Cách Java quản lý dữ liệu 17 image 6 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-6.png)
![[Java Core] B3: Cách Java quản lý dữ liệu 18 image 7 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-7.png)
![[Java Core] B3: Cách Java quản lý dữ liệu 19 image 8 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-8.png)
![[Java Core] B3: Cách Java quản lý dữ liệu 20 image 9 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-9.png)
![[Java Core] B3: Cách Java quản lý dữ liệu 21 image 13 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-13-1024x548.png)
![[Java Core] B2: Class và Object (Lớp và đối tượng) 23 f0035 01 - quochung.cyou PTIT](https://learning.oreilly.com/api/v2/epubs/urn:orm:book:9781492091646/files/assets/f0035-01.png)
![[Java Core] B2: Class và Object (Lớp và đối tượng) 25 access modifier trong java - quochung.cyou PTIT](https://viettuts.vn/images/java/access-modifier-trong-java.png)
![[Java Core] B2: Class và Object (Lớp và đối tượng) 26 - quochung.cyou PTIT](https://miro.medium.com/v2/resize:fit:500/1*x5UK5p0mqcr3EBKwlKNRwg.png)
![[Java Core] B2: Class và Object (Lớp và đối tượng) 27 f0055 06 - quochung.cyou PTIT](https://learning.oreilly.com/api/v2/epubs/urn:orm:book:9781492091646/files/assets/f0055-06.png)
![[Java Core] B2: Class và Object (Lớp và đối tượng) 28 f0057 01 - quochung.cyou PTIT](https://learning.oreilly.com/api/v2/epubs/urn:orm:book:9781492091646/files/assets/f0057-01.png)
![[Java Core] B2: Class và Object (Lớp và đối tượng) 29 image 4 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-4-1024x411.png)
![[Java Core] B2: Class và Object (Lớp và đối tượng) 30 image 5 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-5.png)
![[Java Core] B1: Tại sao nên học Java, syntax cơ bản 32 JDK JRE JVM - quochung.cyou PTIT](https://howtodoinjava.com/wp-content/uploads/2018/05/JDK-JRE-JVM.png)
![[Java Core] B1: Tại sao nên học Java, syntax cơ bản 33 image 3 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-3.png)
![[Java Core] B1: Tại sao nên học Java, syntax cơ bản 35 image 1 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image-1.png)
![[Java Core] B1: Tại sao nên học Java, syntax cơ bản 36 image - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/11/image.png)
![[Java Core] B1: Tại sao nên học Java, syntax cơ bản 37 JVM](https://docs.oracle.com/cd/E19683-01/806-7008/images/ch6_pkgarchivedirectory.epsi.gif)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 39 image 33 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-33.png)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 40 image 34 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-34.png)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 41 image 35 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-35.png)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 42 image 36 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-36.png)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 43 image 37 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-37.png)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 44 image 38 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-38-1024x518.png)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 45 image 39 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-39-1024x762.png)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 46 image 41 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-41.png)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 47 image 42 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-42-1024x547.png)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 48 image 43 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-43-1024x547.png)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 49 image 44 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-44.png)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 50 image 45 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-45-1024x548.png)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 51 image 46 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-46.png)
![[Java Memory 1] Escaping References trong Java, Call-by-value và sử dụng Defensive copying. Biến trong Java lưu thế nào 52 image 47 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/10/image-47-1024x644.png)






















![[Phần 1] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 81 image - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/09/image.png)
![[Phần 1] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 82 image 1 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/09/image-1-1024x280.png)
![[Phần 1] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 83 1 pd5bfxtxV9AK0 QlIOK6Vw - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/09/1_pd5bfxtxV9AK0-QlIOK6Vw.gif)
![[Phần 1] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 84 1 0Kq2jEHDWcfdeorqKPdYFQ - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/09/1_0Kq2jEHDWcfdeorqKPdYFQ.gif)
![[Phần 1] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 85 image 4 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/09/image-4-1024x137.png)
![[Phần 1] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 86 image 5 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/09/image-5-1024x228.png)
![[Phần 1] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 87 image 6 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/09/image-6-1024x575.png)
![[Phần 1] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 88 image 7 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/09/image-7-1024x277.png)
![[Phần 1] Sự phát triển của các mô hình hệ thống Backend (N-layered, DDD, Hexagon, Onion, Clean Architecture) 89 image 8 - quochung.cyou PTIT](https://quochung.cyou/wp-content/uploads/2023/09/image-8-1024x167.png)






