HTTPS (Hyper Text Transfer Protocol Secure Socket layer)
1. https 정의
- HTTP 요청을 SSL 혹은 TLS 라는 알고리즘을 이용해, HTTP 통신을 하는 과정에서 내용을 암호화하여 데이터를 전송하는 방법
- HTTP보다 상대적으로 안전한 방법이고, 데이터 제공자의 신원을 보장받을 수 있음
- HTTPS (하이퍼 텍스트 프로토콜 보안, Hyper Text Protocol Secure)
: HTTPS는 웹사이트를 SSL/TLS 인증서로 보안하는 경우 URL 창에 표시됨 / 사용자는 브라우저 바의 잠금 기호를 클릭하여 인증서 발행, 웹사이트 소유 기업명을 포함한 인증서의 세부 내용을 확인할 수 있음
- SSL (보안 소켓 계층, Secure Sockets Layer)
: SSL은 웹사이트와 브라우저(혹은, 두 서버) 사이에 전송된 데이터를 암호화하여 인터넷 연결을 보안을 유지하는 표준 기술 / 해커가 개인 정보 및 금융 정보를 포함한 전송되는 모든 정보를 열람하거나 훔치는 것을 방지함
- TLS (전송 계층 보안, Transport Layer Security)
: TLS는 가장 최신 기술로 더 강력한 버전의 SSL / SSL이 더 일반적으로 사용되는 용어이므로, 여전히 보안 인증서는 SSL이라 불림
2. https 특징
1) 인증서 : 데이터 제공자 신원 보장 / 도메인 종속
2) CA : 공인인즈어 발급기관 / 각 브라우저마다 있음
3) 비대칭 키 암호화 : a키로 암호화 -> b키로 복호화
인증서 발급 및 HTTPS 서버 구현
설치
mkcert라는 프로그램을 이용해서 로컬 환경(내 컴퓨터)에서 신뢰할 수 있는 인증서를 만들 수 있다.
Ubuntu
$ wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64
$ chmod +x mkcert
$ sudo cp mkcert /usr/local/bin/
macOS
$ brew install mkcert
firefox를 사용할 경우 필요에 따라 설치해주세요.
$ brew install nss
인증서 생성
HTTPS 서버 작성
COOKIE
옵션 종류
- domain - 서버와 요청의 도메인이 일치하는 경우 쿠키 전송
- path - 서버의 요청의 세부경로가 일치하는 경우 쿠키 전송
- maxage/expires - 쿠키의 유효기간 설정
- httpOnly - 스크립트의 쿠키 접근 가능 여부 설정
- secure - HTTPS 에서만 쿠키 전송 여부 설정
- sameSite - CORS 요청의 경우, 옵션 및 메서드에 따라 쿠키 전송 여부 설정
- lax : GET 요청만 쿠키 전송 가능
- strict : 쿠키 전송 불가
- None: 모든(GET, POST, PUT 등등) 요청에 대해 쿠키 전송 가능
- CSRF (Cross-site request forgery, CSRF, XSRF) : 사이트 간 요청 위조 or 크로스 사이트 요청 / 웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격 / 유저가 보내는 요청을 다른 오리진에서 위조하는 것이다. 위조라는 이름 때문에 직접 데이터를 수정하는 것 같지만, 사실 요청에 담길 데이터를 직접 바꾸는 것이 아닌 다른 임의의 endpoint에 query parameter만 변경하여 전송하는 등의 방법이다. 어떤 메소드로 요청을 하는지(GET, POST, PUT, 등), 어떠한 endpoint에 요청을 보낼때 필요한 parameter가 무엇인지만 안다면 요청을 위조하여 보낼 수 있다(가령 username을 phillip에서 hacker로 변경하는것처럼). 쿠키 방식의 인증을 사용하는 곳에서 사용이 가능하며 sameSite 옵션을 사용하면 많은 csrf공격을 방지할 수 있다.
쿠키 vs 세션 비교
| 설명 | 접속상태 저장경로 | 장점 | 단점 |
---|
Cookie 쿠키 | just http의 stateless한 점을 보완해주는 도구 | client | 서버의 부담을 덜어줌 | 쿠키 그 자체는 인증이 아님 |
Session 세션 | 접속상태를 서버가 가짐(stateful) 접속상태와 권한 부여를 위해 세션 아이디를 쿠키로 전송 | server | 신뢰할 수 있는 유저인지 서버에서 추가로 확인이 가능 | 하나의 서버에서만 접속 상태를 가지므로 분산에 불리함 |