Hashing / Cookie / Session 21.05.27
in Dev
HTTPS 프로토콜 : HTTP보다 상대적으로 안전한 방법이고, 데이터 제공자의 신원을 보장 받을 수 있다.
HTTPS 프로토콜 특징
1.암호화된 데이터를 주고받기 때문에, 중간에 인터넷 요청이 탈취되더라도 정확한 키로 복호화 하기 전까지 그 내용을 알아볼 수 없다.
2.브라우저가 응답과 함께 전달된 인증서 정보를 확인할 수 있다. 브라우저는 인증서에서 해당 인증서를 발급한 CA 정보를 확인하고 인증된 CA가 발급한 인증서가 아니라면 화면에 경고창을 띄워 서버와 연결이 안전하지 않다는 화면을 보여준다. 브라우저는 인증서의 도메인과 데이터를 제공한 제공자의 도메인을 비교할 수 있기 때문에 인증서의 도메인 정보와 데이터 제공자의 도메인 정보가 다른 ‘중간자 공격’을 감지하여 보안 위협으로부터 사용자 및 사용자의 데이터를 보호할 수 있다.
Hashing 암호화
문자열에 임의의 연산(알고리즘)을 적용하여 다른 문자열로 변환.
Salt
암호화해야하는 값에 어떤 ‘별도의 값’을 추가하여 결과를 변형. 기존 해시 값과 전혀 다른 해시갑이 반환되어 알고리즘이 노출되더라도 원본 값을 보호할 수 있도록 하는 안전 장치.
암호화 하려는 값 + Salt 값 => hash 값
Cookie
웹사이트 접속시 서버가 일방적으로 클라이언트에게 전달하는 작은 데이터.
서버가 웹브라우저(클라이언트)에 정보를 저장하고 불러올 수 있는 수단.
사용자 선호, 테마 등 장기간 보존해야하는 정보 저장에 적합.
Cookie option
- Domain: 서버와 요청의 도메인이 일치하는 경우 쿠키 전송
만약 쿠키 옵션에서 도메인 정보가 존재한다면 클라이언트에서는 쿠키의 도메인 옵션과 서버의 도메인이 일치해야만 쿠키를 전송할 수 있다.
요청 URL : http://www.localhost.com:3000/users/login
도메인 : localhost.com
- Path:서버와 요청의 세부경로가 일치하는 경우 쿠키 전송
요청 URL : http://www.localhost.com:3000/users/login
세부 경로(라우팅 시 사용하는 경로) : /users/login
Path 옵션의 특징은 설정된 path를 전부 만족하는 경우
요청하는 Path가 추가로 더 존재하더라도 쿠키를 서버에 전송할 수 있습니다.
즉 Path가 /users로 설정되어 있고, 요청하는 세부 경로가 /users/login 인 경우라면 쿠키 전송이 가능합니다.
하지만 /user/login으로 전송되는 요청은 Path 옵션을 만족하지 못하기 때문에 서버로 쿠키를 전송할 수 없습니다.
- MaxAge:쿠키의 유효기간 설정. 일정 시간 후 자동 소멸.
MaxAge : 앞으로 몇 초 동안 쿠키가 유효한지 설정하는 옵션입니다.
- Expires:쿠키의 유효기간 설정. 일정 시간 후 자동 소멸.
Expires : 다만 언제까지 유효한지 Date를 지정합니다. (클라이언트의 시간을 기준)
두 옵션(MaxAge, Expires)이 모두 지정되지 않는 경우에는 브라우저의 탭을 닫아야만 쿠키가 제거
- Secure:HTTPS 프로토콜에서만 쿠키 전송 여부 결정
쿠키를 전송해야 할 때 사용하는 프로토콜에 따라 쿠키전송 여부를 결정합니다. 만약 해당 옵션이 true로 설정된 경우, ‘HTTPS’ 프로토콜을 이용하여 통신하는 경우에만 쿠키를 전송 가능
- HttpOnly:스크립트의 쿠키 접근 가능 여부 결정. 스크립트 태그 접근 불가능하게 만들어 보안 강화 (XSS 공격 방지)
자바스크립트에서 브라우저의 쿠키 접근 여부를 결정합니다. 만약 해당 옵션이 true로 설정된 경우, 자바스크립트에서는 쿠키에 접근이 불가합니다. (XSS 공격 방지)
명시되지 않는 경우 기본으로 false로 지정되어 있습니다. 만약 이 옵션이 false인 경우 자바스크립트에서 쿠키에 접근이 가능하므로 ‘XSS’ 공격에 취약
- SameSite:CORS 요청의 경우 옵션 및 메서드에 따라 쿠키 전송 여부 결정. CSRF 공격 방지. (Samsite 옵션이 none이라면 Secure 쿠키 옵션이 필요)
Cross-Origin 요청을 받은 경우 요청에서 사용한 메소드와 해당 옵션의 조합으로 서버의 쿠키 전송 여부를 결정하게 됩니다. 사용 가능한 옵션은 다음과 같습니다.
Lax :Cross-Origin 요청이면 'GET' 메소드에 대해서만 쿠키 전송 가능
Strict : Cross-Origin이 아닌 same-site인 경우에만 쿠키 전송가능
None: 항상 쿠키를 보내줄 수 있다. 다만 이런 경우 보안에 취약할 수 있으므로 쿠키 옵션 중 Secure 옵션이 필요.
이때 ‘same-site’는 요청을 보낸 Origin과 서버의 도메인이 같은 경우를 말합니다.
이러한 옵션들을 지정한 다음 서버에서 클라이언트로 쿠키를 처음 전송하게 된다면 헤더에 Set-Cookie라는 프로퍼티에 쿠키를 담아 쿠키를 전송하게 됩니다.
이후 클라이언트 혹은 서버에서 쿠키를 전송해야 한다면 클라이언트는 헤더에 Cookie라는 프로퍼티에 쿠키를 담아 서버에 쿠키를 전송하게 됩니다.
쿠키를 이용한 상태 유지
이러한 쿠키의 특성을 이용하여 서버는 클라이언트에 인증정보를 담은 쿠키를 전송하고, 클라이언트는 전달받은 쿠키를 요청과 같이 전송하여 Stateless 한 인터넷 연결을 Stateful 하게 유지할 수 있다.
하지만 기본적으로는 쿠키는 오랜 시간 동안 유지될 수 있고, 자바스크립트를 이용해서 쿠키에 접근할 수 있기 때문에 쿠키에 민감한 정보를 담는 것은 위험합니다.
이런 인증정보를 탈취하여 서버에 요청을 보낸다면 서버는 누가 요청을 보낸 건지 상관하지 않고 인증된 유저의 요청으로 취급하기 때문에, 개인 유저 정보 같은 민감한 정보에 접근이 가능하다.
<!-- syntax -->
Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>
Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>
Set-Cookie: <cookie-name>=<cookie-value>; Secure
Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax
Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None; Secure
// Multiple attributes are also possible, for example:
Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>; Secure; HttpOnly
Session
세션 : 사용자가 인증에 성공한 상태. 서버는 일종의 저장소에 세션을 저장.
세션이 만들어지면, 각 세션을 구분할 수 있는 세션 아이디도 만들어지는데 보통 클라이언트에 세션 성공을 증명할 수단으로서 세션 아이디를 전달
이 때에 웹사이트에서 로그인을 유지하기 위한 수단으로 쿠키를 사용합니다. 쿠키에는 서버에서 발급한 세션 아이디를 저장
세션기반 인증 (Session-based Authentication)
로그인
1.로그인 (성공 시 세션 생성) 2.세션은 서버(세션 스토어 등)에 저장. 3.세션 아이디 생성 4.세션 아이디 전달 (세션 성공을 증명할 수단) + 웹사이트에서 로그인을 유지하기 위한 수단으로 쿠키를 사용. 쿠키에는 서버에서 발급한 세션 아이디를 저장 5.쿠키를 통해 유효한 세션 아이디가 서버에 전달 6.세션 스토어에 해당 세션이 존재한다면 7,8.서버는 해당 요청에 접근 가능하다고 판단.
로그아웃
세션 아이디가 담긴 쿠키는 클라이언트에 저장되어 있으며, 서버는 세션을 저장하고 있습니다. 서버는 그저 세션 아이디로만 요청을 판단합니다.
그러므로 로그아웃을 위해 다음 2가지 작업 진행
1.서버의 세션 정보를 삭제 2.클라이언트의 쿠키를 갱신 : 서버가 클라이언트의 쿠키를 임의로 삭제할 수는 없으므로 set-cookie로 세션 아이디의 키값을 무효한 값으로 갱신.
express-session : 세션 관리를 위한 미들웨어.
CSRF(Cross Site Request Forgery)
다른 오리진(cross-site)에서 유저가 보내는 요청(request)를 조작(forgery)하는 것
해커가 직접 데이터에 접근하는 것이 아님.
방어 방법 : CSRF 토큰 사용 / same-site cookie 사용.