Làm thế nào các cookie được thông qua trong giao thức HTTP?


Câu trả lời:


296

Máy chủ sẽ gửi phần sau trong tiêu đề phản hồi của nó để đặt trường cookie.

Set-Cookie:tên =giá trị

Nếu có một tập hợp cookie, thì trình duyệt sẽ gửi phần sau trong tiêu đề yêu cầu của nó.

Cookie:tên =giá trị

Xem bài viết Cookie HTTP tại Wikipedia để biết thêm thông tin.


Có đúng là cookie chỉ hoạt động với động từ GET / POST chứ không phải KẾT NỐI?
PerlDev

5
@PerlDev Không có gì tôi có thể thấy trong rfc2109 nói rằng nó không nên hoạt động với các yêu cầu khác ngoài GET / POST, nhưng tôi nghi ngờ rằng việc triển khai trình duyệt và máy chủ có thể không triển khai trong các trường hợp đó.
bắt đầu từ

5
Lưu ý rằng theo RFC 2109 nếu một tác nhân người dùng hoặc trình duyệt gửi nhiều cookie, nó sẽ đặt chúng vào một trường duy nhất được phân cách bằng dấu chấm phẩy:Cookie: name1=value1; name2=value2; ...
jotrocken

34

Cookies được chuyển dưới dạng tiêu đề HTTP, cả trong yêu cầu (máy khách -> máy chủ) và trong phản hồi (máy chủ -> máy khách).


2
Vì vậy, trong bất kỳ yêu cầu nào được thực hiện, tất cả các cookie ipso facto được gửi?
BKSpurgeon

32

Ngoài những gì nó được viết trong các câu trả lời khác, các chi tiết khác liên quan đến đường dẫn của cookie, tuổi tối đa của cookie, cho dù nó được bảo mật hay không cũng được chuyển trong tiêu đề phản hồi Set-Cookie. Ví dụ:

Set-Cookie:tên =giá trị [ ; expires=ngày ] [ ; domain=tên miền ] [; path= đường dẫn ] [ ; secure]


Tuy nhiên, không phải tất cả các chi tiết này đều được máy khách gửi lại cho máy chủ khi thực hiện yêu cầu HTTP tiếp theo.

Bạn cũng có thể đặt HttpOnlycờ ở cuối cookie của mình để cho biết rằng cookie của bạn là httponly và không được phép truy cập, trong các tập lệnh bằng mã javascript. Điều này giúp ngăn chặn các cuộc tấn công như tấn công phiên.

Để biết thêm thông tin, xem RFC 2109 . Cũng có một cái nhìn về bài viết của Nicholas C. Zakas, cookie HTTP giải thích .


2
Đây là một liên kết trực tiếp đến bài viết của Zakas, chứ không phải là một liên kết ngược: humanwhocodes.com/blog/2009/05/05/http-cookies-explained
Joseph Dykstra

13

tạo tập lệnh ví dụ như resp:

#!/bin/bash

http_code=200
mime=text/html

echo -e "HTTP/1.1 $http_code OK\r"
echo "Content-type: $mime"
echo
echo "Set-Cookie: name=F"

sau đó thực hiện và thực thi như thế này.

./resp | nc -l -p 12346

mở trình duyệt và duyệt URL: http: // localhost: 1236 bạn sẽ thấy giá trị Cookie được gửi bởi Trình duyệt

    [aaa @ bbbbbbbb] $ ./resp | nc -l -p 12346
    NHẬN / HTTP / 1.1
    Máy chủ: xxx.xxx.xxx.xxx:12346
    Kết nối: giữ mạng
    Kiểm soát bộ nhớ cache: max-age = 0
    Chấp nhận: văn bản / html, ứng dụng / xhtml + xml, ứng dụng / xml; q = 0.9, hình ảnh / webp, * / *; q = 0.8
    Nâng cấp-Không an toàn-Yêu cầu: 1
    Tác nhân người dùng: Mozilla / 5.0 (Windows NT 6.1) AppleWebKit / 537.36 (KHTML, như tắc kè) Chrome / 49.0.2623.112 Safari / 537.36
    Mã hóa chấp nhận: gzip, def def, sdch
    Ngôn ngữ chấp nhận: en-US, en; q = 0.8, ru; q = 0.6
    Cookie: tên = F

3
Nếu có nhiều cookie thì sao? Có phải chúng được phân tách bằng dấu phẩy?
Đánh dấu Buikema

nghĩ rằng chúng được đặt làm cookie mới. Cookie: name = F Cookie: name = A
EAzevedo

2
@MarkBuikema, xem docs.microsoft.com/en-us/windows/desktop/wininet/http-cookies . Chúng được gửi như sau: Cookie: <name> = <value> [; <name> = <value>] ...
Ben Wheeler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.