- ...
- HTTP Session 이란?
- 서버가 클라이언트를 식별하는 방법.
- “클라이언트가 서버에 접속해 있는 상태”를 하나의 Session 이라는 단위 관리.
- Session은 서버에 저장이 되고, 그 이후 해당 SessionID 가 내려감. 클라이언트에서는 해당 Cookie가 셋팅 됨.
- 그럼 TCP Session 는 ??? socket의 PID를 기반으로 관리 ???
- HTTP는 기본적으로 Thread가 tcp socket 비연결 지향이기 때문에, Keep-Alive 옵션이 제공.
- Connectionless : 클라이언트가 서버에 요청을 하고 서버가 클라이언트에게 응답을 보내면 접속을 끊는다.
- Stateless : 통신이 끝나면 상태 정보를 유지하지 않는다.
- 즉, 매번 socket(port)를 열어야 하는 비효율적인 구조에서 재요청시 이미 열려 있는 socket(port)에 전송가능.
- HTTP Header Authorization
- Basic, Bearer, ...
- HTTP Header Content-Type
- 예) application/x-www-form-urlencoded;charset=UTF-8
- Web <form> Elements 부터 POST 요청시, 표준 MIME type 이 바로 "application/x-www-form-urlencoded"
- ServletContainer는 Content-Type이 "application/x-www-form-urlencoded" 이면, Request Body를 Map으로 변환
- ex) "key-value 형태" : key=value&key=value&key=value&key=value&key=value&...
- 예) application/json
- 예) application/x-www-form-urlencoded;charset=UTF-8
- HTTP Cache
- Cache-Control: public, max-age=3600
- public이면 공유 캐시(또는 중개 서버)에 저장해도 된다는 뜻이고 private이면 브라우저같은 특정 사용자 환경에만 저장하라는 뜻입니다.
- 3600초까지는 서버에 요청없이 캐쉬데이터를 사용하며, 3600초 경과 후에는 서버에 꼭 유효성검사를 해
- Age: 60
- Age 헤더는 캐시 응답 때 나타나는데, max-age 시간 내에서 얼마나 흘렀는지 초 단위로 알려줍니다.
- Expires: Thu, 26 Jul 2018 07:28:00 GMT
- Cache-Control과 별개로 응답에 Expires라는 헤더를 줄 수도 있습니다. 응답 컨텐츠가 언제 만료되는지를 나타내며, Cache-Control의 max-age가 있는 경우 이 헤더는 무시됩니다.
- Etag: W/"3bf2-wdj3VvN8/CvXVgafkI30/TyczHk"
- 컨텐츠가 바뀌었다면 ETag 헤더 값도 34567로 바뀝니다. 그러면 클라이언트가 이 응답 내용이 달라졌구나를 깨닫게 되어 캐시를 지우고 새로 컨텐츠를 내려받을 수 있게 됩니다.
- Last-Modified : ...
- If-None-Match: W/"3bf2-wdj3VvN8/CvXVgafkI30/TyczHk"
- 서버보고 ETag가 달라졌는 지 검사해서 ETag가 다를 경우에만 컨텐츠를 새로 내려주라는 뜻입니다.
- 만약 ETag가 같다면 서버는 304 Not Modified를 응답해서 캐시를 그대로 사용하게 합니다.
- Cache-Control: public, max-age=3600
- HTTP Chunked
- 요청 : TE
- 응답 : Transfer-Encoding
- 예) chunk#1 , chunk#2 , chunk#3 , ... , Last chunk(0<CR><LF>), Trailer(Content-MD5: ... <CR><LF>).
- 응답 Body size를 알 수 있는 3가지 방식
- 클라이언트의 요청 후에 응답 body를 수신하다가 연결이 종료되었다면, 종료되기 전까지 받은 데이터의 크기가 body의 size.(HTTP 1.0)
- 응답 헤더의 Content-Length: 헤더를 통해서 body size 얼마인지 클라이언트에 알려 줌.
- Chunked 방식을 통해서 마지막 body 데이터로 0<CR><LF>를 전송
- 사용처
- 서버에서 전체 응답 데이터를 구성하는데 시간이 오래걸려, 일부 구성된 데이터를 먼저 응답할 때.
- 서버에서 전체 응답 데이터를 구성하는데, 데이터 완료시그 전체 사이즈를 정확히 알수 없어서 일부 완료된 데이터를 먼저 응답할 때.
- ...
- 공개키 인프라구조
- 네트워크 암호화 개론
- 부분 암호화 : 암호Key 안전공유이슈
- 전송계층 암호화 : 모든데이터 암호화 ex) SSL, TLS, VPN, ...
- 대칭키(비밀키) : 암호키 == 복호키 // 성능빠름, 유출위험
- 비대칭키(공개키+비밀키): 암호키 != 복호키 // 성능안빠름, 유출낮음, "PublicKey + PrivateKey"
- SSL 시나리오
- 1) client -(https)-> server
- 2) 아마도? server -(인증서)-> client
- 3) 아마도? client : '인증서'의 '도메인' 비교 및 신뢰판단
- ("보안인증서출처" == 'http://www.test.co.kr')
- (그래서? 000.111.222.333 IP 으로 HTTPS하면~ 잘안됨?)
- 4) 아마도? client : '인증서'의 '발급기관PubKey' 확인 및 신뢰판단
- (SSL/TLS 지원 브라우저 client는 'RootCA공개키' 가지고 있음)
- 4-1) server 에서 client 의 신원확인 하는법
- client : ('Server공개키'암호화)&('Client비밀키'암호화) -> server : ('Client공개키'복호화)('Server비밀키'복호화)
- 4-2) 아마도? client 에서 '인증서' 의 확인 하는법
- client : '인증서' -(RootCA공개키 복호화)-> 성공 (이것이 "전자 서명 인증서" ???)
- TLS 시나리오
- TLS : SSL(Secure Sockets Layer) 3.0기반의 네트워크 보안 (데이터 암호화) 기술. // 그냥 SSL이라 불러.
- TLS 핸드쉐이크 : "비대칭키(공개키+비밀키)" 방식으로 -> "대칭키(비밀키)"를 공유 -> 안정성 과 성능 모두 GoodUp!!!
- 시나리오 :
- 1) 클라이언트 -> (Cipher Suite List:암호가능목록) & (Session아이디) -> 서버
- 2) 서버 -> (Cipher Suite:특정 암호방식) & (인증서) & (난수) -> 클라이언트
- Client가 Server의 '공개키'(인증서)를 얻어옴
- 제3의 상위 신뢰된 인증기관(RootCA:Certificate Authority) 인 "공인인증기관" 의 서명받은것 == 공인인증서
- SSL/TLS 지원 Client는 'RootCA공개키'를 가지고 있음 (인증서를 'RootCA공개키'으로 복호화확인)
- 3) 클라이언트 : '인증서'가 "신뢰된 인증기관"인지? 확인 후, 다음절차진행
- 3) 클라이언트 : Server난수 + Client난수 => 대칭키(비밀키) 생성 (pre master secret)
- 4) 클라이언트 -> 대칭키(비밀키) -> {인증서(비대칭키(공개키)) 암호화} -> 서버
- 4) 클라이언트 & 서버 : (pre master secret) -> {일련의과정} -> (master secret) -> {생성} -> (session key)
- 5) 핸드쉐이크 종료
- 6) 대칭키(비밀키) 으로 "모든데이터를 암호화" 통신~
- 7) 대칭키(비밀키)는 언제까지 유효??? HTTPS 커넥션을 어떻게 관리???
- pre master secret 값을 -> master secret 값으로 만듬 -> master secret는 session key를 생성 -> session key 값을 이용해 세션유지!!!
- 세션종료 : 데이터의 전송이 끝나면 SSL 통신이 끝났음을 서로에게 알려준다. 이 때 통신에서 사용한 대칭키인 session key 를 폐기한다.
- 실습) 인증서 만들어 보기!
-끝-
(% 별책부록 : HTTPchunked(장).pdf)
(% 별책부록 : SPDY(장).pdf)
'통신과 프로토콜 그리고 보안' 카테고리의 다른 글
JWT (JSON Web Token) (0) | 2020.10.19 |
---|---|
OAuth (0) | 2019.11.10 |
SMTP , (POP3) , (IMAP) (0) | 2019.11.10 |
SSH (TELNET) , (scp), (rsync) (0) | 2019.11.10 |
인터넷(Internet) 과 웹(Web) (0) | 2019.10.27 |