Nice programing

쿠키에 비밀번호를 저장하는 것이 안전합니까?

nicepro 2020. 12. 11. 19:23
반응형

쿠키에 비밀번호를 저장하는 것이 안전합니까?


내 웹 애플리케이션의 홈 페이지에는 RememberMe 확인란이 있습니다. 이용자가 확인하면 이메일 아이디와 비밀번호를 쿠키에 저장하겠습니다. 이것은 내 코드입니다.

if (this.ChkRememberme != null && this.ChkRememberme.Checked == true)
   {
     HttpCookie cookie = new HttpCookie(TxtUserName.Text, TxtPassword.Text);
     cookie.Expires.AddYears(1);
     Response.Cookies.Add(cookie);
   }

내가 알고 싶은 것은 :

  • 쿠키에 비밀번호를 저장하는 것이 안전합니까?
  • 같은 일을하는 적절한 방법은 무엇입니까?
  • 쿠키 시간 설정의 모범 사례는 무엇입니까?

일반 텍스트로 사용할 수 있기 때문에 쿠키에 암호를 저장하는 것은 안전하지 않습니다.

쿠키에 대한 답변을 찾을 수있는 좋은 곳은 Cookie Central입니다. 회원의 경우 일반적으로 사용자 이름과 비밀번호를 제공 할 때 웹 사이트에서 발행되는 '토큰'이라는 긴 문자열이있는 쿠키가 사용됩니다. 문서 에서 찾을 수있는 프로세스에 대해 자세히 알아보십시오 . ASP.NET에서 폼 인증을 사용할 때 다음과 같이 인증 쿠키를 설정할 수 있습니다.

FormsAuthentication.SetAuthCookie(userName, isPersistanceCookie);

두 번째 매개 변수는 "기억하기"기능에 사용됩니다. true 인 경우 사이트를 떠난 후에도 지속되는 영구 쿠키가 생성됩니다. 다음과 같이 쿠키를 프로그래밍 방식으로 조작 할 수도 있습니다.

HttpCookie authCookie =
  HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];

아니! 쿠키에 암호를 저장하지 마십시오!

ASP.NET에서는

FormsAuthentication.SetAuthCookie(username, true);

두 번째 인수의 값은 쿠키가 영구적인지 여부를 결정합니다 (내 기억 확인란의 값).


아니요, 원격으로 보안되지 않습니다. 쿠키가 일반 텍스트로 저장되지 않는다는 보장은 없습니다 (실제로 대부분의 구현 쿠키를 일반 텍스트 로 저장합니다).

쿠키를 가로채는 사람은 누구나 응용 프로그램에 액세스 할 수 있으므로 "내 기억"은 본질적으로 안전하지 않습니다. 그러나 사용자의 암호를 노출하면 보안 수준이 한 단계 더 낮아집니다. :-) 그리고 아마도 그들이 알게되면 사용자를 정말 화나게 할 것입니다.

내 서버의 테이블을 제외하고 사용자 계정과 연결되지 않은 (기타) 방식으로 연결되지 않은 토큰과 결합 된 사용자 계정 이름을 통합하는 암호화 된 쿠키 문자열을 사용합니다. 사용자가 사이트로 돌아 오면 쿠키를 해독하고 해당 토큰이 실제로 해당 계정과 연결되어 있는지 확인합니다. 토큰 (및 따라서 쿠키)은 모든 자동 로그인을 변경하고 해당 자동 로그인에 사용 된 토큰을 무효화합니다. (여러 위치에서 자동 로그인을 허용하기 위해 토큰과 계정간에 다 대일 관계가 있습니다. 원하는 경우이를 제한 할 수 있습니다.) 토큰을 X 일 이내에 사용하지 않으면 시간이 초과됩니다. (이는 쿠키의 지속 시간을 제한하는 것뿐만 아니라 서버 측에서도 수행됩니다.) 삶을 조금 만들기 위해 내가 거기에 던지는 몇 가지 다른 것들이 있습니다. 누군가가 쿠키를 해독하거나 (성공적으로 해독 한 경우) 도난당한 쿠키를 사용하는 것은 어렵지만 (복호화가 필요하지 않음) 과도하게 사용할 필요는 없습니다 (다시 "내 기억"은 본질적으로 안전하지 않음).

강력한 보안이 실제로 필요하지 않고 (분명히) 많은 동적 IP 클라이언트가있는 사이트에서 사용하므로 IP로 잠그려고하지 않습니다. 그러나 IP에 잠그더라도 보안이 유지되지는 않으며 공격 표면이 약간 줄어 듭니다.

쿠키에 사용자 이름이있는 이유가 궁금 할 것입니다. 직접적인 "기억하기"목적을 위해, 암호화 된 경우에도 거기에 두지 않는 것이 좋습니다 (결국 사용자 이름 + 암호 시스템에서 인증 쌍의 절반입니다). 이 질문에 대해이 작업을 수행 한 방법을 스스로 상기 할 때 형식을 살펴 보았을 때 쿠키에서 찾은 것에 약간 놀랐습니다. 그러나 나는 그것이 왜 거기에 있고 "나를 기억해라"와 관련이없는 이유가 있다는 것을 설명하는 코멘트를 보았다. (반드시 설득력있는 이유는 아니지만, 이유가있다).

마지막으로 "내 기억하기"가 본질적으로 안전하지 않다는 사실은 사이트 로그가 매우 중요한 여러 이유 중 하나이며 중요한 계정 정보에 대한 변경을 허용하는 과정에서 암호 재확인을 요구해야하는 이유 중 하나입니다. 계정의 소유권을 얻기 위해 쿠키를 훔친 사람).


이것은 쿠키의 값을 변경하고 서버로 다시 보내는 것이 매우 쉽기 때문에 절대하지 말아야 할 일입니다. 쿠키에 "사용자가 'naivists'로 약탈 당함"을 저장하는 것조차 잘못되었습니다. 쿠키에 "사용자가 'Pandiya Chendur'로 로그인되어 있습니다"로 변경할 수 있기 때문입니다.

쿠키에서 할 수있는 일은 변경 되더라도 서버에 의미가없는 정보를 클라이언트에게 제공하는 것입니다. 예를 들어-좋아하는 색상, 첫 페이지 레이아웃 등.

쿠키에 저장된 세션 ID를 제공 할 수 있습니다. 다른 세션의 유효한 세션 ID를 알지 않는 한 값을 다른 것으로 변경하면 자신을 위해 더 나은 것을 만들 수 없기 때문입니다.

Microsoft의 MSDN이 쿠키 사용에 대해 말하는 내용 :

쿠키의 보안 문제는 클라이언트에서 데이터를 가져 오는 것과 유사합니다. 애플리케이션에서 쿠키는 사용자 입력의 또 다른 형태이므로 검사 및 스푸핑의 대상이됩니다. 쿠키는 사용자 자신의 컴퓨터에서 사용할 수 있으므로 사용자는 최소한 쿠키에 저장 한 데이터를 볼 수 있습니다. 사용자는 브라우저가 쿠키를 귀하에게 보내기 전에 쿠키를 변경할 수도 있습니다.

사용자 이름, 암호, 신용 카드 번호 등과 같은 민감한 데이터를 쿠키에 저장해서는 안됩니다. 사용자 나 쿠키를 도용 할 수있는 사람의 손에 들어가면 안되는 쿠키에는 어떤 것도 넣지 마십시오.

마찬가지로 쿠키에서 얻은 정보를 의심하십시오. 데이터를 작성할 때와 동일하다고 가정하지 마십시오. 사용자가 웹 페이지에 입력 한 데이터를 사용할 때와 동일한 보호 장치를 쿠키 값으로 작업 할 때 사용합니다. 이 항목의 앞부분에있는 예제에서는 사용자로부터 얻은 정보를 표시하기 전에 하듯이 페이지에 값을 표시하기 전에 쿠키 내용을 HTML로 인코딩하는 방법을 보여주었습니다.

쿠키는 브라우저와 서버간에 일반 텍스트로 전송되며 웹 트래픽을 가로 챌 수있는 사람은 누구나 쿠키를 읽을 수 있습니다. 연결이 SSL (Secure Sockets Layer)을 사용하는 경우에만 쿠키가 전송되도록하는 쿠키 속성을 설정할 수 있습니다. SSL은 쿠키가 사용자의 컴퓨터에있는 동안 읽거나 조작되는 것을 방지하지 않지만 쿠키가 암호화되어 있기 때문에 전송 중에 쿠키를 읽지 못하도록합니다. 자세한 내용은 웹 응용 프로그램에 대한 기본 보안 관행을 참조하십시오.


일반 텍스트로 사용할 수 있기 때문에 쿠키에 암호를 저장하는 것은 안전하지 않습니다. 그러나 선호하는 기준이 그렇게하는 것이거나 사용자 요구 사항이있는 경우 문자열을 암호화하여 수행 할 수 있습니다. 충분히 안전하게 만들 수 있습니다.

하지만 권장하지 않습니다.


I think you need to create a token with username and an encrypted authentication string which you get from windows Identity. No need to store password on cookie. We have our application which stored username and authenticated string


Btw, store passwords isn't secure everywhere, both client and server-side.

You don't need to do that.


What Branislav said, and...

In addition to not putting sensitive data in your cookies, you should also secure them by placing at least the following in your web.config:

<httpCookies httpOnlyCookies="true" />

For more details see: How exactly do you configure httpOnlyCookies in ASP.NET?


It is not at all secure. Cookies are stored in the client computer, which can be tampered with.


  • If you use SSL which you should if you are transmitting any secure information, that eliminates a third party from listening to your web traffic. This would be the same issue regardless of storing a users credentials in a cookie because when they login your sending their username and password to the server anyway, where I assume the server hashes it and compares it against the hashed password you have for that user.

  • Other domains will never be able to read your cookie because of cross-origin so that's not an issue.

  • So really the only "security hole" if you want to call it that is if someone physically gains access to their computer. If that happens they're most likely going to get any information that want from that person anyway. How do you explain when chrome auto fills out login forms for you, is that secure? I'm sure they are not storing it in plain text but that doesn't even matter. If you go to a page that chrome auto fills you can just copy the password out of the form and look at that you now have that persons password.

  • It really comes down to how "secure" you need it to be. I agree that encrypting a users information with an expiration as a token is the best way to authenticate service calls and it provides flexibility. I just do not see the issue with storing login credentials in a cookie.

참고URL : https://stackoverflow.com/questions/2100356/is-it-secure-to-store-passwords-in-cookies

반응형