auth-session sprint study

ᄋᄋ·2022년 3월 16일
0

CORS


HTTPS 프로토콜

HTTPS는 Hyper Text Transfer Protocol Secure Socket layer 의 약자임.
HTTP over SSL(TLS), HTTP over Secure라고 부르기도 함.

HTTPS는 HTTP 요청을 SSL 혹은 TLS라는 알고리즘을 이용해, HTTP 통신을 하는 과정에서 내용을 암호화하여 데이터를 전송하는 방법임.

암호화

HTTPS 프로토콜의 특징 중 하나는 암호화된 데이터를 주고받기 때문에, 중간에 인터넷 요청이 탈취되더라도 그 내용을 알아볼 수 없음.

인증서

HTTPS 프로토콜의 또 다른 특징 중 하나는 브라우저가 응답과 함께 전달된 인증서 정보를 확인할 수 있다는 점임.

HTTPS 통신


위 그림을 더 자세히 이해하기 위해 아래의 영상을 참고했음.


https://opentutorials.org/course/228/4894

그리고 위의 내용은 옛날 거라 지금 쓰는 방식(TLS 1.3)과는 차이가 있음.

옛날 방식에서 의문인 부분:
client Hello와 Server Hello를 거치면서 클라와 서버는 서로의 랜덤 스트링을 알게 되었음. 그리고 클라는 서로의 랜덤 스트링을 조합해 pre master secret 키를 생성하고 그 키를 서버인증서로부터 얻은 서버 공개키로 암호화하여 서버에 전달함.

그리고 서버는 그 암호화된 pre master secret 키를 서버 비밀키로 복호화하여 원상태의 값을 얻게 됨. 즉 클라와 서버는 pre master secret 키를 공유하게 됨.

그런데 애초에 클라에서 pre master secret 키를 만들어 서버에 전달하는 거면 client Hello때 랜덤 스트링을 서버에 공유할 이유가 없지 않나??


최신 방법
Diffie-Hellman 키 교환 방식(y = g^x mod p)으로 Pre-Master Secret을 생성한다.

  1. 서버의 Diffie-Hellman 매개변수 생성:
    서버는 처음에 안전한 소수(p)와 그 소수의 원시 루트(g)를 선택한다(서버 파라미터).
    이러한 서버 파라미터는 서버 인증서와 함께 클라이언트에게 전송된다(인증서 안에 포함되는 거 아님).

  2. 클라이언트의 Diffie-Hellman 값 생성:
    클라이언트는 서버로부터 받은 서버 파라미터(p, g)를 사용하여 자신의 비밀값(x에 해당)을 생성한다. 이 비밀값을 a라고 하자.
    클라이언트는 A = g^a mod p를 계산하여 A를 생성한다.

  3. 서버의 Diffie-Hellman 값 생성:
    서버도 자신만의 비밀값(x에 해당)을 생성하고, 이 비밀값을 b라고 하자.
    서버는 B=g^b mod p를 계산하여 B를 생성한다.

  4. 클라이언트와 서버 간의 값 교환(교환값 암호화는 일어나지 않음.):
    클라이언트는 서버에 A를 보낸다.

    서버는 클라이언트로부터 받은 A를 사용하여 자신의 비밀값 b를 이용하여 공유 비밀값 s=A^b mod p를 계산한다.

    마찬가지로, 서버는 생성한 B를 클라이언트에게 보낸다.

    클라이언트는 서버로부터 받은 B를 사용하여 자신의 비밀값 a를 이용하여 공유 비밀값 s=B^a mod p를 계산한다.

    즉, 클라이언트와 서버는 s라는 값을 공유하는 것이다.

  5. Pre-Master Secret 생성:
    클라이언트와 서버는 공유 비밀값 s를 사용하여 Pre-Master Secret을 생성한다.

    Pre-Master Secret은 각자의 구현에 따라 조합 방식이 다를 수 있지만, 일반적으로는 해시 함수 등을 사용하여 조합한다.

    이렇게 생성된 Pre-Master Secret은 클라이언트와 서버 간의 공통의 비밀값으로 사용되며, 이를 기반으로 Master Secret 및 최종적으로는 세션 키가 생성된다. 이런 방식으로 Diffie-Hellman 키 교환을 통해 양쪽이 안전하게 세션 키를 공유할 수 있다.

    의문점:
    이 방식은 서버인증서로부터 얻은 서버 공개키를 활용하지 않는다. 그래서 이런 방식을 사용하는 경우 인증서에 서버 공개키가 없거나 또는 서버 공개키를 클라이언트가 획득하지 않는 건지 궁금하다.



세션기반 인증 (Session-based Authentication)

- express-session

profile
개발자A

0개의 댓글