HTTPS (Hyper Text Transfer Protocol Secure Socket layer)
HTTPS는 HTTP에 Secure를 포함한 것이다.
HTTP에 담긴 데이터를 암호화하여 공격에 대비한다.
🍵 공격자에 의해서 요청 및 응답이 탈취될 수 있다.HTTPS의 특징으로 인증서, CA, 비대칭 키 암호화가 있다.
현업에서 HTTPS 프로토콜을 사용하는 것이 일반적이다.
HTTPS 프로토콜은 인증의 중요한 부분을 차지한다.
🍏 인증서를 통해서 데이터 제공자의 신원을 보장하고 도메인에 종속되게 한다. (인증서 도메인과 응답 도메인을 서버가 비교한다.)
🥟 mkcert을 이용해서 로컬 환경에서 신뢰할 수 있는 인증서를 만들 수 있다.
🍖 CA(certificate Authority)는 공인 인증서 발급 기관이다.
🌹 비대칭 키 암호화는 암호화와 복호화를 하는데 있어서 쌍이되는 서로 다른 키를 사용하는 것을 의미한다.
🍰 CSRF는 대표적인 공격으로 Cross Site Request Forgery를 의미한다. 다른 사이트에서 유저가 보내는 요청을 조작한다.
🍰 해커가 직접 데이터에 접근할 수는 없지만, 쿠키를 사용하여 로그인하며 예측할 수 없는 요청이나 파라미터를 가지면 CSRF의 위험이있다.
🍰 CSRF 토큰을 사용하거나 same-site 쿠키를 사용해 예방한다.
Hashing
Hasing은 암호화의 기본으로, 일련의 정보를 통한 임의의 방식으로 다른 형태로 데이터를 변환하는 것을 의미한다.
해당하는 일련의 정보가 있어야 정보를 이해할 수 있다.
알고리즘을 이용해 정보를 관리한다.
다만, hashing은 단방향으로 데이터를 변환하기에 hashing 값만으로 원본 데이터를 알 수는 없다.
hashing을 하면 일정한 길이의 값으로 데이터가 변환되기에, 데이터를 압축할 때도 사용할 수 있다.
Salt
- 암호화한 값에 추가적으로 salt값을 추가해 결과를 변형한다.
- salt를 더한 뒤 hashing을 하여 데이터를 암호화한다.
- salt를 추가함으로써, hashing에 더 복잡성을 추가할 수 있다.
Cookie
🧊 stateless한 HTTP에서 정보를 유지할 수 있는 방법으로는 Cookie가 있다.
쿠키는 어떤 웹사이트에 들어갔을 때, 서버가 일방적으로 클라이언트에 전달하는 작은 데이터이다.
서버는 클라이언트에 인증 정보를 담은 쿠키를 전송한다.
클라이언트는 전달받은 쿠키를 요청과 같이 전송하여 Stateless 한 인터넷 연결을 Stateful 하게 유지할 수 있게 한다.
🧁 서버가 클라이언트(브라우저)에 데이터를 저장한다.
- 쿠키는 사용자의 선호도나(로그인 유지) 테마(다크모드), 장기간 보존 데이터저장에 적합하다.
- 쿠키는 특정 조건(쿠키 옵션)을 만족할 때만 데이터를 가져올 수 있다.
- 쿠키 옵션에는 Domain, Path, MaxAge or Expires, Secure, HttpOnly, SameSite(Lax / Strict / None)등이 있다.
- 하지만, 쿠키는 자바스크립트로 접근할 수 있어서 보안에 위험요소가 된다.
🥧 쿠키는 script태그를 통해서 접근할 수 있어 XSS공격에 취약하다. - 따라서 쿠키또한 암호화가 필수적이고 민감한 데이터는 담지 않는 것이 좋다.
- 데이터를 브라우저에 저장하기 때문에 사용자가 데이터를 임의로 수정할 우려도 있다.
- 따라서, 쿠키에는 중요하지 않지만 사용자의 편의성 향상에 도움이 되는 데이터들을 주로 저장한다.
🥖 XSS(Cross-Site Scripting) : 웹사이트에 스크립트를 삽입하여 공격한다.
Session
서버가 클라이언트에 유일하고 암호화된 ID를 부여한다.
🧃 Session을 이용한 인증에서 유저 정보는 서버에서 관리된다.
(🧃 Token 기반 인증은 클라이언트에 암호화된 유저 정보를 담는다)한 번 서버에 인증을 성공했다면, 서버는 이미 유저 정보의 해시를 알고 있다.
즉, '인증에 성공한 것'을 서버가 알고있다면, 추후에 다시 인증을 할 필요가 없다.
- 사용자가 인증에 성공한 상태를 세션이라고 한다.
- 세션이 만들어지면, 각 세션을 구분할 수 있는 세션 아이디도 만들어진다.
- 쿠키에 서버에서 발급한 세션 아이디를 저장하여 웹사이트의 로그인을 유지한다.
- 클라이언트는 서버에서 제공한 세션 아이디를 저장하고, 이를 그대로 요청시 쿠키에 담아 보냄으로써 인증을 한다.
- 이 세션이 탈취당하면, 클라이언트의 요청을 그대로 흉내낼 수 있다. 서버에서는 처음에 부여한 세션 ID를 통해서 클라이언트를 구분하기 때문이다.
- 로그아웃을 한다면, 서버의 세션 정보를 삭제하고 클라이언트의 쿠키를 갱신해야 한다.
- 너무 많은 세션 데이터가 서버에 저장되면, 서버에 부하가 생길 수 있다. 또한 무조건 세션 아이디를 저장하는 서버를 거쳐야 인증이 되는 단점이 있다. (토큰의 경우 토큰 전용 서버를 운영할 수 있다)
☕ node.js 환경의 express에서는 express-session으로 세션을 관리할 수 있다.
☕ withCredentials: true 설정을 해야 세션이나 토큰과 같은 인증정보를 서버에 보낼 수 있다.
'기타' 카테고리의 다른 글
토큰 기반 인증 (Token-based Authentication)에 대하여 (0) | 2023.01.12 |
---|---|
비대칭키 암호화와 전자 서명, 해시 (0) | 2023.01.07 |
CPU Scheduling에 대해서 (0) | 2022.12.16 |
간단하게 DHCP(Dynamic Host Configuration Protocol) 알아보기 (0) | 2022.12.14 |
OSI(Open System Interconnection) 7 Layers 알아보기 (0) | 2022.12.12 |