레이블이 cookie인 게시물을 표시합니다. 모든 게시물 표시
레이블이 cookie인 게시물을 표시합니다. 모든 게시물 표시

chrome cookie editor extension

크롬에서 쿠키 수정시 그동안 EditThisCookie extension 을 사용했는데,
크롬 버전이 올라가면서 언제부터 인가 쿠키 값을 추가해도 적용되지 않는 문제가 있다.
확인해 보면 2020년 11월 22일 이후 업데이트가 되지 않았고,
깃헙(https://github.com/ETCExtensions/Edit-This-Cookie) 도 5년 넘게 새로운 커밋이 없다.

대신 cookie-editor extension 을 사용하면 새 쿠키값을 추가할 수 있다.

set-cookie was blocked 에러

vue+go 로컬 개발시 서버 응답으로 다음과 같이 쿠키 설정 헤더값을 받았다.
set-cookie: jwt=xxxxx; Expires=Wed, 18 Nov 2020 08:12:17 GMT

그런데 쿠키가 설정되지 않는다.
크롬 개발자 도구 cookies 항목을 보면 다음과 같이 secure 부분에 알림 아이콘이 표시되고


마우스 오버하면 tooltip 메시지를 확인 할 수 있다.

This Set-Cookie was blocked because it was not sent over a secure connection and would have overwritten a
cookie with the Secure attribute.

이미 https://localhost 로 jwt 값이 있는게 원인이었다.

쿠키는 도메인에 따라 설정되지만 https 연결로 secure 속성을 가진다.
localhost 라는 도메인으로 jwt 쿠키가 있어 덮어쓰기를 시도하는데,
https 라 secure 하지 않는 http 연결에서의 set-cookie 는 허용되지 않는다.

해결방법1
기존 https://localhost 의 jwt 쿠키를 삭제

해결방법2
다른 쿠키명 사용
"github.com/dgrijalva/jwt-go" 를 사용해 쿠키명은 다르게 해도 된다.
("github.com/go-chi/jwtauth" 는 jwt 라는 쿠키명은 하드코딩되어 있다.)

# 참고

http cookie 설정 유의사항

# golang http.SetCookie 사용시
# 로컬에서 테스트를 위해 도메인:1234 로 쿠키 저장을 하려고 하면
# :포트를 명시해서 다음과 같은 에러가 발생하지만 저장은 된다.
# 하지만 에러가 표시를 없애기 위해 :포트는 명시하지 않는것이 좋다.
net/http: invalid Cookie.Domain "ysoftman.testdomain.com:1234"; dropping domain attribute

# 참고
# 쿠키 설정 참고 사항
https://tools.ietf.org/html/rfc6265#section-4.1.1
# IP 는 안되고 스트링 소문자로 저장되며
5.1.3.  Domain Matching

# . 으로 시작되는 도메인은 .을 제외시킨다.
5.2.3.  The Domain Attribute
생략
Let cookie-domain be the attribute-value without the leading %x2E
      (".") character.

# 쿠키는 같은 도메인에서 port 로 구분 할 수 없다.
8.5.  Weak Confidentiality
   Cookies do not provide isolation by port.

jwt 사용시 추가 보안

# JWT(Json Web Token) 을 잠깐 알아보면,
# . 구분자로 header.payload.signature 로 구분되고
# payload 에 필요한 정보를 담아 클라<->서버간 주고 받게 된다.
# jwt 토큰 예시
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwaG9uZSI6IjEyMzQ1Njc4OTAiLCJuYW1lIjoieXNvZnRtYW4ifQ.IBNMyC-NPJXL0pk9w7Dmq5HZz5o-3OUquGUBlXyWCvk

# 위 jwt 토큰은 다음과 같이 누구나 복호화 (https://jwt.io/)할 수 있다.
# 복화된 내용을 수정하면 바로 암호화된 jwt 도 생성할 수 있다.
# header: algorithm & token type
{
  "alg": "HS256",
  "typ": "JWT"
}

# payload:data
{
  "phone": "1234567890",
  "name": "ysoftman"
}

# verify signature
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  your-256-bit-secret
) secret base64 encoded

# 보통 위와 같이 JWT 토큰에 사용자 식별정보(id)를 서버에 전송하면
# 서버에서는 해당 id 에 대한 권한을 주는 흐름이다.

# 기본으로 보안되는 것
# 서버는 jwt 를 생성시 미리 정한 sigkey(secret) 을 넣어 서버에서만 사용되는 jwt 를 만들 수 있다. 때문에 클라가 payload 등의 내용을 임의로 변경해서 새로운 jwt 만들어 서버에 전송해도 서버에선 유효하지 않은 jwt 로 무시하게 된다. 즉 서버가 발행하지 않는 변조된 jwt 는 서버에 사용할 수 없다.

# 추가 보안으로 고려해야 하는 것
# 1. 해커가 jwt 토큰을 갈취해서 요청 할 수 있다.
# -> 서버에서 쿠키 생성시
# secure;(쿠키가 전송되지만 https 에서만 쿠키가 설정된다.)
# httponly;(javascript 등의 브라우저가 아닌 곳에서 접근할 수 없다.)
# 옵션을 설정할 필요가 있다.
# 참고 https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies -> Restrict access to cookies

# 2. jwt 토큰 갈취 위험 빈도를 낮추기 위해
# access token(실제 인증을 위한 짧긴 1시간 정도의 만료 기간을 가진 토큰),
# refresh token(access token 이 만료 됐을때 새 access token 발급을 위한 긴 2주 정도의 만료 기간을 가진 토큰) 2개를 이용한다.
# 로그인시 2개의 토큰을 생성하고 서버는 사용자의 refresh token 을
# db 에 저장해 두고 클라에게 응답하면 클라는 refresh token 은 저장해두고
# access token 만 사용하다가 서버로 부터 access token 이 만료됐다고 했을때
# access token + refresh token 을 요청해서
# access token + refresh token 을 갱신받는다.
# 이 방식은 매 요청에 사용되는 access token 이 갈취 당해도 비교적 짧은 시간만 유효함으로 보다 안전하고 한다.

# 3. payload 내용에 사용자id 등의 개인 정보가 노출될 수 있다.
# -> jwt payload 도 aes256 같은 대칭키로 암호화한다.

http cookie expires syntax

http 응답에 쿠키설정(Set-Cookie)에 expires 를 어떻게 표기해야 할까?

모질라와 위키피디아 에는
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Date
https://en.wikipedia.org/wiki/HTTP_cookie

Expires=Wed, 21 Oct 2015 07:28:00 GMT;
Expires=Tue, 15 Jan 2013 21:47:38 GMT;

와 같다. 그런데

https://www.ietf.org/rfc/rfc2109.txt -> Expires and Max-Age 을 보면

Wdy, DD-Mon-YY HH:MM:SS GMT
Wdy -> day of week
와 같이 요일 표기도 다르고, 일-월-년 에 dash 가 들어가 있다.

위키피디아에 보면 RFC2109(1997년)는 RFC2965(2000년)로 대체(superseded) 되었는데 RFC2965 에서 Set-Cookie2 만 추가되었고 이것도 거의 사용되 않아 deprecated 되었다.

암튼 2109, 2965 는 예전방식(Obsolete)이고,
최신 RFC6265(https://tools.ietf.org/html/rfc6265 , 2011년) 에 보면 다음과 같이 dash 가 빠져 있다.

Set-Cookie: lang=en-US; Expires=Wed, 09 Jun 2021 10:18:14 GMT


chrome extension - Edit This Cookie

# Edit This Cookie
# 현재 웹에 관련된 쿠키 값 파악 및 수정할 수 있다.
크롬 -> 웹 스토어 -> "edit this cookie" 설정

# 사용방법
구글 검색 후 edit this cooke 실행

# 사용예시