goal
- 인증 (Authentication) 에 대해서 알아본다.
- 암호화, hasing, salting 의 개념을 안다.
- HTTP vs HTTPS 차이점을 이해하다.
- 권한부여 (Authorization), 인증(Authentication) 을 이해한다.
- 쿠키, 세션, 토큰, OAuth를 통해 인증을 구현한다.
- 클라이언트, 서버, 데이터베이스의 전체 동작을 이해한다.
- 회원가입 및 로그인 등의 유저인증을 구현한다.
- 서비스의 보안과 관련된 방법을 탐색 후 원리, 장단점을 이해한다.
https (Hyper Text Transfer Protocol Secure Socket layer)
(= HTTP over SSL(TLS), HTTP over Secure)
- HTTP보다 상대적으로 안전한 방법이고, 데이터 제공자의 신원을 보장받을 수 있다.
데이터 제공자의 신원을 확인하고 보장받는 게 인증에서 중요한 이유
- 클라이언트는 데이터 제공자가 제공해준 데이터를 사용할 수밖에 없으므로 (클라이언트는 서버에 데이터 요청을 하고 이후 받은 데이터를 이용해서 화면을 렌더링하는 등의 작업을 해야)
- 따라서, "중간자공격(요청이나 응답을 중간에서 가로채는 공격)"에 매우 취약하다.
- 따라서, 해당 데이터를 암호화시켜야 한다.
1. 암호화
- https 프로토콜의 특징 중 하나가, 암호화된 데이터를 주고 받기 때문에, 중간에 요청이 공격당하더라도, 그 데이터의 내용을 알아볼 수 없다는 것이다.
2. 인증서 (Certificate)
- https 프로토콜의 특징 중 또 하나는, 브라우저가 응답과 함께 전달된 인증서 정보를 확인할 수 있다는 것이다. 브라우저는 인증서에서 해당 이증서를 발급한 CA 정보를 확인하고, 인증된 기관이 아니면, 경고창을 띄운다.
이러한 방식으로 브라우저는 인증된 CA가 발급한 인증서를 이용해서 데이터를 제공하는 안전한 서버를 사용할 수 있도록 사용자를 유도한다.
HTTPS 사설 인증서 발급 및 서버 구현
설치
$ sudo apt install libnss3-tools
$ 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/
$ brew install mkcert
# firefox를 사용할 경우 필요에 따라 설치해주세요.
$ brew install nss
인증서 생성
$ mkcert -install
- 다음은 로컬 환경에 대한 인증서를 만들어야 한다.
localhost로 대표되는 로컬 환경에 대한 인증서를 만들려면 다음 명령어를 입력한다.
$ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1
- 이제 옵션으로 추가한 localhost, 127.0.0.1(IPv4), ::1(IPv6)에서 사용할 수 있는 인증서가 완성되었다. cert.pem, key.pem 이라는 파일이 생성된 것을 확인할 수 있다.