How Secure Are Encryption, Hashing, Encoding and Obfuscation?
Hashing vs Encryption — The Big Players of the Cyber Security World
해시(hash)와 암호화(Encryption) 차이점
Adding Salt to Hashing: A Better Way to Store Passwords
⭐️Cookie, Session, Token이 뭔가요?
⭐️Session VS Cookie VS Token
쿠키, 세션, 토큰의 차이
쿠키, 세션 개념
⭐️쉽게 알아보는 서버 인증 1편(세션/쿠키 , JWT)
⭐️Session을 활용한 로그인 상태유지
CDN & Caching, DNS Lookup
Asymmetric encryption(비대칭 암호화):
- Usage: TLS, VPN, SSH
Symmetric encryption(대칭 암호화):
- Usage: file system encryption, Wi-Fi protected access (WPA), database encryption e.g. credit card details
Hashing: 어떤 문자열에 '임의의 연산(해시 함수/해시 알고리즘)'을 적용하여 고정된 길이의 암호화된 다른 문자열로 변환
규칙
1) 모든 값에 대해 해시 값을 계산하는데 오래걸리지 않아야 한다.
2) 최대한 해시값을 피해야 하며, 모든 값은 고유한 해시값을 가진다.
3) 아주 작은 단위의 변경이라도, 완전히 다른 해시값을 가져야 한다.
(ex) aaaa vs. aaab => 한글자만 바뀌어도 완전히 다른 해시 값)
=> 단방향 암호화 기법
Registration
:hashing during signup registration flow
Login
:hashing during user login flow
※ SHA(Security Hashing Algorithm) : SHA-0, SHA-1, SHA-2. With SHA-1 being deprecated(해시충돌로 지원중단), SHA-2 is used in most SSL/TLS cipher suites. SHA-256 or above is the recommendation for security critical applications.
Salt: 해시 하려는 값(원본)에 추가하는 값
password + salt = salted input => Hash(SHA-256)
Crypto(NodeJS)
: NodeJS 내장 암호화 모듈(https://nodejs.org/api/crypto.html)
const crypto = require('crypto');
const secret = 'abcdefg';
const hash = crypto.createHmac('sha256', secret)
// 알고리즘 방식, Salt
.update('favorite films') // Hashing할 값
.digest('hex'); // encoding 방식
// 값 + Salt => 알고리즘으로 값 변환
// => 변환 값을 입력받은 방식으로 인코딩
// => Hash 값
※ HTTP Protocol의 특징
(1) Connectionless(비연결지향)
* keep-alive Header
(2) Stateless(상태정보 유지안함)
=> 이를 보완하기 위해 쿠키, 세션 이용
[위키피디아] 하이퍼 텍스트의 기록서(HTTP)의 일종으로 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 그 사이트가 사용하고 있는 서버를 통해 인터넷 사용자(클라이언트)의 로컬 컴퓨터에 설치되는 작은 기록 정보 파일
Cookie is a bit of data stored by the browser and sent to the server with every request.
- HTTP 쿠키, 웹 쿠키, 브라우저 쿠키
- 서버가 사용자의 위치에 정보를 저장하고 불러올 수 있는 수단
1) 특정 호스트에서 생성된 쿠키는 이후 모든 요청마다 서버로 다시 전송
2) 이름, 값, 만료 날짜, 경로 정보로 구성
3) 클라이언트의 상태 정보를 로컬에 저장했다가 참조
※ 예시: 자동로그인, 오늘 하루 이 창을 보지 않음
※ Cookies in JavaScript: Set, Get & Delete Example
Session(세션)
Session is a collection of data stored on the server and associated with a given user.
※ 예시: 로그인 정보 유지(Session을 활용한 로그인 상태유지)
※ 쿠키(cookie) vs. 세션(session)
(출처: https://jeong-pro.tistory.com/80)
구분 | 쿠키(cookie) | 세션(session) | |
---|---|---|---|
저장위치 | -- | 클라이언트 로컬에 파일로 저장 | 서버에 저장 |
보안 | -- | 보안에 취약 | 비교적 좋다 |
--- | 클라이언트 로컬에 저장/ | 쿠키를 이용해 session ID만 저장 | |
--- | 변질되거나, 요청에서 스나이핑될 우려/ | session ID로 구분해 서버에서 처리 | |
라이프 사이클 | -- | 브라우저를 종료해도 정보 유지 가능 | 브라우저 종료시 '만료기간에 상관 없이' 삭제 |
-- | 만료기간 길 경우 쿠키 삭제 시까지 유지 가능 | ||
속도 | -- | 쿠키에 정보가 있어 서버에 요청시 빠름 | 서버에 정보가 있어 추가 처리로 인해 비교적 느림 |
※ 세션은 사용자의 수 만큼 서버 메모리를 차지 => 최근에는 이런 문제들을 보완한 토큰 기반의 인증방식을 사용하는 추세
cf) Cache(캐시)
Token(토큰)
인증을 위해 사용되는 암호화 된 문자열
1) Http 통신의 Stateless 특징과 match
2) 유저의 인증 정보를 서버나 세션에 담아두지 않음
3) 유저의 활성화 여부를 신경쓰지 않고, 넘겨진 요청에 담겨진 Token의 정합성만을 확인
4) 서버에서 클라이언트의 상태 정보를 저장하지 않고 클라이언트에서 넘겨지는 요청만으로 작업을 처리하게 되는데 이런 경우 클라이언트 상태관리에 관한 비용이 없기 때문에 서버의 확장성이 높음
JWT(Json Web Token)
인증에 필요한 정보들을 암호화시킨 토큰
사용자(클라이언트)는 Access Token(JWT Token)을 HTTP Header에 실어 서버로 보냄
Header : Header, Payload, Verify Signature를 암호화할 방식(alg), 타입(type)
Payload : 서버에서 보낼 데이터(data)(유저의 고유 ID값, 유효기간)
Verify Signature : Base64 방식으로 인코딩한 Header, payload & SECRET KEY를 더한 후 서명(signature)
=> Result : Encoded Header + "." + Encoded Payload + "." + Verify Signature
※ 세션/쿠키 방식과 가장 큰 차이점은 세션/쿠키는 세션 저장소에 유저의 정보를 넣는 반면, JWT는 토큰 안에 유저의 정보들이 넣는다는 점입니다. 물론 클라이언트 입장에서는 HTTP 헤더에 세션ID나 토큰을 실어서 보내준다는 점에서는 동일하나, 서버 측에서는 인증을 위해 암호화를 하냐, 별도의 저장소를 이용하냐는 차이가 발생합니다.
※ Access Token & Refresh Token
test fixture: 테스트 시에 사용하는 객체
afterValidate:
Crypto: Node js 내장 암호화 모듈
express-session
Sequelize
JWT(json web token)
A session cookie(a.k.a in-memory cookie, transient cookie or non-persistent cookie) exists only in "temporary memory" while the user navigates the website.
Web browsers normally delete session cookies when the user closes the browser.