ํฐ์คํ ๋ฆฌ ๋ทฐ
HTTP ์๋ฒฝ๊ฐ์ด๋ 14์ฅ Secure HTTP๋ฅผ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
HTTP๋ hypertext transfer protocol
http://๋๋ฉ์ธ ←๋๋ฉ์ธ์ ํด๋น๋๋ ์ปดํจํฐ์ ํต์ ์ ํ๊ณ ์ ํ๋๋ฐ http ํ๋กํ ์ฝ ์ฌ์ฉํ๊ฒ ๋ค๋ ๋ป์ ๋๋ค.
์ฌ๋๋ค์ ์ธํฐ๋ท์ ํตํด ์ค์ํ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์.
→๊ธฐ๋ณธ์ ์ธ ์ธ์ฆ ์ธ๊ฐ ์ธ ๋ณด์์ด ํ์
๊ทธ๋์ ๋์จ๊ฒ HTTPS. (S๋ over secure socket layer์ ์ฝ์)
๋ณด์ ์ฅ์น๊ฐ ์ถ๊ฐ๋์์.
HTTPS๋
- req & res data is encrypted.
- SSL(Secure Sockets Layer) ๋๋ TLS(Transport Layer Security)๋ฅผ ์ฌ์ฉํ์ฌ HTTP ๊ธฐ๋ฐ์ ์ํธํ๋ ๋ณด์ ๊ณ์ธต transports-level ์ ์ ๊ณต
์ํธํ
ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ฐ์ดํฐ ํต์ ์ ๋ฐ์ดํฐ๋ฅผ ์์๋ณผ ์ ์๋๋ก ํ๋ ๊ณผ์
์ํธํค
ํค๊ฐ์ ๋ฐ๋ผ ์ํธํ ๊ฒฐ๊ณผ๊ฐ์ด ๋ฌ๋ผ์ง.
๋์นญํค(symmetric-key)
- ์์ ์์ ๋ฐ์ ์ ๋ชจ๋ ๊ฐ์ ํค๋ฅผ ์ฌ์ฉ
- ์ธ์ฝ๋ฉ ๋์ฝ๋ฉ ๋ชจ๋ ๊ฐ์ ํค๋ฅผ ์ฌ์ฉ
- ๊ณต์ ํค ์ค์ (Establishing Shared Keys)
- ๋์นญํค๋ ์์ ์์ ๋ฐ์ ์๊ฐ ํต์ ํ๊ธฐ ์ด์ ์ ๊ณต์ ๋ ๋น๋ฐํค๋ฅผ ๊ฐ์ ธ์ผํจ.
- N๋ช ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ์๋ฒ์์ N๊ฐ์ key๋ฅผ ๋ณด์ ํด์ผํจ.
- ๊ด๋ฆฌ๊ฐ ์ฝ์ง๊ฐ ์์. → ๋น๋์นญํค๋ก ํด๊ฒฐ
๋น๋์นญํค(asymmetric keys) - encoding๊ณผ decoding์ ์๋ก๋ค๋ฅธ key ์ฌ์ฉ
- ์ํธํํ ๋๋ ๊ณต๊ฐํค (ํด๋ผ์ด์ธํธ → ์๋ฒ)
- ๋ณตํธํํ ๋๋ ๋น๋ฐํค (์๋ฒ)
RSA - ๊ณต๊ฐํค ์ํธํ ์๊ณ ๋ฆฌ์ฆ
- ์ํธํ๋ ํ ์คํธ์ ๊ณต๊ฐํค๋ก ๋น๋ฐํค๋ฅผ ์์ ๋ผ ์ ์๋๋ก ํ๊ธฐ ์ํด์ ๋ง๋ค์ด์ง.
- Ron Rivest, Adi Shamir, Leonard Adleman ์ธ ์ฌ๋์ ์ฑ์ ๋ฐ์ ๋ค์ด๋ฐ.
- ์ ์ธ๊ณ ๋๋ถ๋ถ์ ์ธํฐ๋ท ๋ฑ ํน์์ RSA-2048์ ์ฌ์ฉํ๋ค๊ณ ํฉ๋๋ค
๊ทธ ์ธ ์ถ๊ฐ์ ์ธ ์ธ์ฆ ์๋จ
์๋ช (Signatures)
- ์ํธ ์์คํ ์ ์ฌ์ฉํ์ฌ ๋ฉ์ธ์ง์ ์๋ช ํ๊ณ ์กฐ์๋์ง ์์์์ ์ฆ๋ช
- ์๋ช ์ ํตํด ๋ณธ์ธ์ ์ฆ๋ช
๋์งํธ ์ธ์ฆ์(Digital Certificates)
- X.509 v3 ํ์ค ํ์์ผ๋ก ์ ๋ณด๋ฅผ ์ ์ฅ
- ์น ์๋ฒ ์ธ์ฆ์, ํด๋ผ์ด์ธํธ ์ ์ ๋ฉ์ผ ์ธ์ฆ์, ์ํํธ์จ์ด ์ฝ๋ ์๋ช ์ธ์ฆ์, ์ธ์ฆ ๊ธฐ๊ด ์ธ์ฆ์ ๋ฑ์ ์ฌ์ฉ
HTTPS Schemes
- HTTP ์ผ ๊ฒฝ์ฐ
- 80 ํฌํธ๋ก ์ฐ๊ฒฐ
- HTTPS ์ผ ๊ฒฝ์ฐ
- 443 ํฌํธ๋ก ์ฐ๊ฒฐ
- ์๋ฒ์ handshakes - SSL ์ธ์ฆ์ ๊ตํ
HTTPS์์ ์ ์ก ๋จ๊ณ
- ํด๋ผ์ด์ธํธ๋ 443 ํฌํธ(๋ณด์ HTTP์ ๊ธฐ๋ณธ ํฌํธ)์ ์ฐ๊ฒฐ
- TCP๊ฐ ์ฐ๊ฒฐ๋๋ฉด ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ SSL ๊ณ์ธต ์ด๊ธฐํ ํ ํค๋ฅผ ๊ตํ (handshake)
- ๊ตํํ ํค๋ก ์ํธํ ์์
- ํด๋ผ์ด์ธํธ๊ฐ ๋ณด์ ๊ณ์ธต์ผ๋ก request ๋ฉ์์ง๋ฅผ ์ ์ก
- TCP disconnect
handshake
- ์ํธ ์ ํ
- ID ์ธ์ฆ
- ์ฑ๋ ์ํธํ๋ฅผ ์ํ ์์ ์ธ์ ํค ์์ฑ
Server Certificates
- HTTPS ์ ์ก ์ ํญ์ ํ์
- ์ ์ฉ์นด๋ ์ ๋ณด์ ๊ฐ์ ๋ณด์์ ์ก
- ์กฐ์ง์ ์ด๋ฆ, ์ฃผ์, ์๋ฒ DNS ๋๋ฉ์ธ ์ด๋ฆ ๋ฐ ๊ธฐํ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ X.509 v3์์ ํ์๋ ์ธ์ฆ์
Site Certificate Validation
๋ธ๋ผ์ฐ์ ์ธ์ฆ์์ ๋ํ ๊ฒ์ฆ 4๊ฐ์ง ๋ฐฉ๋ฒ
- ์ธ์ฆ์ ๋ง๋ฃ ์ผ์ ํ์ธ
- ์ธ์ฆ๊ธฐ๊ด(eg. CA)์ผ๋ก๋ถํฐ์ ์๋ช ํ์ธ
- ์๋ช ๊ถํ์ด ์ ๋ขฐํ ์ ์๋ ๊ฒ์ผ๋ก ํ๋จ๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์๋ช ๊ถํ์ ๊ณต์ฉ ํค๋ฅผ ์๋ช ์ ์ ์ฉ
- ์ธ์ฆ์์ ๋๋ฉ์ธ ์ด๋ฆ์ด ํต์ ํ ์๋ฒ์ ๋๋ฉ์ธ ์ด๋ฆ๊ณผ ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค.
Virtual Hosting and Certificates
์๋ฒ ์ธ์ฆ์์ ๋์ด๋ ๊ณต์ ํธ์คํธ ์ด๋ฆ์ด ์ฌ์ฉ์๊ฐ ๊ฒ์ํ ๊ฐ์ ํธ์คํธ ์ด๋ฆ๊ณผ ์ผ์นํ์ง ์๋ ๋ฌธ์
๋๋ฉ์ธ ์ฃผ์๊ฐ www.naver.com ์ธ๋ฐ https://www.naver.com ๋ฅผ ์ ๋ ฅํ ๊ฒฝ์ฐ
→ ๋ฆฌ๋ค์ด๋ ์ ์ผ๋ก ํด๊ฒฐํด์ค์ผ ํจ.
Open SSL
/*************************************************************
- https_client.c --- very simple HTTPS client with no error checking
- usage: https_client servername
- *******/
#include <stdio.h> #include <memory.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h>
#include <openssl/crypto.h> #include <openssl/x509.h> #include <openssl/pem.h> #include <openssl/ssl.h> #include <openssl/err.h>
void main(int argc, char **argv) { SSL *ssl; SSL_CTX *ctx; SSL_METHOD *client_method; X509 *server_cert; int sd,err; char *str,*hostname,outbuf[4096],inbuf[4096],host_header[512]; struct hostent *host_entry; struct sockaddr_in server_socket_address; struct in_addr ip;
/========================================/ /* (1) initialize SSL library / /========================================*/
SSLeay_add_ssl_algorithms( ); client_method = SSLv2_client_method( ); SSL_load_error_strings( ); ctx = SSL_CTX_new(client_method);
printf("(1) SSL context initialized\n\n");
/=============================================/ /* (2) convert server hostname into IP address / /=============================================*/
hostname = argv[1]; host_entry = gethostbyname(hostname); bcopy(host_entry->h_addr, &(ip.s_addr), host_entry-
h_length);
printf("(2) '%s' has IP address '%s'\n\n", hostname, inet_ntoa(ip));
/=================================================/ /* (3) open a TCP connection to port 443 on server / /=================================================*/
sd = socket (AF_INET, SOCK_STREAM, 0);
memset(&server_socket_address, '\0', sizeof(server_socket_address)); server_socket_address.sin_family = AF_INET; server_socket_address.sin_port = htons(443); memcpy(&(server_socket_address.sin_addr.s_addr), host_entry->h_addr, host_entry->h_length);
err = connect(sd, (struct sockaddr*) &server_socket_address, sizeof(server_socket_address)); if (err < 0) { perror("can't connect to server port"); exit(1); }
printf("(3) TCP connection open to host '%s', port %d\n\n", hostname, server_socket_address.sin_port);
/*======================================================== / / (4) initiate the SSL handshake over the TCP connection */
/========================================================/
ssl = SSL_new(ctx); /* create SSL stack endpoint / SSL_set_fd(ssl, sd); / attach SSL stack to socket / err = SSL_connect(ssl); / initiate SSL handshake */
printf("(4) SSL endpoint created & handshake completed\n\n");
/============================================/ /* (5) print out the negotiated cipher chosen / /============================================*/
printf("(5) SSL connected with cipher: %s\n\n", SSL_get_cipher(ssl));
/========================================/ /* (6) print out the server's certificate / /========================================*/
server_cert = SSL_get_peer_certificate(ssl);
printf("(6) server's certificate was received:\n\n");
str = X509_NAME_oneline(X509_get_subject_name(server_cert), 0, 0); printf(" subject: %s\n", str);
str = X509_NAME_oneline(X509_get_issuer_name(server_cert), 0, 0); printf(" issuer: %s\n\n", str);
/* certificate verification would happen here */
X509_free(server_cert);
/********************************************************* / /* (7) handshake complete --- send HTTP request over SSL */
/*********************************************************/
sprintf(host_header,"Host: %s:443\r\n",hostname); strcpy(outbuf,"GET / HTTP/1.0\r\n"); strcat(outbuf,host_header); strcat(outbuf,"Connection: close\r\n"); strcat(outbuf,"\r\n");
err = SSL_write(ssl, outbuf, strlen(outbuf)); shutdown (sd, 1); /* send EOF to server */
printf("(7) sent HTTP request over encrypted channel:\n\n%s\n",outbuf);
// /* (8) read back HTTP response from the SSL stack */ //
err = SSL_read(ssl, inbuf, sizeof(inbuf) - 1); inbuf[err] = '\0'; printf ("(8) got back %d bytes of HTTP response:\n\n%s\n",err,inbuf);
// / (9) all done, so close connection & clean up / //
SSL_shutdown(ssl); close (sd); SSL_free (ssl); SSL_CTX_free (ctx);
printf("(9) all done, cleaned up and closed connection\n\n");
ํ๋ก๊ทธ๋จ ์น์ ์ ์น์ ๋ณ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ํ๋ก๊ทธ๋จ ์๋จ์๋ TCP ๋คํธ์ํน ๋ฐ SSL์ ์ง์ํ๋ ๋ฐ ํ์ํ ์ง์ ํ์ผ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ์น์ 1์ ํธ๋์ ฐ์ดํฌ ๋งค๊ฐ๋ณ์ ๋ฐ ๊ธฐํ ์ ๋ณด๋ฅผ ์ถ์ ํ๋ ๋ก์ปฌ ์ปจํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค
SSL_CTX_new๋ฅผ ํธ์ถํ์ฌ SSL ์ฐ๊ฒฐ์ ๋ํ ์ํ๋ฅผ ํ์ํฉ๋๋ค.
- ์น์ 2๋ ์ ๋ ฅ ํธ์คํธ ์ด๋ฆ(๋ช ๋ น์ค ์ธ์๋ก ์ ๊ณต)์ IP๋ก ๋ณํํฉ๋๋ค
์ด๋ฆ๋ณ ์ ๋์ค gethost ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ฃผ์. ๋ค๋ฅธ ํ๋ซํผ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค
์ด ์์ค์ ์ ๊ณตํฉ๋๋ค.
- ์น์ 3์ ๋ก์ปฌ ์์ผ์ ์์ฑํ์ฌ ์๋ฒ์ ํฌํธ 443์ ๋ํ TCP ์ฐ๊ฒฐ์ ์ฝ๋๋ค
์๊ฒฉ ์ฃผ์ ์ ๋ณด๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์๊ฒฉ ์๋ฒ์ ์ฐ๊ฒฐํฉ๋๋ค.
- TCP ์ฐ๊ฒฐ์ด ์ค์ ๋๋ฉด SSL ๊ณ์ธต์ TCP ์ฐ๊ฒฐ์ ์ฐ๊ฒฐํฉ๋๋ค
SSL_new ๋ฐ SSL_set_fd๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ์์ SSL ํธ๋์ ฐ์ดํฌ๋ฅผ ์ํํฉ๋๋ค
SSL_connect. ์น์ 4๊ฐ ์๋ฃ๋๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ SSL ์ฑ๋์ด ์ค์ ๋ฉ๋๋ค
์ํธ๋ฅผ ์ ํํ๊ณ ์ธ์ฆ์๋ฅผ ๊ตํํ์ต๋๋ค.
- ์น์ 5๋ ์ ํํ ๋๋ ์ํธํ ์ํธ์ ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
- ์น์ 6์ ๋ค์์์ ๋ณด๋ธ X.509 ์ธ์ฆ์์ ํฌํจ๋ ์ผ๋ถ ์ ๋ณด๋ฅผ ์ถ๋ ฅํฉ๋๋ค
์ธ์ฆ์ ์์ ์ ๋ฐ ๋ฐ๊ธํ ์กฐ์ง์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ๋ ์๋ฒ
์ฆ์. OpenSSL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ํน๋ณํ ์์ ์ ์ํํ์ง ์์ต๋๋ค
์๋ฒ ์ธ์ฆ์. ์น ๋ธ๋ผ์ฐ์ ์ ๊ฐ์ ์ค์ SSL ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ ์ ์ด ์๋๋ค
์ธ์ฆ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ช ๋๊ณ ์ฌ๋ฐ๋ฅธ ํธ์คํธ์์ ์๋์ง ํ์ธํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ
14.7.6์์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ ์ธ์ฆ์๋ก ์ํํ๋ ์์ ์ ๋ํด ์ค๋ช ํ์ต๋๋ค.
- ์ด ์์ ์์ SSL ์ฐ๊ฒฐ์ ์ฌ์ฉํ์ฌ ์์ ํ ๋ฐ์ดํฐ ์ ์ก์ ์ํํ ์ ์์ต๋๋ค. ์น์ 7์์, ์ฐ๋ฆฌ๋
SSL_write๋ฅผ ์ฌ์ฉํ์ฌ SSL ์ฑ๋์ ํตํด ๋จ์ HTTP ์์ฒญ "GET / HTTP/1.0"์ ์ ์กํฉ๋๋ค,
๊ทธ๋ฐ ๋ค์ ์ฐ๊ฒฐ์ ์์๋ฐ์ด๋ ์ ๋ฐ์ ๋ซ์ต๋๋ค.
- ์น์ 8์์๋ SSL_read๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ์์ ์๋ต์ ๋ค์ ์ฝ๊ณ ์ธ์ํฉ๋๋ค
์คํฌ๋ฆฐ. SSL ๊ณ์ธต์ด ๋ชจ๋ ์ํธํ ๋ฐ ์ํธ ํด๋ ์ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค
์ผ๋ฐ HTTP ๋ช ๋ น์ ์ฐ๊ณ ์ฝ์ต๋๋ค.
- ๋ง์ง๋ง์ผ๋ก ์น์ 9์์ ์ฒญ์ํฉ๋๋ค.
ํ๋ก์๋ฅผ ํตํ ๋ณด์ ํธ๋ํฝ ํฐ๋๋ง
์ํธํ ์์ ์ ํ๋ก์ ์๋ฒ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฌธ์ ์
→ ๊ณต์ฉํค๋ก ์ํธํ๋ ํค๋ ๋ฐ์ดํฐ๋ฅผ ํ๋ก์๊ฐ ์ฝ์ ์ ์์.
HTTPS SSL ํฐ๋๋ง ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐ
- ํด๋ผ์ด์ธํธ๋ ๋จผ์ ํ๋ก์์ ์ฐ๊ฒฐํ๋ ค๋ ํธ์คํธ์ ํฌํธ๋ฅผ ์๋ ค์ค๋๋ค.
- ์ํธํ๊ฐ ์์๋๊ธฐ ์ ์ ํ๋ก์๊ฐ ์ด ์ ๋ณด๋ฅผ ์ฝ์ ์ ์๋๋ก ์ผ๋ฐ ํ ์คํธ๋ก ์ด ์์ ์ ์ํํฉ๋๋ค.
- HTTP๋ CONNECT๋ผ๋ ์๋ก์ด ํ์ฅ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ผ๋ฐ ํ ์คํธ end point ์ ๋ณด๋ฅผ ๋ณด๋ด๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- CONNECT ๋ ํ๋ก์์ ์ํ๋ ํธ์คํธ์ ํฌํธ ๋ฒํธ์ ๋ํ ์ฐ๊ฒฐ์ ์ด๊ณ ์ฐ๊ฒฐ์ด ์๋ฃ๋๋ฉด ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ํฐ๋๋งํ๋๋ก ์ง์ํฉ๋๋ค.
- CONNECT ๋ฉ์๋๋ ๋ณด์ ์ค๋ฆฌ์ง ์๋ฒ์ ํธ์คํธ ์ด๋ฆ๊ณผ ํฌํธ๋ฅผ ์ฝ๋ก (:)์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ ๊ณตํ๋ ํ ์ค ํ ์คํธ ๋ช ๋ น์ ๋๋ค
- host:port ๋ค์๋ ๊ณต๋ฐฑ๊ณผ HTTP ๋ฒ์ ์ด, CRLF ๋ค์๋ 0๊ฐ ์ด์์ HTTP ์์ฒญ ํค๋ ํ์ด, ๋น ํ์ด ์ฐจ๋ก๋ก ์ด์ด์ง๋๋ค. ๋น ์ค ์ดํ์ ์ฐ๊ฒฐ์ ์ค์ ํ๊ธฐ ์ํ ํธ๋์ ฐ์ดํฌ๊ฐ ์ฑ๊ณตํ๋ฉด SSL ๋ฐ์ดํฐ ์ ์ก์ ์์ํ ์ ์์ต๋๋ค.
- ํ๋ก์๋ ์์ฒญ์ด ์ ํจํ์ง, ์ฌ์ฉ์ ์ฐ๊ฒฐ ๊ถํ์ด ์๋์ง ํ์ธ ํ res 200 ๋ฐํ
- Total
- Today
- Yesterday
- swift ๋คํธ์ํฌ ๋ชจ๋ํ
- focus timer ์ดํ
- swift excel read
- swift network ๊ณตํตํ
- llm csv
- swift network module
- rag ๊ธฐ๋ฐ llm
- swift ์์ ์ฝ๊ธฐ
- swift urlsession module
- chatgpt rag llm
- rag llm pdf
- swift queryitem encode
- ์๋์ํํธ ๋ ์ด์ธ์ด
- llm pdf rag
- ๋ ๋์ธ์ด
- swift ์์ ๊ฐ์ ธ์ค๊ธฐ
- filemanager excel read
- swift urlsession ๊ณตํตํ
- swift urlsession network module
- swift get excel
- swift filemanager excel
- swift urlsession refactoring
- rag ๊ธฐ๋ฐ llm ์ฑ๋ด
- readysay
- ๋ ๋์ธ์ด ์ดํ
- ๊ณต๋ถ ํ์ด๋จธ ์ดํ
- swift ์๊ฐ
- swift network refactoring
- swift urlcomponent encode
- swift filemanager get excel
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |