HTTP 란
HTTP는 평문 통신이다. 복잡한 형식의 데이터를 주고 받는 것이 아닌, 텍스트를 주고 받는 형식이다.
그렇기 때문에 누군가 통신을 가로챈다면 통신 그대로 보이는 불완전한 통신이다. 통신 상대 또한 확인하지 않고 통신한다.
HTTPS 란
HTTPS는 HTTP에 Secure Socket가 추가된 형태
기존의 HTTP 통신에 SSL 혹은 TLS 프로토콜를 조합하여 세션 데이터를 암호화한다.
공개키 암호화 방식이 HTTPS의 암호화에 사용된다.
- 클라이언트는 공개키 저장소에서 목적지 서버의 공개키를 가져온다.
- 공개키 알고리즘과 공개키를 통해, 전송하려는 평문을 암호화하여 보낸다.
- 서버는 개인키로 클라이언트가 보낸 데이터를 복호화한다.
공개키 암호화 방식에서는 공개키와 개인키가 존재한다. 공개키로 암호화 하면 개인키로 복호화가 가능하다.
즉, A로 암호화 하면 B로만 복호화가 가능하고, 반대로 B로 암호화하면, A로만 복호화가 가능하다.
공개키 암호화 방식을 SSL통신 절차에 적용을 하면,
- 클라이언트는 서버에 접속하면, 서버인증서(CA)를 받는다.
- 서버인증서 신뢰 여부 체크 후, 공개키를 추출한다.
- 클라이언트는 서버와 통신하는 동안만 사용할 대칭키를 임의로 만들고, 해당 대칭키를 공개키로 암호화 후 전송 한다.
- 서버는 개인키로 클라이언트가 보낸 메시지를 복호화하여 대칭키를 추출하고, 해당 대칭키를 이용하여 클라이언트와 통신한다.
SSL을 이용하여 통신을 하면, 서로는 각자 통신 대상이 누구인지 확인 할 수 있고 정보의 정확성과 안정성이 높아 진다.
HTTP가 TCP와 직접 통신하는 방식이었다면,
HTTPS는 HTTP -> SSL -> TCP의 순서로 통신하게 된다.
또한, HTTP는 80포트를 사용하지만, HTTPS는 443포트를 사용한다.
HTTP 프로토콜의 특징
Connectionless(비 연결지향)
- HTTP는 클라이언트가 서버에 요청을 보내고, 서버는 클라이언트에게 응답을 주고 Connection을 끊는 특성이 있다.
HTTP Header에 keep-alive
을 통해 연결을 재활용 할 수는 있지만, 기본은 비 연결지향적인 프로토콜이다.
Stateless(무 상태)
- 서버와의 연결이 끊기는 순간 통신이 끝나며, 해당 연결의 상태 정보를 유지하지 않는 특성이 있다.
Connectionless와 Stateless 두 가지 특성 때문에,
HTTP는 매 통신마다 새로운 connection을 만들어 인증부터 새롭게 시작해야 하는 상황도 벌어진다.
따라서 HTTP는 Connectionless와 Stateless 특성을 보완하기 위해 쿠키와 세션을 사용한다.
쿠키 & 세션
쿠키
쿠키는 클라이언트의 로컬에 저장되는 key-value 데이터다. 쿠키는 이름, 값, 만료일, 경로 정보로 구성되어 있다.
- 쿠키 프로세스
- 클라이언트가 웹 서버에 요청을 보낸다.
- 웹 서버는 쿠키를 생성해서 클라이언트에게 응답으로 보낸다.
- 클라이언트는 받은 쿠키를 로컬에 저장하다, 서버에게 요청을 보낼 때, 쿠키를 함께 보낸다.
- 동일 웹사이트 방문 시, 클라이언트의 로컬에 해당 사이트의 쿠키가 있는 경우, 웹서버에 쿠키와 함께 요청을 보낸다.
세션
세션은 서버에 저장되는 클라이언트의 상태 데이터다. 서버는 일정시간 동안 세션을 보관한다.
일정 시간이 초과하거나, 클라이언트와의 연결이 종료될 경우 서버는 해당 세션을 삭제한다.
- 세션 프로세스
- 클라이언트의 요청에 session-id가 필요하다고 판단되면, 서버는 세션 정보를 저장하고, session-id를 생성하여 클라이언트에게 돌려준다.
- 클라이언트는 서버에게 받은 session-id를 쿠키에 저장한다(JSESSIONID)
- 클라이언트는 HTTP Header의
Cookie
필드에 session-id를 포함하여 서버에 요청을 보낸다.
쿠키와 세션 비교
쿠키 | 세션 | |
---|---|---|
저장위치 | 클라이언트 | 서버 |
보안 | 취약 | 세션ID만 저장, 쿠키보다 안전 |
라이프사이클 | 브라우저를 종료해도 남음 | 브라우저 종료시 삭제 |
속도 | 빠름 | 느림 |
References
https://jeong-pro.tistory.com/89
https://kmj1107.tistory.com/entry/
https://hahahoho5915.tistory.com/32
https://jeong-pro.tistory.com/80