링크:/question/52320264/answer/130042542
출처: 지평.
저작권은 저자가 소유한다. 상업전재는 저자에게 연락하여 허가해 주십시오. 비상업적 전재는 출처를 명시해 주십시오.
Ssl 세션 다중화
먼저 https 를 사용하여 통신할 때 소비와 지연 증가는 주로 SSL 핸드쉐이크 단계에 있습니다. 이 단계에서 클라이언트와 서버측은 쌍방이 지원하는 암호화 해독 키트와 같은 몇 가지 매개변수를 협상하고 마지막으로 세션 키를 생성해야 합니다.
이 프로세스는 주로 세션 키 생성을 보호하기 위한 비대칭 암호화 프로세스입니다.
비대칭 암호화 프로세스는 시간이 많이 걸리고 계산량도 크기 때문에 이후의 모든 통신은 AES- 128 및 세션 키를 사용하여 통신을 암호화하는 것과 같은 대칭 암호화입니다.
이 세션 키 협상 과정은 주요 오버 헤드입니다. 세션당 이러한 오버헤드를 방지하기 위해 세션 재사용이 발생합니다.
이 단계에서는 세션 id 와 세션 티켓이라는 두 가지 세션 재사용 메커니즘이 지원됩니다. 세션 id 메커니즘은 서버에 의해 마스터 정보를 저장하고 세션 티켓은 클라이언트에 의해 마스터 정보를 저장합니다.
세션 id 메커니즘: 클라이언트가 세션을 재사용하려는 경우 클라이언트 hello 메시지에 pre-master secret, master secret 및 session key 와 같은 이전 세션 정보에 해당하는 세션 id 번호를 보냅니다 서버가 클라이언트의 아이디어를 지원하는 경우 이 세션 id 번호를 기준으로 id 번호에 해당하는 현재 세션 정보를 로컬로 쿼리합니다. 세션 키와 같은 정보가 발견되면 서버 셸로에서 클라이언트로 다시 전송되는 메시지에 일반 세션 id 필드가 포함되어 id 재사용을 지원함을 나타냅니다. 그런 다음 세션 키를 재협상하는 과정을 생략하고 현재 세션 키를 직접 재사용하여 세션 재사용 목적을 달성했습니다.
이 메커니즘의 특징을 볼 수 있습니다. 서버는 id 와 세션 상태의 사전을 저장해야 하지만, 클라이언트가 많을 때 서버의 부담이 크게 증가하고 확장성이 떨어집니다. 또한 서버 클러스터의 경우 세션 id 재사용 성공률도 낮아집니다. 클라이언트가 두 번째 통신을 할 때 서버에서 이 id 번호를 저장하지 않을 수 있기 때문에 재사용이 실패하거나 다시 악수를 해야 하기 때문입니다.
이 경우 id 및 세션 상태를 공통 스토리지 미디어 (예: redis/memcached) 에 저장하여 모든 서버 노드에서 해당 id 의 상태를 쿼리하고 재사용률을 높일 수 있습니다. 현재, 우리 회사는 redis 를 이용하여 그것들을 저장한다.
세션 티켓 메커니즘: 세션 id 를 확장할 수 없는 단점으로 인해 나중에 티켓 재사용 메커니즘이 생겨 클라이언트에 스토리지 압력을 가합니다. 즉, 새 세션이 끝나면 서버는 자유롭게 알려진 키 ticket key 를 사용하여 세션 상태를 암호화한 다음 클라이언트에 전송하여 클라이언트가 티켓을 저장합니다. 다음 번에 클라이언트가 서버에 SSL 연결을 설정할 때 이 티켓을 서버로 보냅니다. 서버만이 이 티켓을 잠금 해제할 수 있고, 표 키가 유출되지 않아 보안이 보장되기 때문이다. 서버가 티켓을 잠금 해제한 후 세션 키 등을 포함한 세션 상태를 제거합니다. ) 를 입력하고 이 세션 키를 사용하여 통신을 암호화합니다 (클라이언트는 물론 현재 세션 키를 알고 있음).
이 방법은 또한 세션 재사용의 목적을 달성하여 모든 스토리지 압력을 클라이언트로 전송하여 확장성을 제공합니다. 이 단계에서 모든 주류 브라우저는 먼저 티켓 재사용을 지원합니다.
그러나 이 방법에는 서버 클러스터의 모든 노드가 동일한 티켓 키를 사용해야 하며 시간이 지남에 따라 안전하지 않다는 단점이 있습니다. 따라서 이 표 키는 교체가 필요하지만, 기존 표 키와 호환되고, 새 표 키로 암호화 암호 해독하고, 이전 표 키로만 암호 해독하고, 마지막으로 이전 표 키를 단계적으로 폐기해야 한다는 점에 중점을 두고 있다. 안전한 재사용 효과를 얻을 수 있습니다.
현재 이런 표 키의 교체 방식은 여러 가지가 있다. 우리 회사는 현재 cloudflare 의 오픈 소스 교체 방식을 채택하고 있으며, 매시간 한 번씩 번갈아 간다. 특정 코드는 github 에서 찾을 수 있습니다.