spring과정을 마치고 인증과 보안의 기초적인 개념을 배웠다.
HTTP
HTTPS(Hyper Text Transfer Protocol Secure Socket layer)
- HTTPS는 HTTP 요청을 SSL 혹인 TLS라는 알고리즘을 이용해 HTTP 통신을 하는 과정에서 데이터를 암호화하여 전송하는 방법
특징
1. 암호화
비대칭키, 대칭키 방식을 혼용하여 사용한다.
- 대칭키 방식: 양쪽이 공통의 비밀키를 공유하여 데이터를 암호화 및 복화화 하는 것
- 비대칭키 방식: 공개키와 비밀키(개인키)를 가지고 상대가 나의 공개키로 암호화한 데이터를 개인이 가진 비밀키로 복호화하는 것.
- 클라이언트와 서버가 데이터를 주고받을 때는 대칭키 방식을 사용한다. > 비대칭키가 더 복잡하기 때문.
- HTTPS는 대칭키를 주고받을 때 비대칭키 방식으로 주고받는 것을 의미한다. = 비대칭키는 공개키로 암호화한 정보는 개인이 가진 비밀키로만 풀 수 있으므로 중간에 대칭키가 탈취되더라도 개인키가 없이는 이를 복호화할 수 없기 때문
2.인증서
- 브라우저가 서버의 응답과 함께 전달된 인증서를 확인할 수 있다는 점 = 서버의 신원을 보증.
- 여기서 보증할 수 있는 제3자를 Certificate Authority, CA라고 부른다. (엄격하게 공인된 기관들 의미.)
- 이러한 CA들은 서버의 공개키와 정보를 CA의 비밀키로 암호화하여 인증서를 발급
- 인증서 발급 과정
- 서버가 클라이언트에게 CA에서 발급받은 인증서 전달
- 클라이언트는 OS또는 브라우저에 미리 내장되어 있던 CA 리스트를 통해 브라우저에서 인증된 CA에서 발급받은 인증서인지 먼저 확인
- CA에서 발급한 인증서가 아니라면 경고창 띄움
- 인증서가 확인되었다면 브라우저에 제공된 해당 CA 기관의 공개키로 서버 인증서 복호화
- 클라이언트는 서버를 믿을만한 대상인지 신뢰할 수 있다.
HTTPS 사설 인증서 발급 및 서버 구현
자바가 지원하는 인증서 형식은 두 가지가 있다.
-
PKCS12 (Public Key Cryptographic Standards #12) : 여러 인증서와 키를 포함할 수 있으며, 암호로 보호된 형식
-
- JKS (Java KeyStore) : PKCS12와 유사합니다. 독점 형식이며 Java 환경으로 제한됩니다.
해싱 (Hashing)
해싱은 암호화만 가능하다. 복호화는 불가능
- 해시 함수를 사용해 암호화 진행.
- 해시함수의 특징
- 항상 같은 길이의 문자열 리턴
- 서로 다른 문자열에 동일한 해시 함수를 사용하면 반드시 다른 결과값이 나온다
- 동일한 문자열에 동일한 해시 함수를 사용하면 항상 같은 결과값이 나온다.
레인보우 테이블과 솔트(Salt)
- 레인보우 테이블 : 항상 같은 결과값이 나온다는 특성을 이용해 해시 함수를 거치기 이전의 값을 알아낼 수 있도록 기록해 놓은 표
- 유출시 해싱을 했더라도 해싱 이전의 값을 알아낼 수 있기에 보안상 위협이 될 수 있다.
- 이때 활용하는 것이 솔트(Salt): 해싱 이전의 값에 임의의 값을 더해 데이터가 유출되더라도 해싱 이전의 값을 알아내기 더욱 어렵게 만드는 방법
Cookie
- 어떤 웹사이트에 들어갔을 때, 서버가 일방적으로 클라이언트에 전달하는 작은 데이터
- 서버가 웹 브라우저에 정보를 저장하고 불러올 수 있는 수단
- 해당 도메인에 대해 쿠키가 존재하면, 웹 브라우저는 도메인에게 http 요청 시 쿠키를 함께 전달
- 이용법
- 삭제하지 않는다면 사라지지 않는다는 특성이 있다.
- 장기간 저장이 필요한 옵션을 클라이언트에 저장하기 용이하다. = 사용자 선호, 테마 등
- 로그인, 로그아웃을 위해 인증정보를 쿠키를 통해 저장
- 회사가 필요한 마케팅 정보를 쿠키에 저장
Session
- 인증에 따라 리소스의 접근 권한(Authorization) 이 달라집니다.
- 세션은 사용자가 인증에 성공한 상태를 의미한다.
- 서버는 일종의 저장소에 세션을 저장합니다. (그림에서 2번) 주로 in-memory, 또는 세션 스토어(redis 등과 같은 트랜잭션이 빠른 DB)에 저장합니다.
웹사이트에서 로그인을 유지하기 위한 수단으로 쿠키를 사용합니다. 쿠키에는 서버에서 발급한 세션 아이디를 저장합니다