61DAYS) [인증 보안] 기초 - HTTPS, Hashing, Cookie, Session, 웹 보안 공격

nacSeo (낙서)·2023년 1월 12일
0

◉ 학습목표

1. HTTPS 개념을 이해하고, 권한 부여(Authorization)와 인증(Authentication)에 대해 이해할 수 있다.
2. hashing(해싱)에 대해 이해할 수 있다.
3. cookie(쿠키)를 이해하고 작동 원리를 설명할 수 있다.
4. session(세션)에 대해 이해할 수 있다.
5. 웹 보안 공격에 대해 이해할 수 있다.
  1. HTTPS

⦿ 학습내용

☞ HTTPS

✔︎ HTTP : 인터넷에서 데이터를 주고 받을 수 있는 통신 프로토콜
✔︎ HTTPS

  • HTTP + Secure
  • HTTP 프로토콜 내용을 암호화하여 보안성 추가

✔︎ HTTPS 특징

  • 인증서 (Certificate)
    • 데이터 제공자 신원 보장
    • 도메인 종속
  • CA (Certificate Authority)
    • 공인 인증서 발급 기관
  • 비대칭키 암호화
    • 전혀 다른 키 한쌍으로 암호화 및 복호화 진행
  1. Hashing

⦿ 학습내용

☞ 암호화 (Encryption)

✔︎ 정보를 임의 방식을 사용해 다른 형태로 변환하여 해당 방식을 알고 있는 사람을 제외하고는 이해할 수 없도록 알고리즘을 통해 정보를 관리

☞ 해싱 (Hashing)

✔︎ 어떤 문자열에 임의의 연산을 적용하여 다른 문자열로 변환하는 것
✔︎ 3가지 철칙

  • 모든 값에 대해 해시 값을 계산하는 데 오래 걸리지 않아야 함
  • 최대한 해시 값을 피해야 하고, 모든 값은 고유한 해시 값을 가짐
  • 아주 작은 변경 단위라도 완전히 다른 해시 값을 가져야 함

☞ 솔트 (Salt)

✔︎ 암호화해야 하는 값에 어떤 별도의 값을 추가하여 결과를 변형하는 것
✔︎ 암호화만 해놓는다면 결과가 늘 동일
✔︎ 원본 값에 Salt를 적용시키면, 기존 해시 값과 전혀 다른 해시 값이 반환되므로 알고리즘이 노출되더라도 원본값을 보호할 수 있는 안전장치 역할
✔︎ 기존 : 암호화하려는 값hash 값, Salt 사용 : 암호화하려는 값 + Salt용 값hash 값
✔︎ 주의점

  • 유저와 패스워드별로 유일한 값을 가져야 함
  • 계정을 생성할 때와 패스워드를 변경할 때마다 새로운 임의의 Salt를 사용해 해싱
  • 절대 재사용 ❌
  • DB 유저 테이블에 같이 저장
  1. Cookie

⦿ 학습내용

✔︎ 어떤 웹사이트에 들어갔을 때, 서버가 일방적으로 클라이언트에 전달하는 작은 데이터
✔︎ HTTP의 stateless(무상태성)을 stateful하게 유지할 수 있게 도와줌
✔︎ 서버가 웹 브라우저(클라이언트)에 정보(데이터)를 저장하고 불러올 수 있는 수단
✔︎ 해당 도메인에 대해 쿠키가 존재하면, 웹 브라우저는 도메인에게 http 요청 시 쿠키를 함께 전달
✔︎ 사용자 선호, 테마 등 장시간 보존해야하는 정보 저장에 적합
✔︎ 쿠키 옵션

  • Domain
    • 서버요청 도메인이 일치하는 경우 쿠키 전송
  • Path
    • 서버요청 세부경로가 일치하는 경우 쿠키 전송
  • MaxAge
    • 쿠키의 유효기간 설정
    • 몇 초간 유효한지 설정
  • Expires
    • 쿠키의 유효기간 설정
    • 유효 날짜 및 시간 설정

※ 세션 쿠키 : MaxAge 또는 Expires 옵션이 없는 쿠키, 브라우저 실행 중일 때 사용하는 임시 쿠키, 브라우저 종료 시 해당 쿠키 삭제
※ 영속성 쿠키 : 브라우저 종료 여부와 상관없이 MaxAge또는 Expires에 지정된 유효시간만큼 사용 가능한 쿠키

  • HttpOnly
    • 스크립트의 쿠키 접근 가능 여부 결정
    • true인 경우, 자바스크립트에서 쿠키에 접근 ❌
    • false(기본값)인 경우, 자바스크립트에서 쿠키에 접근 ⭕️, XSS 공격에 취약 👿
  • Secure
    • HTTPS 프로토콜에서만 쿠키 전송 여부 결정
    • true인 경우, HTTPS 프로토콜을 이용하여 통신하는 경우에만 쿠키 전송 가능
    • Secure 옵션이 없다면, HTTP, HTTPS 프로토콜 모두 쿠키 전송 가능
  • SameSite
    • CORS 요청의 경우 옵션 및 메서드에 따라 쿠키 전송 여부 결정
    • Lax: Cross-Origin 요청이면 GET 메서드에 대해서만 쿠키 전송 가능
    • Strict: Cross-Origin이 아닌 same-site인 경우에만 쿠키 전송 가능
    • None: 항상 쿠키 전송 가능, Secure 쿠키 옵션 반드시 필요❗️

✔︎ 기본적으로 쿠키는 오랜 시간 유지될 수 있고, 자바스크립트를 이용하여 쿠키에 접근 가능 → 쿠키에 민감한 정보 담는 것은 위험 ⛔️

  1. Session

⦿ 학습내용

☞ 세션 (Session)

✔︎ 서버가 클라이언트에 유일하고 암호화된 ID 부여
✔︎ 중요 데이터는 서버에서 관리

☞ 쿠키(Cookie) 🆚 세션(Session)

  1. 웹 보안 공격

⦿ 학습내용

☞ SQL Injection

✔︎ 데이터베이스에서 임의의 SQL문을 실행할 수 있도록 명령어를 삽입하는 공격 유형
✔︎ 응용 프로그램의 보안상 허점을 이용해 데이터베이스를 비정상적으로 조작, 이를 통해 기록 삭제 또는 데이터 유출 가능
✔︎ 대응 방안

  • 입력(요청) 값 검증
    • 화이트리스트 방식으로 해당 키워드를 다른 값으로 치환
    • 화이트리스트 : 기본 정책이 모두 차단된 상황에서 예외적으로 접근이 가능한 대상 또는 대상을 지정하는 방식
  • Prepared Statement 구문 사용
    • 사용자 입력이 SQL문으로부터 분리
    • 사용자 입력값을 단순 텍스트로 인식
  • Error Message 노출 금지
    • 공격자가 Error Message를 통해 데이터베이스의 정보를 얻을 수 있음
    • 에러 내용과 해당 SQL문이 노출되지 않도록 에러 핸들링 필요

☞ Cross-Site Request Forgery (CSRF)

✔︎ 주소가 다른 사이트에서 요청 조작
✔︎ 다른 사이트(cross-site)에서 유저가 보내는 요청(request)을 조작(forgery)하는 것
✔︎ 해커가 직접 데이터에 접근 ❌
✔︎ CSRF 공격을 위한 조건

  • 쿠키를 사용한 로그인
    • 유저가 로그인했을 때, 쿠키로 어떤 유저인지 알 수 있어야 함
  • 예측할 수 있는 요청 parameter를 가지고 있어야 함
    • request에 해커가 모를 수 있는 정보가 담겨있으면 ❌

✔︎ 공격 방법

  • GET 요청으로 공격
    • 요청 파라미터를 원하는대로 변경하여 유저의 브라우저 환경에서 GET 요청을 보내도록 함
    • 악성 링크 클릭 등의 방법 이용
  • POST 요청으로 공격
    • 파라미터에 정보를 담는 것이 아니라, body에 정보를 담아 요청

✔︎ 대응 방안

  • CSRF 토큰 사용
    • 서버측에서 CSRF 공격에 보호하기 위한 문자열을 유저의 브라우저와 웹 앱에만 제공
  • Same-site Cookie 사용
    • 같은 도메인에서만 세션 및 쿠키 사용 ⭕️

◉ 느낀 점

☞ Section 4, 보안의 첫 날이다. 첫 날이니만큼 인증 및 보안의 기초를 학습했다. 앞서 배운 HTTP 프로토콜에 보안성을 덧붙인 HTTPS 프로토콜에 대해 알아보았고, mkcert 프로그램을 이용해서 PKCS12형식의 인증서를 만드는 실습도 진행해보았다.
그 동안 프로젝트를 만들면서 기능적인 구현에만 신경을 썼는데, 보안을 어떻게 적용할 지 해싱, 솔트 등의 방법을 알게 되었고, 많이 들어봤지만 확실히 알고 있지 않았던 쿠키와 세션에 대해 차이점을 생각하며 학습했다. 마지막으로 정보처리기사를 공부하며 접해봤던 SQL Injection, CSRF와 같은 웹 보안 공격 방법에 대해 알아보았다.
Section3를 진행하면서, 개념 위주의 학습보다는 실습 위주의 학습을 진행하게 되었었는데, 다시 Section4를 들어오면서 개념 위주의 학습 방법으로 바뀌게 되면서 적응하는 데에 시간이 걸렸다 😅 얼른 Spring Security에 대해 마스터해서 내가 만든 프로젝트에 어떻게 적용시킬 수 있을지 학습해보고 싶다!

◉ 내일의 키워드

・ Spring Security
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글