jwt 를 배우기 전 나는 tornado framework 의 set_secure_cookie 라는 메소드를 이용해서 다음 사진이 설명하는 과정을 거쳐 클라이언트에게 user_id 를 저장하게 했다.
그런데 cookie 에 대해서 좀 더 공부를 하려고 하던 중 다음 글을 보고 의문이 들었다.
Secure과 HttpOnly 쿠키
Secure 쿠키는 HTTPS 프로토콜 상에서 암호화된(encrypted ) 요청일 경우에만 전송됩니다. 하지만 Secure일지라도 민감한 정보는 절대 쿠키에 저장되면 안됩니다, 본질적으로 안전하지 않고 이 플래그가 당신에게 실질적인 보안(real protection)를 제공하지 않기 때문입니다. 크롬52 혹은 파이어폭스52로 시작한다면, 안전하지 않은 사이트(http:) 는 쿠키에 Secure 설정을 지시할 수 없습니다.
출처 : https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies
user_id 도 민감정보 아닌가 ? 라는 의문이 들어서 검색해보니 여기서 말하는 민감정보란
다음과 같이 특정인을 지칭할 수 있는 정보들(PII)인 것 같았다.
그리고 위와 같은 민감 정보를 쿠키에 저장하게 되면,
쿠키는 로컬 저장소에 공유되기 때문에
A 라는 사이트에 접속해서 쿠키를 저장해두면,
B 라는 사이트에 접속하면 거기서 A 라는 사이트에 저장된 쿠키를 얻을 수 있다.
또는 저장된 쿠키를 다른 악성 코드가 가져갈 수도 있다.
보안의 측면에서 웹 스토리지(로컬 스토리지 + 세션 스토리지)는 좋지않다고 말할 수 있다.
웹 스토리지에 저장된 값은 javascript 코드를 통해 언제든지 접근할 수 있는데,
이는 XSS(cross-site scripting) 공격에 취약하기 때문이다.
반면 쿠키에 저장한 값은 HttpOnly 속성을 통해 javascript를 통한 접근을 막을 수 있다.
그렇기 때문에 보안적인 측면을 생각한다면 웹 스토리지보다는 쿠키에 저장하는 것이 좋다고 할 수 있다.
https://woowacourse.github.io/javable/post/2020-08-31-where_to_store_token/
˙ 자바스크립트를 이용하여 document.cookie 값을 탈취할 수 있음
-> 쿠키의 httpOnly 설정을 통해 차단가능, 하지만 이것도 완벽한 방법은 아니다.
˙ 네트워크를 통해 전송되는 쿠키값을 암호화하지 않고 전송하는 경우 네트워크 스니핑 공격을 통해 쿠키값을 탈취할 수 있음
˙ 영속성 쿠키는 하드디스크에 저장되며, 간단한 방법으로 접근 가능하기 때문에 공용PC 사용시 PC에 저장된 사용자 정보가 유출될 수 있음
출처: https://coyagi.tistory.com/entry/시큐어코딩-쿠키-및-세션관리 [코코야이야기]
그래서 결론이 뭐냐?
결국 뭐든 안전해야하는건 클라이언트한테 넘기지 않는것이 좋다.
-> 그래서 로그인 할 때 토큰을 사용하는것이다.
토큰은 로컬스토리지에 저장하고 털려도 그냥 uuid 일뿐이다.
그러나 세션하이재킹같은 것은 가능하다.
그럼 이것을 어떻게 막느냐 ?
토큰 유효시간을 짧게? -> 소용없다, 실시간으로 해킹할 수도 있다.
그래서 보통
와 같은 정보를 함께 암호화해서 토큰화시킨 뒤 나중에 값을 받을 때 복호화해서 대조한다.
위 정보들은 request 를 날릴 때 기본적으로 함께 들어가는 값이라서 서버에서 잘 꺼내서 토큰화시키면 된다. 토큰화 시킴과 동시에 서버에서 해당 값을 가지고 있어야 대조가 가능하기 때문에, 세션이든 db 든 메모리든 저장을 하고 있어야 한다.
나는 나중에 해당 ip 정보를 db 에 저장한 뒤 메모리에 캐싱하는 방식으로 해볼 예정이다.
어쨌든,
그래서 보안이 중요한 사이트들을 보면,
pc 기억이 안되어있으면 이메일이나 휴대폰으로 인증을 하라고 하는 경우도 많다.
이 전까지는 그냥 user_id 만 payload 에 담아서 보내줬는데, 이후에는 좀 더 보안을 중요하게 생각해서 소개한 방법들을 적용할 계획이다.