bong-u/til

๐Ÿ  home ๐Ÿˆ repository ๐Ÿ“ก rss
new RAG ์ด๋ก  ์ •๋ฆฌ + OpenSearch
๐Ÿค– ์ธ๊ณต์ง€๋Šฅ
RAG (Retrieval-Augmented Generation) RAG๋Š” ๊ฒ€์ƒ‰๊ณผ ์ƒ์„ฑ์„ ๊ฒฐํ•ฉํ•œ ๋ชจ๋ธ๋กœ, ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์–ป์€ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋ธ LLM์˜ ๋ฌธ์ œ์  ํ• ๋ฃจ์‹œ๋„ค์ด์…˜: ์ƒ์„ฑ ๋ชจ๋ธ์ด ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์— ์—†๋Š” ๋‚ด์šฉ์„ ์ƒ์„ฑํ•˜๋Š” ํ˜„์ƒ ์ตœ์‹ ์˜ ์‘๋‹ต์„ ๊ธฐ๋Œ€ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ์ผ๋ฐ˜์ ์ธ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ถœ์ฒ˜๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ RAG๋Š” ์œ„์—์„œ ์„œ์ˆ ํ•œ LLM ๋ฌธ์ œ์˜ ์ผ๋ถ€๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์ด๋‹ค. OpenSearch OpenSearch๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์—”์ง„์œผ๋กœ, ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜์˜ ํฌํฌ ๋ฒ„์ „ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฃผ์š” ๊ธฐ๋Šฅ ๋ถ„์‚ฐ ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ๋ณด์•ˆ ์‹œ๊ฐํ™”์™€ ๋Œ€์‹œ๋ณด๋“œ ์ง€์› index์™€ document index : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค document : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ถ„์„๊ธฐ Analyzer (Character Filter + Tokenizer + Token Filter) ํ…์ŠคํŠธ๋ฅผ ํ† ํฐํ™”ํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ ๋ถ„์„ ๊ณผ์ • Character Filter ํŠน์ • ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ Tokenizer ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Token Filter ํ† ํฐ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ OpenSearch์—์„œ ์ง€์›ํ•˜๋Š” ์š”์†Œ Tokenizer Standard Tokenizer : ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ, ๋ฌธ์žฅ ๋ถ€ํ˜ธ ์‚ญ์ œ Letter Tokenizer : ๋ฌธ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Whitespace Tokenizer : ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Ngram Tokenizer : ๋ถ€๋ถ„ ๋ฌธ์ž์—ด๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Token Filter Standard Token Filter : ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Œ Lowercase Token Filter : ํ…์ŠคํŠธ๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ Synonym Token Filter : ๋™์˜์–ด ์ฒ˜๋ฆฌ Analyzer Standard Analyzer : Standard Tokenizer + Standard Token Filter Simple Analyzer : Letter Tokenizer + Lowercase Token Filter Whitespace Analyzer : Whitespace Tokenizer + Lowercase Token Filter OpenSearch ์ ‘๊ทผ์„ ์œ„ํ•œ cURL ๋ช…๋ น์–ด ์ธ๋ฑ์Šค ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/_cat/indices" ํŠน์ • ์ธ๋ฑ์Šค ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}" ์ „์ฒด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}/_search" ํŠน์ • ๊ฒ€์ƒ‰์–ด๋กœ ๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}/_search" \ 3-H "Content-Type: application/json" \ 4-d '{"query": {"match": {"field": "value"}}}' ์ธ๋ฑ์Šค ์‚ญ์ œ 1curl -X DELETE -u {username}:{password} \ 2"http://localhost:9200/{index_name}"
new OpenSearch๋ฅผ ํ™œ์šฉํ•œ RAG ์‹ค์Šต
๐Ÿค– ์ธ๊ณต์ง€๋Šฅ
๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„์—์„œ ํŒ€ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋‹ค. ์šฐ๋ฆฌ ํŒ€์˜ ์ฃผ์ œ๋Š” ํŠน์ • ์ธ๋ฌผ์—๊ฒŒ ์ƒ๋‹ด์„ ๋ฐ›๋Š” ๊ฒƒ ๊ฐ™์€ ๋Œ€ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฑ—๋ด‡์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํŠน์ • ์ธ๋ฌผ์ด ํ–ˆ๋˜ ๋ง์„ ๋ชจ์•„ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ RAG ๋ชจ๋ธ์— ์ ์šฉ์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ์ˆœ์„œ ์ผ๋ก  ๋จธ์Šคํฌ๊ฐ€ TED์—์„œ ํ•œ ์ธํ„ฐ๋ทฐ๋ฅผ ํ…์ŠคํŠธ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. OpenSearch ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„๋ฒ ๋”ฉํ•ด์„œ OpenSearch์— ์ €์žฅํ•œ๋‹ค. RAG ๋ชจ๋ธ์ด OpenSearch๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค. 1. ์ผ๋ก  ๋จธ์Šคํฌ ์ธํ„ฐ๋ทฐ ํ…์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ ํŠœ๋ธŒ์—์„œ “์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ"๋ฅผ ํ†ตํ•ด ์ธํ„ฐ๋ทฐ ์ž๋ง‰์„ ๊ฐ€์ ธ์˜จ๋‹ค. 122:03 2EM: ์ด ํฐ ํŠธ๋Ÿญ์„ ๋ชฐ๋ฉด์„œ ๋ง๋„ ์•ˆ๋˜๋Š” ์›€์ง์ž„์„ ๋ณด์˜€์ฃ . 3CA: ์•„์ฃผ ๋ฉ‹์ง€๋„ค์š”. ์ž, ๊ทธ๋Ÿผ ์ •๋ง ๊ต‰์žฅํ•œ ์‚ฌ์ง„์—์„œ 422:09 5์กฐ๊ธˆ์€ ๋œ ๊ต‰์žฅํ•œ ์‚ฌ์ง„์„ ๋ณด์ฃ . "์œ„๊ธฐ์˜ ์ฃผ๋ถ€๋“ค"์ธ๊ฐ€์—์„œ ๋‚˜์˜ค๋Š” ๊ท€์—ฌ์šด ์ง‘ ์‚ฌ์ง„์ธ๋ฐ์š”. 622:15 7์ด๊ฒŒ ๊ฐ‘์ž๊ธฐ ์™œ ๋‚˜์˜จ๊ฑฐ์ฃ ? 8... ์ผ๋ก  ๋จธ์Šคํฌ๊ฐ€ ํ•œ ๋ง๋งŒ ์†์ˆ˜ ์ •๋ฆฌํ•œ๋‹ค. 1๋„ค. ์ œ ์Šค์Šค๋กœ๋„ ๊ทธ ์งˆ๋ฌธ์„ ์ž์ฃผ ํ•˜๋Š” ํŽธ์ž…๋‹ˆ๋‹ค. 2์ €ํฌ๋Š” LA์˜ ์ง€ํ•˜์— ๊ตฌ๋ฉ์„ ๋‚ด๋ ค๊ณ  ํ•˜๋Š”๋ฐ์š”. ์ด๋Š” ๊ตํ†ต ์ฒด์ฆ์„ ์™„ํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•œ 33์ฐจ์› ๋„คํŠธ์›Œํฌ์˜ ํ„ฐ๋„์ด ๋  ์ˆ˜๋„ ์žˆ๋Š” ์‹œ๋ฐœ์ ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. 4๊ตํ†ต ์ฒด์ฆ์€ ์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ์˜ ์˜ํ˜ผ์„ ํƒˆํƒˆ ํ„ฐ๋Š” ๋ฌธ์ œ ์ค‘์˜ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. 5์„ธ๊ณ„ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์น˜๊ณ  ์žˆ์ฃ . ์ธ์ƒ์—์„œ ๋„ˆ๋ฌด๋„ ๋งŽ์€ ๋ถ€๋ถ„์„ ๊ฐ€์ ธ๊ฐ‘๋‹ˆ๋‹ค. 6... 2. OpenSearch ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ 1docker create -it -p 9200:9200 -p 9600:9600 -e OPENSEARCH_INITIAL_ADMIN_PASSWORD={password} -e "discovery.type=single-node" -v opensearch_vol:/usr/share/opensearch/data --name opensearch opensearchproject/opensearch ์„ค๋ช… -p 9200:9200 : OpenSearch HTTP ํฌํŠธ -p 9600:9600 : OpenSearch ๋ชจ๋‹ˆํ„ฐ๋ง ํฌํŠธ -e OPENSEARCH_INITIAL_ADMIN_PASSWORD={password} : ์ดˆ๊ธฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ • -e “discovery.type=single-node” : ๋‹จ์ผ ๋…ธ๋“œ๋กœ ์‹คํ–‰ -v opensearch_vol:/usr/share/opensearch/data : ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ SSL ์˜ค๋ฅ˜ ๋ฐœ์ƒ๊ณผ ํ•ด๊ฒฐ ํ•˜์ง€๋งŒ ์œ„ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค 12024-07-05 22:15:12 Caused by: io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: ... 22024-07-05 22:15:12 at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1314) ~[netty-handler-4.1.110.Final.jar:4.1.110.Final] 32024-07-05 22:15:12 at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1387) ~[netty-handler-4.1.110.Final.jar:4.1.110.Final] 42024-07-05 22:15:12 at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:530) ~[netty-codec-4.1.110.Final.jar:4.1.110.Final] 52024-07-05 22:15:12 at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:469) ~[netty-codec-4.1.110.Final.jar:4.1.110.Final] 62024-07-05 22:15:12 ... 16 more ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์ด ๊ธธ์ง€ ์•Š๊ณ , ํ•ด๋‹น ํฌํŠธ๋Š” ์™ธ๋ถ€์— ๋…ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ SSL์„ ๋„๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€๋‹ค. 1/usr/share/opensearch/config/opensearch.yml 2# ๋ณ€๊ฒฝ ์ „ 3plugins.security.ssl.http.enabled: true 4# ๋ณ€๊ฒฝ ํ›„ 5plugins.security.ssl.http.enabled: false 3. ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ž„๋ฒ ๋”ฉ ๋ฐ OpenSearch์— ์ €์žฅ RAG ์„ธ์…˜์„ ํ•ด์ฃผ์‹  ๋ฉ˜ํ† ๋‹˜์ด ์งœ์ค€ ์ฝ”๋“œ๋ฅผ ์ ๊ทน! ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€๋‹ค. OpenSearch ์ธ๋ฑ์Šค ์ƒ์„ฑ 1from opensearchpy import OpenSearch 2import torch 3from transformers import AutoTokenizer, AutoModel 4from langchain.text_splitter import RecursiveCharacterTextSplitter 5from langchain_community.document_loaders import TextLoader 6from langchain_community.vectorstores import OpenSearchVectorSearch 7 8INDEX_NAME = "elon_musk" 9FILE_NAME = "ted_elon_musk_script.txt" 10 11## OpenSearch ์—ฐ๊ฒฐ ์„ค์ • 12client = OpenSearch( 13 hosts=[{"host": "localhost", "port": 9200}], http_auth=("admin", {password}) 14) 15 16## ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ 17loader = TextLoader(file_path=FILE_NAME, encoding="utf-8") 18docs = loader.load() 19 20text_splitter = RecursiveCharacterTextSplitter( 21 chunk_size=100, 22 chunk_overlap=0, 23 separators=["\n"], 24 length_function=len, 25) 26 27documents = text_splitter.split_documents(docs) 28 29# print(documents) 30 31## Embedding ๋ชจ๋ธ ์ •์˜ 32class MyEmbeddingModel: 33 def __init__(self, model_name): 34 self.tokenizer = AutoTokenizer.from_pretrained(model_name) 35 self.model = AutoModel.from_pretrained(model_name) 36 37 def embed_documents(self, doc): 38 inputs = self.tokenizer( 39 doc, return_tensors="pt", padding=True, truncation=True, max_length=512 40 ) 41 42 with torch.no_grad(): 43 outputs = self.model(**inputs) 44 embeddings = outputs.last_hidden_state.mean(dim=1).tolist() 45 46 return embeddings 47 48 def embed_query(self, text): 49 inputs = self.tokenizer( 50 [text], padding=True, truncation=True, return_tensors="pt", max_length=512 51 ) 52 with torch.no_grad(): 53 outputs = self.model(**inputs) 54 embeddings = outputs.last_hidden_state.mean(dim=1).tolist() 55 return embeddings 56 57 58## index ๊ตฌ์กฐ ์ •์˜ 59index_body = { 60 "settings": { 61 "analysis": { 62 "tokenizer": { 63 "nori_user_dict": { 64 "type": "nori_tokenizer", 65 "decompound_mode": "mixed", 66 "user_dictionary": "user_dic.txt", 67 } 68 }, 69 "analyzer": { 70 "korean_anlyzer": { 71 "filter": [ 72 "synonym", "lowercase", 73 ], 74 "tokenizer": "nori_user_dict", 75 } 76 }, 77 "filter": { 78 "synonym" :{ 79 "type": "synonym_graph", 80 "synonyms_path" : "synonyms.txt" 81 } 82 } 83 } 84 } 85} 86 87## Embedding ๋ชจ๋ธ ์ƒ์„ฑ 88my_embedding = MyEmbeddingModel("monologg/kobert") 89 90## OpenSearch์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž… 91vector_db = OpenSearchVectorSearch.from_documents( 92 index_name=INDEX_NAME, 93 body=index_body, 94 documents=documents, 95 embedding=my_embedding, 96 op_type="create", 97 opensearch_url="http://localhost:9200", 98 http_auth=("admin", {password}), 99 use_ssl=False, 100 verify_certs=False, 101 ssl_assert_hostname=False, 102 ssl_show_warn=False, 103 bulk_size=1000000, 104 timeout=360000, 105) 106 107result = vector_db.add_documents(documents, bulk_size=1000000) tokenizer๋Š” ํ•œ๊ตญ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” “nori_tokenizer"๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. embedding ๋ชจ๋ธ์€ ์ €๊ฑฐ ๋ง๊ณ ๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ์–ด๋–ค ๋ชจ๋ธ์ด ํ”„๋กœ์ ํŠธ์— ๊ฐ€์žฅ ๋ถ€ํ•ฉํ•˜๋Š” ๋ชจ๋ธ์ธ์ง€๋Š” ์‹คํ—˜์„ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค. curl์„ ํ†ตํ•ด localhost:9200/elon_musk/_search๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด ์ž„๋ฒ ๋”ฉํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋“ค์–ด๊ฐ”๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 4. RAG ๋ชจ๋ธ์ด OpenSearch๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ ๋Œ€๋‹ต ์ƒ์„ฑ 1from langchain.prompts import PromptTemplate 2from langchain.chains import LLMChain 3from langchain_openai import ChatOpenAI 4from opensearchpy import OpenSearch 5import os 6 7INDEX_NAME = "elon_musk" 8 9# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • 10os.environ["OPENAI_API_KEY"] = {api_key} 11 12llm = ChatOpenAI( 13 model_name="gpt-3.5-turbo", 14) 15 16prompt_template = PromptTemplate( 17 input_variables=["context", "question"], 18 template=""" 19Imagine you are {character_name}, 20a wise and experienced advisor. Given the context: "{context}", 21how would you respond to this inquiry: "{question}"?', 22(in korean) 23""", 24) 25 26 27llm_chain = LLMChain(llm=llm, prompt=prompt_template) 28 29client = OpenSearch( 30 hosts=["http://localhost:9200"], 31 http_auth=("admin", {password}), 32 use_ssl=False, 33 verify_certs=False, 34 ssl_assert_hostname=False, 35 ssl_show_warn=False, 36) 37 38def search_documents(query): 39 search_body = {"query": {"match": {"text": query}}} 40 response = client.search(index=INDEX_NAME, body=search_body) 41 hits = response["`its"]["hits"] 42 return [hit["_source"]["text"] for hit in hits] 43 44if __name__ == "__main__": 45 question = input("Enter your question\n") 46 search_results = search_documents(question) 47 48 print(search_results) 49 50 # context = " ".join(search_results) 51 context = "" 52 53 response = llm_chain.invoke({"character_name": INDEX_NAME, "context": context, "question": question}) 54 55 print (response["text"]) OpenSearch์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ RAG ๋ชจ๋ธ์— ๋„ฃ์–ด ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค. search_documents ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด OpenSearch์— ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ context๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฒฐ๊ณผ ์งˆ๋ฌธ ํ…Œ์Šฌ๋ผ์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด? RAG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ๋Œ€๋‹ต ํ…Œ์Šฌ๋ผ๋Š” ํ˜์‹ ์ ์ธ ๊ธฐ์—…์œผ๋กœ์„œ ๋ฏธ๋ž˜๋ฅผ ํ–ฅํ•œ ๋น„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์ „๊ธฐ ์ž๋™์ฐจ ๊ธฐ์ˆ ๊ณผ ์—๋„ˆ์ง€ ์†”๋ฃจ์…˜์€ ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ์˜ ํ˜์‹ ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ์ง€์† ๊ฐ€๋Šฅํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ธ์ •์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. RAG๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ ์šฉ๋œ context [‘๊ธธ๊ฒŒ ๊ฐˆ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์•„์š”.\n๊ทธ๋Ÿฌ๋„ค์š”. ์ €๋Š” ์ตœ๋Œ€ํ•œ ์˜ค๋žซ๋™์•ˆ ํ…Œ์Šฌ๋ผ์— ๋จธ๋ฌผ ์ƒ๊ฐ์ด์—์š”.\n๊ทธ๋ฆฌ๊ณ  ์ค€๋น„ ์ค‘์— ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ์ผ๋„ ๋งŽ๊ณ ์š”. ์•„์‹œ๋‹ค์‹œํ”ผ, ๋ชจ๋ธ 3์ด ์ถœ์‹œ ์˜ˆ์ •์ด๊ณ ์š”.’, ‘์˜ฌํ•ด ๋ง๊นŒ์ง€ LA์—์„œ ๋‰ด์š•๊นŒ์ง€\n์™„์ „ ์ž์œจ ์ฃผํ–‰์œผ๋กœ ํšก๋‹จํ•˜๋Š” ๊ณ„ํš์— ๋งž์ถฐ์„œ ์ง„ํ–‰ ์ค‘์ด์—์š”.\n์‚ฌ๋žŒ์ด ํ…Œ์Šฌ๋ผ์— ํƒ€์„œ ์šด์ „๋Œ€๋ฅผ ์žก์ง€ ์•Š๊ณ  “๋‰ด์š•"์„ ์ฐ์œผ๋ฉด ๊ทธ๋ฆฌ๋กœ ๊ฐ„๋‹ค๋Š” ๋ง์ด๋„ค์š”.’, ‘๊ธธ๊ฒŒ ๊ฐˆ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์•„์š”.\n๊ทธ๋Ÿฌ๋„ค์š”. ์ €๋Š” ์ตœ๋Œ€ํ•œ ์˜ค๋žซ๋™์•ˆ ํ…Œ์Šฌ๋ผ์— ๋จธ๋ฌผ ์ƒ๊ฐ์ด์—์š”.\n๊ทธ๋ฆฌ๊ณ  ์ค€๋น„ ์ค‘์— ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ์ผ๋„ ๋งŽ๊ณ ์š”. ์•„์‹œ๋‹ค์‹œํ”ผ, ๋ชจ๋ธ 3์ด ์ถœ์‹œ ์˜ˆ์ •์ด๊ณ ์š”.’, ‘์˜ฌํ•ด ๋ง๊นŒ์ง€ LA์—์„œ ๋‰ด์š•๊นŒ์ง€\n์™„์ „ ์ž์œจ ์ฃผํ–‰์œผ๋กœ ํšก๋‹จํ•˜๋Š” ๊ณ„ํš์— ๋งž์ถฐ์„œ ์ง„ํ–‰ ์ค‘์ด์—์š”.\n์‚ฌ๋žŒ์ด ํ…Œ์Šฌ๋ผ์— ํƒ€์„œ ์šด์ „๋Œ€๋ฅผ ์žก์ง€ ์•Š๊ณ  “๋‰ด์š•"์„ ์ฐ์œผ๋ฉด ๊ทธ๋ฆฌ๋กœ ๊ฐ„๋‹ค๋Š” ๋ง์ด๋„ค์š”.’] RAG๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋Œ€๋‹ต ์ €๋Š” ํ…Œ์Šฌ๋ผ๋ฅผ ๋งค์šฐ ๊ธ์ •์ ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ๋Š” ํ˜์‹ ์ ์ธ ๊ธฐ์ˆ ๊ณผ ์ง€์† ๊ฐ€๋Šฅํ•œ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ๋น„์ „์„ ๊ฐ–์ถ˜ ๊ธฐ์—…์œผ๋กœ์„œ, ์ž์œจ ์ฃผํ–‰ ๊ธฐ์ˆ ์„ ํ†ตํ•ด ์šฐ๋ฆฌ์˜ ์‚ถ์„ ํ˜์‹ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ „๊ธฐ์ฐจ ์‹œ์žฅ์„ ์„ ๋„ํ•˜๊ณ  ํ™˜๊ฒฝ์— ์นœํ™”์ ์ธ ์ฐจ๋Ÿ‰์„ ์ œ๊ณตํ•˜๋Š” ๋ฉ‹์ง„ ๊ธฐ์—…์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ์˜ ๋ฏธ๋ž˜๊ฐ€ ๋ฐ๊ณ  ํฅ๋ฏธ๋กœ์šด ์ผ๋“ค์ด ๊ณ„์†ํ•ด์„œ ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ณ ์ฐฐ ํ™•์‹คํžˆ RAG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ๊ฐ๊ด€์ ์ด๊ณ  ์ผ๋ฐ˜์ ์ธ ๋Œ€๋‹ต์„ ํ•˜๋Š” ๋ฐ˜๋ฉด, RAG๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ…Œ์Šฌ๋ผ์— ๋Œ€ํ•ด ๊ธ์ •์ ์ธ ์ผ๋ก  ๋จธ์Šคํฌ์˜ ๋Œ€๋‹ต๊ณผ, ์ž์œจ์ฃผํ–‰ ๊ธฐ์ˆ ์„ ์–ธ๊ธ‰ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ˜์˜ํ•˜์—ฌ ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•˜์˜€๋‹ค.
new Nginx์—์„œ HTTPS ์„ค์ •ํ•˜๊ธฐ
๐Ÿ”จ ๊ฐœ๋ฐœ ๋„๊ตฌ
๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„๋ฅผ ์ง„ํ–‰์ค‘์ด๋‹ค. ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์€ docker-compose๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. AWS EC2์— ๊ตฌ๋™ ์ค‘์ธ ์„œ๋ฒ„์— HTTPS๋ฅผ ์ ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋„๋ฉ”์ธ ๊ตฌ๋งค ์—†์ด ์‹œ๋„๋ฅผ ํ–ˆ์œผ๋‚˜, AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ๋„๋ฉ”์ธ์œผ๋กœ SSL ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์—†์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋„๋ฉ”์ธ์„ ๊ตฌ๋งคํ•˜๊ณ , Route 53์„ ํ†ตํ•ด ๋„๋ฉ”์ธ์„ ์—ฐ๊ฒฐํ–ˆ๋‹ค. ๋ชฉํ‘œ Nginx๋ฅผ ์ด์šฉํ•˜์—ฌ HTTPS๋ฅผ ์ ์šฉํ•œ๋‹ค. ๋ฐฉ๋ฒ• 1. docker-compose.yml์— certbot ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. 1certbot: 2 image: certbot/certbot 3 container_name: certbot 4 volumes: 5 - ./certbot/conf:/etc/letsencrypt 6 - ./certbot/www:/var/www/certbot 7 depends_on: 8 - nginx 9 10 # certbot์„ ๋ฌดํ•œ๋ฃจํ”„๋กœ ๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ 11 entrypoint: "/bin/sh -c 'trap exit TERM; while :; do sleep 6h & wait $${!}; done;'" 2. nginx.conf๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. # certbot์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • location /.well-known/acme-challenge/ { allow all; root /var/www/certbot; } 3. certbot ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™œ์šฉํ•ด์„œ SSL ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค. 1docker exec -it certbot certbot certonly \ 2 # ์›น ๋ฃจํŠธ ๋ฐฉ์‹์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑ 3 --webroot \ 4 # ์›น ์„œ๋ฒ„์˜ ์›น ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์ง€์ • 5 --webroot-path=/var/www/certbot \ 6 # ์ธ์ฆ์„œ ๊ฐฑ์‹  ๋ฐ ์ค‘์š”ํ•œ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ง€์ • 7 --email {์ด๋ฉ”์ผ ์ฃผ์†Œ} \ 8 # Let's Encrypt ์„œ๋น„์Šค ์•ฝ๊ด€์— ๋™์˜ 9 --agree-tos \ 10 # EFF(Electronic Frontier Foundation) ๋‰ด์Šค๋ ˆํ„ฐ๋ฅผ ๋ฐ›์ง€ ์•Š๋„๋ก ์„ค์ • 11 --no-eff-email \ 12 # SSL ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•  ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์ง€์ • 13 -d {๋„๋ฉ”์ธ ์ด๋ฆ„} 4. Nginx ์›น ์„œ๋ฒ„์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  SSL ์„ค์ • ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋‹ค์šด ๋ฐ›์€ ํ›„ ํŒŒ์ผ์„ ์•Œ๋งž์€ ์œ„์น˜๋กœ ์ด๋™์‹œํ‚จ๋‹ค. ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” /etc/letsencrypt/๋กœ ์ด๋™์‹œ์ผฐ๋‹ค. 1sudo curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf > "./options-ssl-nginx.conf" 2 3sudo curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem > "./ssl-dhparams.pem" 5. nginx.conf๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค. ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. server { listen 80; charset utf-8; server_name {๋„๋ฉ”์ธ ์ด๋ฆ„}; # HTTP ์š”์ฒญ์„ HTTPS๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ location / { return 301 https://$host$request_uri; } } server { listen 443 ssl; charset utf-8; server_name { ๋„๋ฉ”์ธ ์ด๋ฆ„ }; # SSL ์ธ์ฆ์„œ ์„ค์ • ssl_certificate /etc/letsencrypt/live/api.forest-of-thoughts.site/fullchain.pem; # SSL ์ธ์ฆ์„œ ํ‚ค ์„ค์ • ssl_certificate_key /etc/letsencrypt/live/api.forest-of-thoughts.site/privkey.pem; # SSL ์„ค์ • ํŒŒ์ผ ํฌํ•จ include /etc/letsencrypt/options-ssl-nginx.conf; # Diffie-Hellman ํ‚ค ์„ค์ • ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; } 6. nginx ์ปจํ…Œ์ด๋„ˆ ์„ค์ •์„ ์ˆ˜์ •ํ•œ๋‹ค. 1nginx: 2 image: nginx:stable 3 ports: 4 - "80:80" 5 - "443:443" 6 volumes: 7 - ./nginx.conf:/etc/nginx/nginx.conf 8 - ./certbot/conf:/etc/letsencrypt 9 - ./certbot/www:/var/www/certbot ํ•ด ํšŒ๊ณ  ๋ณดํ†ต crontab์„ ํ™œ์šฉํ•ด์„œ ์ž๋™์œผ๋กœ ์ธ์ฆ์„œ ๊ฐฑ์‹ ์„ ๋ฐ›๋Š”๋‹ค. ์ด๋ฒˆ์—๋Š” ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์ด ๊ธธ์ง€ ์•Š์•„์„œ, ์ˆ˜๋™์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค. ๋‹ค์Œ์—๋Š” ์ž๋™์œผ๋กœ ์ธ์ฆ์„œ ๊ฐฑ์‹ ์„ ๋ฐ›๋Š” ๊ฒƒ๋„ ๋„์ „ํ•ด๋ณด์ž.
new ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด๊ฐœ๋ก 
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
Ocaml Functional Programming ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ•จ์ˆ˜๋ฅผ ๊ฐ’์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ํŠน์ง• Immutable ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค First-class function Higher-order function Referential transparency ๋™์ผํ•œ ์ธ์ž์— ๋Œ€ํ•ด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค Lazy evaluation (์ง€์—ฐ ๊ณ„์‚ฐ) ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ Primitive Types unit int float int_of_float : float->int float_of_int : int->float bool : true/false x = y : x equals y (structural equality) x <> y : x not equals y (structural equality) x == y : x equals y (physical equality) x != y : x not equals y (physical equality) char string ^ : string concatenation .[n] : n-th character .length : length of string .sub n m : substring from n to m Statement์™€ Expression Statement ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ์ „์ด(๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ–‰์œ„)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์–ธ์–ด์˜ ๊ตฌ์„ฑ ์š”์†Œ Expression ์‹คํ–‰ ์‹œ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐ์™ธ๋Š” ์–ธ์–ด์˜ ๊ตฌ์„ฑ์š”์†Œ Statement๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค Expression์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋Š” Expression๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค Tuple 1let x = (1, 2, 3) Function first-class object (1๊ธ‰ ๊ฐ์ฒด) ํ• ๋‹น์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™”๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ๋น„๊ต์—ฐ์‚ฐ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค Higher Order Function (๊ณ ์ฐจํ•จ์ˆ˜) ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์žฌ๊ท€ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ rec ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค Conditional branch 1if [expression1] then [expression2] else [expression3] Pattern Matching binding occurrence Ocaml ์ปดํŒŒ์ผ๋Ÿฌ๋Š” expression์˜ ํƒ€์ž…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒจํ„ด๋งค์นญ์˜ ์™„์ „์„ฑ์„ ๊ฒ€์‚ฌ Lists :: : ๋ฆฌ์ŠคํŠธ ์•ž์— ์›์†Œ๋ฅผ ์‚ฝ์ž… @ : ๋ฆฌ์ŠคํŠธ๋ฅผ ์—ฐ๊ฒฐ Type definition Disjoint union : ๊ตฌ๋ถ„๋˜๋Š” ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ๋ฌถ์€ ํƒ€์ž… Varient records๋ผ๊ณ ๋„ ๋ถ€๋ฆ„ type [type_name] = [constructor] (of [type])? (| [name] (of [type])?)* 1type number = 2 | Int of int 3 | Float of float Tail Call Optimization ์žฌ๊ท€ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ํ–‰์œ„์ผ ๋•Œ, ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ตœ์ ํ™” Syntax and Semantics Compilation ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” ํ–‰์œ„ ์ ํ•ฉํ•œ ํ”„๋กœ์ ํŠธ ํฐ ๊ทœ๋ชจ์˜ ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ : ๊ฒ€์ฆ์„ ํ†ตํ•ด ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ํƒ์ง€ ๊ณ ์„ฑ๋Šฅ ์†Œํ”„ํŠธ์›จ์–ด : ์ตœ์ ํ™”๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ ์ €์ˆ˜์ค€ ์†Œํ”„ํŠธ์›จ์–ด : ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ ๋‹จ์  ํ•™์Šต ๊ณก์„ ์ด ๋†’๋‹ค Compilation ๊ณผ์ •์ด ๋น„์‹ธ๊ณ  ๋ณต์žก Interpretation ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ํ•ด์„ํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ํ–‰์œ„ ์ ํ•ฉํ•œ ํ”„๋กœ์ ํŠธ ๋†’์€ ์–ธ์–ด์˜ ์ž์œ ๋„๋ฅผ ํ™œ์šฉํ•œ ์†Œํ”„ํŠธ์›จ์–ด prototyping : ๊ฒ€์ฆ ์ ˆ์ฐจ์˜ ๋ถ€์žฌ๋กœ ์ธํ•œ ๋‹ค์–‘ํ•œ ๋™์  ํŠน์„ฑ ์กด์žฌ ์‰ฝ๊ณ  ์ง๊ด€์ ์ธ ๊ตฌ์กฐ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต์œก : ๊ตฌ๋ฌธ ๊ตฌ์กฐ๊ฐ€ ๋‹จ์ˆœ ์‹คํ–‰ํ™˜๊ฒฝ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” cross-platform ์†Œํ”„ํŠธ์›จ์–ด : platform ๋ณ„๋กœ ๊ตฌํ˜„๋œ interpreter๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ๋‹จ์  ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์กด์žฌ ๊ฒ€์ฆ ์ ˆ์ฐจ์˜ ๋ถ€์žฌ๋กœ ์ธํ•œ ๊ฒฐํ•จ ํƒ์ง€ ๋ฐ ์ˆ˜์ •์˜ ์–ด๋ ค์›€ Syntax (๊ตฌ๋ฌธ ๊ตฌ์กฐ) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ “ํ˜•ํƒœ” ๊ตฌ๋ฌธ ๊ตฌ์กฐ์˜ ์ข…๋ฅ˜ Concrete syntax : ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๊ตฌ๋ฌธ์„ ํ…์ŠคํŠธ๋กœ ํ‘œํ˜„ Abstract syntax : Concrete syntax๋ฅผ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ Semantics (์˜๋ฏธ) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๊ตฌ๋ฌธ์˜ “์‹คํ–‰๋™์ž‘” Unspecified Behaviors ํŠน์ •์กฐ๊ฑด์—์„œ ๊ตฌ๋ฌธ์˜ ์ •์˜ํ•˜์ง€ ์•Š์€ ๋™์ž‘ Undefined Behaviors ํŠน์ •์กฐ๊ฑด์—์„œ ๊ตฌ๋ฌธ์˜ ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘ Programming Language Syntax and Parsing ์–ธ์–ด : L(G) The Chomsky Hierarchy Regular Language : Finite-State Automation Context-Free Language : Pushdown Automation Context-Sensitive Language : Linear-Bounded Automation Recursively Enumerable Language : Turing Machine AST (Abstract Syntax Tree) ํ”„๋กœ๊ทธ๋žจ์˜ ์ถ”์ƒ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํŠธ๋ฆฌํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ CFG (Context-Free Grammar) ๋ฌธ๋งฅ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ํ•ญ์ƒ ๋™์ผํ•œ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฌธ๋ฒ• G = ($\sum$, N, P, S) $\sum$ : terminal์˜ ์œ ํ•œ์ง‘ํ•ฉ N : non-terminal ์œ ํ•œ์ง‘ํ•ฉ P : production์˜ ์ง‘ํ•ฉ S : ์‹œ์ž‘ nonterminal BNF (Backus-Naur Form) CFG์˜ ํ‘œํ˜„ ๋ฐฉ๋ฒ• ์˜ˆ์‹œ 1S ::= aAc 2A ::= aA 3| b 4| ๐œ– Derivation ๋ฌธ๋ฒ•์˜ ๊ทœ์น™์„ ์ ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ • Leftmost derivation Rightmost derivatio Parse Derivation์˜ ์—ญ๊ณผ์ • Source code –lexing–> Token –parsing–> AST leftmost derivation rightmost derivation ambiguous grammer leftmost derivation๊ณผ rightmost derivation์ด ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฌธ๋ฒ• AE (Arithmetic Expression) Language Syntax ์ •์˜ Concrete syntax (syntax ํ˜•ํƒœ) Abstract syntax (tree ํ˜•ํƒœ) Semantics ์ •์˜ eโ‡“n : e๋Š” n์œผ๋กœ ๊ณ„์‚ฐ๋จ Inference rule (์ถ”๋ก  ๊ทœ์น™) ์ „์ œ๋กœ๋ถ€ํ„ฐ ๊ฒฐ๋ก ์„ ์ด๋Œ์–ด๋‚ด๋Š” ๊ทœ์น™ $$\frac{H_1 H_2 H_3 … H_n}{P}$$ $H_1, H_2, H_3, …, H_n$ : ์ „์ œ P : ๊ฒฐ๋ก  ์ „์ œ๊ฐ€ ๋ชจ๋‘ ์ฐธ์ด๋ฉด ๊ฒฐ๋ก ๋„ ์ฐธ Bigstep operational semantics Big-step : ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณ„์‚ฐ์ด ํ•˜๋‚˜์˜ ํฐ ๋‹จ๊ณ„์— ์˜ํ•ด ์ˆ˜ํ–‰ Small-step : ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณ„์‚ฐ์ด ํ•œ ์Šคํ… ๊ณ„์‚ฐ๋“ค์˜ ์—ฐ์†์— ์˜ํ•ด ์ˆ˜ํ–‰ Operational : ํ”„๋กœ๊ทธ๋žจ์˜ ๊ณ„์‚ฐ์„ ๊ฐ€์ƒ ๊ธฐ๊ณ„์˜ ๋™์ž‘(๊ณ„์‚ฐ)์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๊ธฐ์ˆ  Proof tree Inference rule์„ ์ด์šฉํ•˜์—ฌ ๊ฒฐ๋ก ์„ ์ฆ๋ช…ํ•˜๋Š” ๊ณผ์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” treeํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ Syntactic Sugar and Identifier Syntactic Sugar ์‚ฌ์šฉ์ž ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” ๊ตฌ๋ฌธ ์ฃผ๋กœ concrete syntax์˜ ํ™•์žฅ์„ ํ†ตํ•ด ์ œ๊ณต Desugaring ~(e) => 0 - e Sugaring 0 - e => ~(e) Identifier ํ”„๋กœ๊ทธ๋žจ์˜ ์–ด๋–ค ์š”์†Œ์™€ ์—ฐ๊ด€๋œ ์ด๋ฆ„ Identifier ๋“ฑ์žฅ binding occurence : ์ •์˜๋ฅผ ์œ„ํ•ด ๋“ฑ์žฅ bound ocurrence : ์‚ฌ์šฉ์„ ์œ„ํ•ด ๋“ฑ์žฅ free identifier : ์œ„ ๋‘๊ฐ€์ง€์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๋“ฑ์žฅ (์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ์ ‘๊ทผ) Identifier Scope Identifier๋Š” scope(๋ฒ”์œ„)๋‚ด์—์„œ binding-bound ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝ Scope : binding ocurrence identifier๊ฐ€ bound ๋  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„ Scope๋ฅผ ๋ฒ—์–ด๋‚œ ์ ‘๊ทผ : free identifier Shadowing : ๋™์ผํ•œ ์ด๋ฆ„์˜ identifier๊ฐ€ ์ค‘์ฒฉ๋œ scope์—์„œ binding๋˜๋Š” ๊ฒฝ์šฐ, ๋ฐ”๊นฅ์ชฝ scope์˜ identifier๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ Abstract Memory $\sigma$(x) : ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ $\sigma$์—์„œ x์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ $\sigma$[xโ†ฆn](x’) : ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ $\sigma$์—์„œ x๋ฅผ n์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ ํ›„ ์ƒˆ๋กœ์šด ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ โ†ฆ (mapsto) : ์™ผ์ชฝ ๊ฐ’์„ ์˜ค๋ฅธ์ชฝ ๊ฐ’์„ ๋งคํ•‘ํ•œ๋‹ค First Order Function (F1VAE) F1VAE VAE์— first-order function์„ ์ถ”๊ฐ€ํ•œ ์–ธ์–ด First-order function ๋ณ€์ˆ˜์™€ ๋‹ค๋ฅด๊ฒŒ ํŠน๋ณ„ ์ทจ๊ธ‰ํ•˜๋Š” ํ•จ์ˆ˜ Higher-order function ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ Concrete syntax 1// single function 2prog ::= decl expr 3// multiple functions 4prog ::= decl_list expr 5decl_list ::= decl decl_list | decl 6// single parameter 7decl ::= def var var = expr endef 8// multiple parameters 9decl ::= def var var_list = expr endef | def var = expr endef 10var_list ::= var var_list | var 11expr_list ::= expr, expr_list | expr 12 13// ๊ณตํ†ต 14expr ::= let var = expr in expr 15 | var(expr) 16 | expr + expr 17 | expr - expr 18 | (expr) 19 | number 20 | ~ (expr) 21 | var Abstract syntax ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ณด์กฐํ•จ์ˆ˜ ฮ›(x) : ํ•จ์ˆ˜ ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ ฮ›์—์„œ ํ•จ์ˆ˜์ด๋ฆ„ x์˜ ๊ฐ’์„ ์ฐพ์•„ ๋ฐ˜ํ™˜ ฮ›[x1 โ†ฆโ†’ (x2, e)] : ํ•จ์ˆ˜ ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ ฮ›์— ํ•จ์ˆ˜์ด๋ฆ„ x1์˜ ๊ฐ’์„ (x2, e)๋กœ ์—…๋ฐ์ดํŠธํ•œ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์ถ”์ƒ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ Multiple parameters $$ p ::= \overline{d}\ e \ d ::= def\ x\ \overline{x} = e \ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ x(\overline{e}) \ n \in Z\ x \in Var $$ Semantics e[n/x] ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ, ํ•จ์ˆ˜ ๋ชธ์ฒด์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌ๋œ ์ด์ž๋กœ ์น˜ํ™˜ํ•œ ํ›„ ๊ณ„์‚ฐ Lexical scope vs dynamic scope Lexical scope : identifier์˜ scope๊ฐ€ ์ปดํŒŒ์ผ์‹œ์ ์— ์ €์˜ Dynamic scope : identifier์˜ scope๊ฐ€ ์‹คํ–‰์‹œ์ ์— ๊ฒฐ์ • First Class Function (FVAE) First-class function ํ•จ์ˆ˜๋ฅผ ๊ฐ’์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํŠน์„ฑ Concrete syntax 1expr ::= let var = expr in expr 2 | (fun var -> expr) // ์ถ”๊ฐ€๋œ ๊ฒƒ : ํ•จ์ˆ˜ ์ •์˜ 3 | expr expr // ์ถ”๊ฐ€๋œ ๊ฒƒ : ํ•จ์ˆ˜ ํ˜ธ์ถœ 4 | expr + expr 5 | expr - expr 6 | (expr) 7 | number 8 | ~ (expr) 9 | var function applications ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋Œ€์‹  ํ•จ์ˆ˜ ์ ์šฉ Abstract syntax $\lambda x.e$ $$ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ \lambda x.e\ |\ e\ e \ n \in Z\ x \in Var $$ $\lambda x.e$ : ํ•จ์ˆ˜ ์ •์˜ (x๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ, e๋Š” ํ•จ์ˆ˜ ๋ชธ์ฒด) x๋Š” binding occurence x์˜ scope๋Š” e $e\ e$ : ํ•จ์ˆ˜ ์ ์šฉ e1 : ํ•จ์ˆ˜๋กœ ๊ณ„์‚ฐ๋˜๋Š” expression e2 : ์ธ์ž Closure Closure = Var X Expr X Store FVAE์—์„œ๋Š” ํ•จ์ˆ˜๋„ “๊ฐ’"์ด๋ฏ€๋กœ “๊ฐ’"์˜ ํ™•์žฅ์ด ์š”๊ตฌ๋œ๋‹ค Multiple parameters Concrete syntax 1expr ::= let var = expr in expr 2 | let var var = expr in expr 3 | (fun var_list -> expr) // ์ถ”๊ฐ€๋œ ๊ฒƒ : ํ•จ์ˆ˜ ์ •์˜ 4 | expr expr 5 | expr + expr 6 | expr - expr 7 | (expr) 8 | number 9 | ~ (expr) 10 | var 11var_list ::= var var_list | var // ์ถ”๊ฐ€๋œ ๊ฒƒ : ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฆฌ์ŠคํŠธ Conditional Branch (CFVAE) Concrete syntax 1expr ::= let var = expr in expr 2 | (fun var_list -> expr) 3 | if expr then expr else expr // ์ถ”๊ฐ€๋œ ๊ฒƒ : ์กฐ๊ฑด๋ฌธ 4 | expr expr 5 | expr + expr 6 | expr - expr 7 | expr < expr // ์ถ”๊ฐ€๋œ ๊ฒƒ : ๋น„๊ต์—ฐ์‚ฐ 8 | (expr) 9 | number 10 | bool 11 | ~ (expr) 12 | var if-then-else๊ฐ€ ๋‹ค๋ฅธ expression์— ๋น„ํ•ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ๋‹ค๊ณ  ๊ฐ€์ • Abstract syntax $$ e ::= n\ |\ b\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ \lambda x.e\ |\ e\ e\ |\ e?e\ : e\ |\ e\ <\ e \ n \in Z\ b \in {true, false } x \in Var $$ Boolean support as syntatics sugar true์™€ false๋ฅผ ์ •์ˆ˜๋กœ ํ‘œํ˜„ true์™€ false๋ฅผ closure๋กœ ํ‘œํ˜„ Option 1. C style $$ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ \lambda x.e\ |\ e\ e\ |\ e\ ?\ e\ :\ e\ |\ e\ <\ e\ n \in Z\ x \in Var $$ Option 2. Church boolean $$ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ \lambda x.e\ |\ e\ e\ |\ e\ <\ e\ n \in Z\ b \in {true, false }\ x \in Var $$ Recursion (RCFVAE) Concrete syntax 1expr ::= let var = expr in expr 2 | let rec var = expr in expr // ์ถ”๊ฐ€๋œ ๊ฒƒ : ์žฌ๊ท€ํ•จ์ˆ˜ 3 | (fun var -> expr) 4 | if expr then expr else expr 5 | expr expr 6 | expr + expr 7 | expr - expr 8 | expr < expr 9 | (expr) 10 | number 11 | bool 12 | ~ (expr) 13 | var Abstract syntax $$ e ::= n\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ let\ x\ =\ e\ in\ e\ |\ let\ rec\ x\ =\ e\ in\ e |\ \lambda x.e\ |\ e\ e\ |\ e\ <\ e \ n \in Z\ x \in Var $$ minic 1 Imperative language (๋ช…๋ นํ˜• ์–ธ์–ด) ์—ฐ์†๋œ command(๋ช…๋ น)์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์˜ ์˜๋ฏธ๋ฅผ ์ˆ˜ํ–‰ Concrete syntax 1prog ::= stmts 2stmts ::= stmt | stmt stmts 3stmt ::= var = expr; 4 | if expr {stmts} 5 | if expr {stmts} else {stmts} 6expr ::= number 7 | var 8 | true 9 | false 10 | (expr) 11 | expr + expr 12 | expr - expr 13 | expr < expr 14 | expr > expr 15 | expr == expr 16 | expr && expr 17 | expr || expr Abstract syntax $$ p ::= \overline{s} \ s ::= x = e\ |\ e?\ \overline{s} : \overline{s} \ e ::= n\ |\ x\ |\ b\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ e\ <\ e\ |\ e\ >\ e\ |\ e\ ==\ e\ |\ e\ &&\ e\ |\ e\ ||\ e \ n \in Z\ b \in {true, false}\ x \in Var $$ Semantics p : MiniC program Prog -> Store s : MiniC statement Store X Stmt -> Store e : MiniC expression Store X Expr -> Value Short circuit evaluation ๋…ผ๋ฆฌ์‹ ์—ฐ์‚ฐ์— ์žˆ์–ด ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ•ด์ง„ ๊ฒฝ์šฐ ๋‚จ์€ expression ๊ณ„์‚ฐ minic 2 &x: reference *e: dereference Concrete syntax 1prog ::= stmts 2stmts ::= stmt | stmt stmts 3stmt ::= def var; 4 | var = expr; 5 | *expr = expr; 6 | if expr {stmts} 7 | if expr {stmts} else {stmts} 8 | while expr {stmts} 9expr ::= number 10 | var 11 | true 12 | false 13 | &var 14 | *expr 15 | (expr) 16 | expr + expr 17 | expr - expr 18 | expr < expr 19 | expr > expr 20 | expr == expr 21 | expr && expr 22 | expr || expr Abstract syntax $$ p ::= \overline{s} \ s ::= def\ x\ |\ x = e\ |\ *e = e\ |\ e?\ \overline{s} : \overline{s}\ |\ while\ e\ \overline{s} \ e ::= n\ |\ x\ |\ b\ |\ x\ |\ e\ +\ e\ |\ e\ -\ e\ |\ e\ <\ e\ |\ e\ >\ e\ |\ e\ ==\ e\ |\ e\ &&\ e\ |\ e\ ||\ e\ |\ &x\ |\ *e \ b \in {true, false}\ n \in Z\ x \in Var $$ Semantics
new ์ปดํŒŒ์ผ๋Ÿฌ๊ฐœ๋ก 
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๊ฐœ์š” ์ปดํ“จํ„ฐ์™€ ์ธ๊ฐ„์ด ์†Œํ†ตํ•˜๋Š” ๋ฐฉ๋ฒ• ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ์–ด์…ˆ๋ธ”๋ฆฌ์–ด์˜ ๋ฒˆ์—ญ๊ธฐ๋Š” ์–ด์…ˆ๋ธ”๋Ÿฌ(Assembler)๋ผ๊ณ  ํ•œ๋‹ค cpu์นฉ์…‹์ด ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๊ฐ€ ๋ฐ”๋€๋‹ค ๊ณ ๊ธ‰์–ธ์–ด ๊ณ ๊ธ‰์–ธ์–ด์˜ ๋ฒˆ์—ญ๊ธฐ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ(Compiler)๋ผ๊ณ  ํ•œ๋‹ค ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ •ํ™•ํ•œ ์ •์˜ ์–ด๋–ค ์–ธ์–ด๋กœ ์“ฐ์—ฌ์ง„ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ™์€ ์—ญํ• ์˜ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ 1952๋…„ ๊ทธ๋ ˆ์ด์Šค ํ˜ธํผ(Grace Hopper)๊ฐ€ UNIVAC์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด A-0 ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ œ์ž‘ ์ปดํŒŒ์ผ๋Ÿฌ vs ์ธํ„ฐํ”„๋ฆฌํ„ฐ ํ”„๋กœ๊ทธ๋žจ ์ฒ˜๋ฆฌ๊ณผ์ • ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ฒ˜๋ฆฌ ๊ณผ์ • Lexical analysis (์–ดํœ˜ ๋ถ„์„) token์„ ์ƒ์„ฑํ•˜๋Š”์ผ, token์€ ์–ดํœ˜์˜ ์ตœ์†Œ ๋‹จ์œ„ Syntax analysis (๊ตฌ๋ฌธ ๋ถ„์„) token์„ ์ฝ์–ด์„œ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ƒ‰, ๊ตฌ๋ฌธ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ ๋‹ค (์ฃผ๋กœ ํŠธ๋ฆฌํ˜•ํƒœ) Semantic analysis (์˜๋ฏธ ๋ถ„์„) type checking Intermediate code generation (์ค‘๊ฐ„ ์ฝ”๋“œ ์ƒ์„ฑ) ์ค‘๊ฐ„ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ Code optimization (์ฝ”๋“œ ์ตœ์ ํ™”) ์ค‘๊ฐ„ ์ฝ”๋“œ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๋ณ€ํ™˜ Code generation (์ฝ”๋“œ ์ƒ์„ฑ) ๋ชฉ์  ์ฝ”๋“œ ์ƒ์„ฑ Lexical analysis (์–ดํœ˜ ๋ถ„์„) token : ๋ฌธ๋ฒ•์ ์œผ๋กœ ์˜๋ฏธ์žˆ๋Š” ์ตœ์†Œ ๋‹จ์œ„ FSA (Finite State Automata, ์œ ํ•œ ์ƒํƒœ ์˜คํ† ๋งˆํƒ€) token์„ ์ธ์‹ํ•˜๋Š” ๋ฐฉ๋ฒ• ์‹œ์ž‘ ์ƒํƒœ ํ•œ ๊ฐœ์™€ ๋ ์ƒํƒœ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๊ฐ€์ง DFA (Deterministic Finite Automata) FSA์˜ ํ•œ ์ข…๋ฅ˜ ๊ฐ ์ƒํƒœ์—์„œ ๋ป—์–ด๋‚˜๊ฐ€๋Š” edge๊ฐ€ ํ•˜๋‚˜์”ฉ๋งŒ ์กด์žฌ ฮต๊ฐ€ ๋ถ™์€ edge ์—†์Œ ๋ถ„์„ํ•œ ํ† ํฐ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• Lexeme = <ํ† ํฐ๋ฒˆํ˜ธ, ํ† ํฐ ๊ฐ’> ์˜ˆ์‹œ if X < Y … (29, 0) (1, X) (18, 0) (1, Y) … ์‹๋ณ„์ž์˜ ํ† ํฐ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ, ์ƒ์ˆ˜๋Š” 2๋ฒˆ ๋“ฑ์œผ๋กœ ๊ณ ์ • Syntax analysis (๊ตฌ๋ฌธ ๋ถ„์„) token์„ ์ฝ์–ด์„œ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์ƒ‰, parse tree๋ฅผ ๋งŒ๋“ ๋‹ค CFG (Context Free Grammer) ๊ตฌ๋ฌธ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• G = (N, T, P, S) N = nonterminal symbol ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ ํ‘œํ˜„ T = terminal symbol (token) ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž+์ˆซ์ž, ์—ฐ์‚ฐ์ž, ๊ตฌ๋ถ„์ž, ํ‚ค์›Œ๋“œ ๋“ฑ P = production rule ์˜ˆ) S -> T+T, T -> ‘0’|‘1’|‘2’ S = start symbol L(G) : ์ด ๋ฌธ๋ฒ•์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์–ธ์–ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ CFG ํ‘œํ˜„๋ฒ• BNF (Backus-Naur Form) EBNF (Extended BNF) ์œ ๋„ (derivation) ์ƒ์„ฑ ๊ทœ์น™๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฌธ์žฅ์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ • ์œ ๋„๋ฅผ ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ•˜๋‚˜์”ฉ ๊ณจ๋ผ์„œ ๋ฐ”๊ฟˆ ์œ ๋„ ํŠธ๋ฆฌ : ์œ ๋„ ๊ฒฝ๋กœ๋ฅผ ์ถ”์ƒํ™” ์‹œ์ผœ ํ‘œํ˜„ํ•œ ๊ฒƒ ์ขŒ์ธก ์œ ๋„(leftmost derivation) ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” nonterminal์„ ๋จผ์ € ๋Œ€์น˜ ์šฐ์ธก ์œ ๋„(rightmost derivation) ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” nonterminal์„ ๋จผ์ € ๋Œ€์น˜ ๋ชจํ˜ธ์„ฑ (ambiguity) ๋ฌธ๋ฒ• G์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” ์–ด๋–ค ๋ฌธ์žฅ์ด ๋‘๊ฐœ ์ด์ƒ์˜ ์œ ๋„ํŠธ๋ฆฌ๋ฅผ ๊ฐ–๋Š”๋‹ค๋ฉด ๋ฌธ๋ฒ• G๋Š” ๋ชจํ˜ธํ•˜๋‹ค๊ณ  ํ•œ๋‹ค ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ๋ฌธ๋ฒ•์€ ์ขŒ์ธก ์œ ๋„์™€ ์šฐ์ธก ์œ ๋„๊ฐ€ ๊ฐ™๋‹ค ๋ชจํ˜ธ์„ฑ ํ•ด๊ฒฐ ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ ๋„์ž… ๊ฒฐํ•ฉ ๋ฒ•์น™ ๋„์ž… Left Recursion์€ ์ขŒ์ธก ๊ฒฐํ•ฉ์— ์‚ฌ์šฉ ex) A -> A+a | a Right Recursion์€ ์šฐ์ธก ๊ฒฐํ•ฉ์— ์‚ฌ์šฉ ex) A -> a+A | a ๊ตฌ๋ฌธ ๋ถ„์„์˜ 2๊ฐ€์ง€ ๋ฐฉ์‹ top-down, bottom-up Top-down parsing Top-down ๋ฐฉ์‹ ์ขŒ์ธก ์œ ๋„์™€ ๊ฐ™์€ ์ˆœ์„ ์˜ ์ƒ์„ฑ ๊ทœ์น™ ์ ์šฉ backtracking : ์œ ๋„๋œ ๋ฌธ์ž์—ด๊ณผ ์ž…๋ ฅ ๋ฌธ์ž์—ด์ด ๊ฐ™์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ์ƒ์„ฑ๊ทœ์น™ ์ ์šฉ Bottom-up ๋ฐฉ์‹ ์šฐ์ธก ์œ ๋„์˜ ์—ญ์ˆœ์˜ ์ƒ์„ฑ ๊ทœ์น™ ์ ์šฉ LL ํŒŒ์‹ฑ ์™ผ์ชฝ->์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ฝ์–ด์„œ ์ขŒํŒŒ์Šค ์ƒ์„ฑ backtracking X, ๋น ๋ฅด๋‹ค ๊ฒฐ์ •์ ์œผ๋กœ ํŒŒ์‹ฑ ์‚ฌ์šฉ๋œ ์ •์˜ ฮต-์ƒ์„ฑ๊ทœ์น™ Nonterminal A๊ฐ€ ฮต๋ฅผ ์œ ๋„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด A๋ฅผ nullableํ•˜๋‹ค๊ณ  ๋ถ€๋ฅธ๋‹ค lhs, rhs A->XXX์—์„œ lhs๋Š” A, rhs๋Š” XXX โŠ• (Ring Sum) A์— ฮต๊ฐ€ ์žˆ์œผ๋ฉด, AโŠ•B = (A์—์„œ ฮต๋นผ๊ณ  A ํ•ฉ์ง‘ํ•ฉ B) A์— ฮต๊ฐ€ ์—†์œผ๋ฉด, AโŠ•B = A First nonterminal A๋กœ ๋ถ€ํ„ฐ ์œ ๋„๋˜์–ด ์ฒซ๋ฒˆ์งธ๋กœ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋Š” terminal์˜ ์ง‘ํ•ฉ X->Y1Y2Y3์ผ๋•Œ, FIRST(X) = FIRST(X) U FIRST(Y1) โŠ• FIRST(Y2) โŠ• FIRST(Y3) Follow A ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” terminal์˜ ์ง‘ํ•ฉ A->ฮฑBฮฒ, ฮฒ != ฮต ์ผ๋•Œ, FOLLOW(B) = FOLLOW(B) U (FIRST(ฮฒ)-{ฮต}) A->ฮฑB ๋˜๋Š” A->ฮฑBฮฒ, FIRST(ฮฒ)์— ฮต๊ฐ€ ์†ํ•  ๋•Œ, FOLLOW(B) = FOLLOW(B) U FOLLOW(A) LL์กฐ๊ฑด FIRST(ฮฑ)์™€ FIRST(ฮฒ)๊ฐ€ ๊ฒน์น˜๋ฉด ์•ˆ๋œ๋‹ค FIRST(ฮฑ)์— ฮต๊ฐ€ ์žˆ์œผ๋ฉด, FOLLOW(ฮฑ)์™€ FIRST(ฮฒ)๊ฐ€ ๊ฒน์น˜๋ฉด ์•ˆ๋œ๋‹ค LL ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฌธ๋ฒ• = LL ํŒŒ์‹ฑ ๋˜๋Š” ๋ฌธ๋ฒ• LL(1) ๋ฌธ๋ฒ• ์ž„์˜์˜ ๋ฌธ๋ฒ•์— ๋Œ€ํ•˜์—ฌ LL ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” CFG 1 : LOOKAHEAD๊ฐ€ 1๊ฐœ๋ผ๋Š” ์˜๋ฏธ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ LL(1)๋ฌธ๋ฒ•์ด ๋˜์ง€ ์•Š๋Š”๋‹ค ๋ชจํ˜ธํ•œ ๋ฌธ๋ฒ• ์šฐ์„ ์ˆœ์œ„ ์ฃผ๊ธฐ, ๊ฒฐํ•ฉ๋ฒ•์น™ ๋ฐ˜์˜์œผ๋กœ ํ•ด๊ฒฐ left-factoring์ด ๋˜๋Š” ๊ฒฝ์šฐ ๊ณตํ†ต ์•ž๋ถ€๋ถ„์„ ์ƒˆ๋กœ์šด nonterminal๋กœ ๋งŒ๋“ค์–ด ํ•ด๊ฒฐ left-recursiveํ•œ ๊ฒฝ์šฐ ์ง์ ‘ recursion : A -> Aฮต ์ธ๊ฒฝ์šฐ ๊ฐ„์ ‘ recursion : A -> B, B -> A ์ธ๊ฒฝ์šฐ LOOKAHEAD ์–ด๋–ค ๊ทœ์น™์ด ์ ์šฉ๋˜์—ˆ์„๋•Œ ๋งจ ์ฒ˜์Œ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” terminal ์ง‘ํ•ฉ A->X1X2X3์ผ๋•Œ, LOOKAHEAD(A) = FIRST(X1) โŠ• FIRST(X2) … โŠ• FOLLOW(A) Strong LL(1) LL(1)๊ณผ ํ•ญ์ƒ ๋™์ผ (1์ด ์•„๋‹๋•Œ๋Š” ๋‹ค๋ฆ„) LOOKAHEAD(A->ฮฑ)์™€ LOOKAHEAD(A->ฮฒ)๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋Š” ๋ฌธ๋ฒ• LL(1) ํŒŒ์„œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• Recursive descent parser ์žฅ์  : ์ง๊ด€์  ์‰ฝ๋‹ค ๋‹จ์  : ์ƒ์„ฑ ๊ทœ์น™์ด ๋ฐ”๋€Œ๋ฉด ๊ตฌ๋ฌธ ๋ถ„์„๊ธฐ๋ฅผ ๊ณ ์ณ์•ผ ํ•œ๋‹ค Predictive parser PDA(PushDown Automata)์— ๊ธฐ๋ฐ˜ ์ƒ์„ฑ ๊ทœ์น™์ด ๋ฐ”๋€Œ๋ฉด ํŒŒ์‹ฑ ํ…Œ์ด๋ธ”๋งŒ ์ˆ˜์ • ํŒŒ์‹ฑํ…Œ์ด๋ธ” ์˜ˆ์‹œ (?์—๋Š” ๊ทœ์น™๋ฒˆํ˜ธ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค) a b S ? ? A ? ? ํŒŒ์‹ฑํ…Œ์ด๋ธ”์— ๋‘๊ฐœ ์ด์ƒ์˜ ์ƒ์„ฑ ๊ทœ์น™์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ -> NOT LL(1) Stack์˜ ์˜ˆ์‹œ Bottom-up parsing left-recursive ๋ฌธ๋ฒ•๋„ ํŒŒ์‹ฑ ๊ฐ€๋Šฅ LL(k) ์ขŒ์ธก์œ ๋„ ๊ธฐ๋ฐ˜ k๊ฐœ์˜ symbol์„ lookahead Top-down parsing, recursive descent parsing, predictive parsing, LL parser ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ pre-roder๋กœ ์ˆœํšŒ ๋ฐ ์ƒ์„ฑ LR(k) ์šฐ์ธก์œ ๋„ ๊ธฐ๋ฐ˜ k๊ฐœ์˜ symbol์„ lookahead Bottom-up parsing, shift-reduce parsing, LR parser ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ post-order๋กœ ์ˆœํšŒ ๋ฐ ์ƒ์„ฑ Reduce S=>ฮฑฮฒฯ‰์ด๊ณ  A->ฮฒ์ด๋ฉด ฮฒ๋ฅผ A๋กœ ๋Œ€์น˜ํ•˜๋Š” ๊ฒƒ : S=>ฮฑAฯ‰ ์‹œ์ž‘ symbol์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ reduce ํ•œ๋‹ค Handle S=>ฮฑฮฒฯ‰์ด๊ณ  A->ฮฒ์ด๋ฉด ฮฒ๋ฅผ ฮฑฮฒฯ‰์˜ handle์ด๋ผ๊ณ  ํ•œ๋‹ค ๋‘ ๊ฐœ ์ด์ƒ์˜ handle์ด ์กด์žฌํ• ๋•Œ -> ๋ชจํ˜ธํ•˜๋‹ค Shift์™€ Reduce๋กœ Parsing ํ•˜๊ธฐ Stack์˜ ์˜ˆ์‹œ Issue Shift์™€ Reduce ์ค‘ ์–ด๋А ๊ฒƒ์„ ํ• ๊นŒ? Stack์˜ top์—์„œ ์–ผ๋งˆ๋งŒํผ์„ handle๋กœ ๋ณผ ๊ฒƒ์ธ๊ฐ€? ํ•ด๊ฒฐ๋ฐฉ๋ฒ•: LR Parsing Table YACC LALR ํŒŒ์„œ ์ƒ์„ฑ๊ธฐ foo.y –(yacc)–> y.tab.c –(gcc)–> a.out *.y ํŒŒ์ผ ๊ตฌ์กฐ 1<์„ ์–ธ๋ถ€> 2... 3%% 4... 5exp : exp '+' term; 6factor : ident; 7... 8%% 9<์—ฌ๋Ÿฌ ํ•จ์ˆ˜> ๋ชจํ˜ธํ•œ ๋ฌธ๋ฒ•์œผ๋กœ LR Conflict ๋ฐœ์ƒ ์‹œ ์„ ์–ธ๋ถ€์—์„œ ์šฐ์„ ์ˆœ์œ„ ์ง€์ •ํ•˜์—ฌ ํ•ด๊ฒฐ LR Parsing Table Action table : Action + Parser ์ƒํƒœ Goto table : Parser ์ƒํƒœ LR(0) ํŒŒ์‹ฑ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ LR(0) ์•„์ดํ…œ rhs์— ์ (’.’) symbol์„ ๊ฐ€์ง„ ์ƒ์„ฑ ๊ทœ์น™ ex) A->ฮฑ.ฮฒ, A->. closure ์ (’.’)๋’ค์— non-terminal์ด ์˜ค๋ฉด ์žฌ๊ท€์ ์œผ๋กœ ์ถ”๊ฐ€ S’ -> S, S -> (L)|id, L -> S | L,S closure({[S’->.S]}) = {[S’->.S], [S->.(L)], [S->.id]} goto goto(I, X)์ด๋ฉด ์ ์„ X๋’ค๋กœ ์˜ฎ๊ธฐ๊ณ  closure๋ฅผ ์ทจํ•œ๋‹ค X๊ฐ€ ์—†์œผ๋ฉด ๋„ฃ์ง€ ์•Š๋Š”๋‹ค I={[G->E=E], [E->E.+T]} ์ผ๋•Œ, goto(I, +) = closure({E->E+.T}) : ์ ์„ +๋’ค๋กœ ์˜ฎ๊น€ C0 ์ƒ์„ฑ๊ทœ์น™ S’->S์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ closure์™€ goto๋ฅผ ์ ์šฉํ•˜์—ฌ ์–ป์€ ๋ชจ๋“  ํƒ€๋‹นํ•œ LR(0)์˜ ์•„์ดํ…œ ์ง‘ํ•ฉ๋“ค Item์˜ ์ข…๋ฅ˜ [A->X.Y] : X!=ฮต์ผ๋•Œ kernel item [A->.X] : closure item [A->X.] : reduce item SLR ํŒŒ์‹ฑ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ reduce Item์ด [X->ฮฑ.]์ผ๋•Œ, FOLLOW(X)์˜ ๋ชจ๋“  terminal์—๋งŒ reduce action์„ ๋„ฃ๋Š”๋‹ค ๋‚˜๋จธ์ง€๋Š” LR(0)๊ณผ ๋˜‘๊ฐ™๋‹ค LR(0)๋ณด๋‹ค conflict๊ฐ€ ์ ์–ด, ๋” ์ •๊ตํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. LALR Parsing ์ •๊ตํ•œ ์ˆœ์„œ LR(0) < SLR < LALR(1) < LR(1) ํŒŒ์„œ ์ƒํƒœ์˜ ๊ฐœ์ˆ˜ SLR = LALR « LR(1) SDD, AST SDD (Syntax Directed Definition) SDD : semnatic action์„ ์ •์˜ํ•˜๋Š” ์ถ”์ƒ์ ์ธ ๋ช…์„ธ์„œ Semnatic Actions : ๊ทœ์น™์— ๋Œ€ํ•œ Action Yacc/Bison : $$, $1, $2, ... ์‚ฌ์šฉ ANTLR : $<name> ์‚ฌ์šฉ Type declaration Attribute ์ข…๋ฅ˜ synthesized attr. : children์— ์˜ํ•ด ๊ณ„์‚ฐ (terminal) inherited attr. : parent, sibling์— ์˜ํ•ด ๊ณ„์‚ฐ AST (Abstract Syntax Tree) ํŒŒ์ŠคํŠธ๋ฆฌ์—์„œ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•œ ํ˜•ํƒœ AST๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• ํŒŒ์‹ฑ๋‹จ๊ณ„์—์„œ ๋งŒ๋“ค๊ธฐ : LL, LR ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๋งŒ๋“ค๊ธฐ : SDD ์‚ฌ์šฉ (Yacc etc.) evaluation : ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด์„œ ์ž‘์—…ํ•˜๋Š” ํ–‰์œ„ On-the-fly evaluation S-attributed SDD: synthesized attribute๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” SDD L-attributed SDD: synthesized attribute๋งŒ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ + ๊ฐ’์ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ˜๋Ÿฌ ๊ณ„์‚ฐ์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒฝ์šฐ IR (Intermediate Representation) IR์ด๋ž€? Tree๋‚˜ Instruction list ํ˜•ํƒœ instruction(node)๊ฐ€ ์ ์–ด์•ผ ์ตœ์ ํ™”/๋ฒˆ์—ญ์— ์ข‹์Œ High Level IR High์™€ Low๋Š” ์ƒ๋Œ€์ ์ธ ๊ฐœ๋… High level IR: ์—ฌ๊ธฐ์„œ๋Š” AST์˜ ๋ณ€ํ˜•๋งŒ ์ƒ๊ฐ ์ข…๋ฅ˜ : AST, TCOL Low Level IR ๋‹จ์ˆœํ•œ instruction์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€์ƒ๊ธฐ๊ณ„(์ฃผ๋กœ RISC)๋ฅผ emulate N-tuple ํ‘œ๊ธฐ๋ฒ• (3-address code) a = b OP c ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๊ณ„์–ด๊ฐ€ ๊ฐ€์ง€๋Š” ํ”ผ์—ฐ์‚ฐ์ž ๊ฐœ์ˆ˜ <= 3 quadruple : (์—ฐ์‚ฐ์ž, ํ”ผ์—ฐ์‚ฐ์ž1, ํ”ผ์—ฐ์‚ฐ์ž2, ๊ฒฐ๊ณผ) Stack machine code Java byte code, U-code : AST๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ์ด ์šฉ์ด Tree ํ‘œํ˜„ ๊ธฐ๊ณ„์–ด ์ƒ์„ฑ ์šฉ์ด IR ์˜ˆ์‹œ GCC - GIMPLE (3-address code) GCC์˜ ์ค‘๊ฐ„์ฝ”๋“œ : GENERIC -> GIMPLE -> RTL 1D.1954 = x*10 // D.1954๋Š” ์ž„์‹œ๋ณ€์ˆ˜ 2gimple_assign <mult_exprt, D.1954, x, 10> LLVM - bit (3-address code) LLVM IR : ์–ธ์–ด์™€ ๋จธ์‹ ์— ๋…๋ฆฝ์  1@var = global i32 14 ; ์ „์—ญ๋ณ€์ˆ˜ var์— 14 ๋Œ€์ž… 2define i32 @main() nounwind { ; i32(int) ๋ฐ˜ํ™˜ํ˜• 3 entry: 4 %a = alloca i32, align 4 ; ์ง€์—ญ๋ณ€์ˆ˜ a ์„ ์–ธ, int ํ• ๋‹น 5 %1 = load i32 * @var ; %1 ์ž„์‹œ๋ณ€์ˆ˜์— var๊ฐ’ ๋Œ€์ž… 6 ret i32 %1 ; ์ž„์‹œ๋ณ€์ˆ˜ ๊ฐ’ ๋ฐ˜ํ™˜ 7} JVM - byte code (stack machine code) ๊ฐ€์ƒ ๊ธฐ๊ณ„ ์ฝ”๋“œ (Bytecode, MSIL) ๊ฐ€์ƒ ๊ธฐ๊ณ„์—์„œ ๋™์ž‘ํ•˜๋„๋ก ํ•จ ์ด์‹์„ฑ, ํ˜ธํ™˜์„ฑ์ด ๋ชฉ์  : java bytecode๋Š” machine ํ˜ธํ™˜์„ฑ, c# msil์€ language ํ˜ธํ™˜์„ฑ 1public Employee(String strName, int num) 2{name = strName; idNumber = num; storeData(strName, num);} 3Method Employee(java.lang.String, int) 4 50 aload_0 ; 0๋ฒˆ์งธ ๋กœ์ปฌ๋ณ€์ˆ˜(this)๋ฅผ ์Šคํƒ์— push 61 invokespecial #3 <Method java.lang.Object()> ; ํ•จ์ˆ˜ ํ˜ธ์ถœ 7--- 84 aload_0 95 aload_1 ; strName์„ ์Šคํƒ์— push 106 putfield #5 <Field java.lang.String name> ; name์— strName ๋Œ€์ž… 11--- 129 aload_0 1310 iload_2 ; num์„ ์Šคํƒ์— push 1411 putfield #7 <Field int idNumber> ; idNumber์— num ๋Œ€์ž… 15--- 1614 aload_0 1715 aload_1 ; strName์„ ์Šคํƒ์— push 1816 iload_2 ; num์„ ์Šคํƒ์— push 1917 invokespecial #9 <Method void storeData(java.lang.String, int)> ; ํ•จ์ˆ˜ ํ˜ธ์ถœ 2020 return line number : ๋ช…๋ น์ด ์‹œ์ž‘ํ•˜๋Š” ๋ฐ”์ดํŠธ ์ฃผ์†Œ aload : ๊ฐ์ฒด๋ฅผ push, iload : ์ •์ˆ˜๋ฅผ push ์›๋ž˜๋Š” aload๊ฐ€ ๋ช…๋ น, ์ž์ฃผ ์“ฐ๋Š” ๋ช…๋ น aload 0์„ ๋ฌถ์–ด์„œ bind -> aload_0 CIL (Common Intermediate Language) (stack machine code) C#, VB.NET, J# ๋“ฑ์—์„œ ์‚ฌ์šฉ MSIL์€ ์˜›๋‚  ์ด๋ฆ„ 1.assembly Hello {} ; .assembly: ์–ด์…ˆ๋ธ”๋ฆฌ ์„ ์–ธ 2.assembly extern mscorlib {} 3.method static void Main() { 4 .entrypoint 5 .maxstack 1 6 ldstr "Hello, world!" ; stack์— ์ €์žฅ 7 call void [mscorlib]System.Console::WriteLine(string) 8 ret 9} GCC RTL(Register Transfer Language) (Tree๊ตฌ์กฐ ์ฝ”๋“œ) Lisp S-expression ์‚ฌ์šฉ 1(set (reg:SI 140) 2 (plus:SI (reg:SI 138) 3 (reg:SI 139))) => reg140 = reg138+reg139 IR generation 3-address Translation ๊ทœ์น™ Binary operations: t = [[el OP e2]] Unary operations: t = [[OP el]] Array access: t = [[ v[e] ]] Structure access: t = [[ v.f ]] Short-circuit OR: t = [[ el SC-OR e2]] Statement sequence: [[s1; s2; ...; sN]] Variable assignment: [[ v = e ]] Array assignment: [[ v[e1] = e2 ]] If: [[ if(e) then s ]], [[ if(e) then s1 else s2]] While: [[ while (e) s ]] Switch: [[ switch (e) case v1:s1, ..., case vN:sN ]] Function Call: [[ call f(e1, e2, ..., eN) ]] Fucntion Return: [[ return e ]] Statement Expression Statement๋„ expression ์ฒ˜๋Ÿผ ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ํ™•์žฅ t = [[ S ]]๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•˜์ž Nested Expressions t = [[ (a - b) * (c + d) ]] t = [[ if c then if d then a = b ]] ๊ฐ€์žฅ ํฐ ๋ฉ์–ด๋ฆฌ๋ถ€ํ„ฐ ๋ฐ”๊พผ๋‹ค Storage Management 2๊ฐ€์ง€ Storage Register : ๋น ๋ฅธ ์ ‘๊ทผ, ๊ฐ„์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€ Memory : ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฐ ์ ‘๊ทผ, ๊ฐ„์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ 2๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹ All memory approach ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ memory์— ์ €์žฅ, ๊ฐ€๋Šฅํ•œ๊ฒƒ๋งŒ register Standard approach Global, Statics, Local(composite)๋Š” memory์— ์ €์žฅ Local(scalar)๋Š” memory ๋˜๋Š” virtual register์— ์ €์žฅ Memory์˜ 4๋Œ€ ์˜์—ญ Code space : ๋ช…๋ น์–ด๋ฅผ ์ €์žฅ read-only์ผ๋•Œ ๋น ๋ฆ„ Static data : ํ”„๋กœ๊ทธ๋žจ๊ณผ lifetime์„ ํ•จ๊ป˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ Stack : Local ๋ณ€์ˆ˜๋“ค Heap : ๋™์ ์œผ๋กœ ํ• ๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ File Format Windows : PE (Portable Executable) Unix : ELF (Executable and Linkable Format) ๋ณ€์ˆ˜ ๋ฐ”์ธ๋”ฉ environment : <๋ณ€์ˆ˜, storage location> ์ •๋ณด state: <๋ณ€์ˆ˜, ๊ฐ’> ์ •๋ณด ์–ด๋–ค ๋ณ€์ˆ˜ N์ด storage location S์— ์ง€์ •๋˜๋ฉด ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค Static Allocation ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ๋ณ€ํ•˜์ง€ ์•Š๋Š” location์œผ๋กœ ๋ฐ”์ธ๋”ฉ Heap Allocation ์—ฐ์†์ ์ธ global ์˜์—ญ์˜ ์ผ๋ถ€๋ฅผ OS๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๊ฒƒ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ์ค‘ ์š”์ฒญ๊ณผ ๋ฐ˜ํ™˜ Stack Management Run-time stack : ํ•œ ํ•จ์ˆ˜ call๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ๋‘๋Š” frames Activation record : ํ•จ์ˆ˜ ์ˆ˜ํ–‰์„ ์œ„ํ•œ execution env(local var, parameter, return address, etc.) Top frame : ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ ํ•จ์ˆ˜์˜ frame Stack pointers SP : Frame top FP : Frame base ๋‘ ๊ฐœ๋ฅผ ์“ฐ๋Š” ์ด์œ  ๊ฐ€๊นŒ์šด ๊ฑฐ ๊ธฐ์ค€์œผ๋กœ offset ๊ณ„์‚ฐ -> small offset ์œ ์ง€ ์ˆ˜ํ–‰ ์ค‘ top frame์˜ ์œ„์น˜๋ฅผ ์•Œ ์ˆ˜ ์—†์Œ Semantic Analysis - Symbol Tables Scope Identifier: ์‹๋ณ„์ž Lexical Scope: ํŠน์ • ๋ฒ”์œ„ ์‹๋ณ„์ž์˜ Scope: ๊ทธ ์‹๋ณ„์ž์˜ ์„ ์–ธ์ด ์ฐธ์กฐ๋˜๋Š” lexical scope Symbol Table Name Kind Type Attribute foo func int, int -> int extern m arg int tmp var char const ํ•˜๋‚˜์˜ lexical๋งˆ๋‹ค ํ•˜๋‚˜์˜ symbol table symbol table์€ ๊ณ„์ธต์ ์ด๋‹ค ํ˜„์žฌ scope์— ์—†์œผ๋ฉด ์ƒ์œ„ scope๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ์ฐพ๋Š”๋‹ค Symbol Table Implementation AST๊ฐ€ ๋งŒ๋“ค์–ด์ ธ์•ผ ๊ฐ€๋Šฅ Local Table์€ hash table ์‚ฌ์šฉ Global Table์€ N-array tree ๊ตฌ์กฐ ์‚ฌ์šฉ ์ฝ”๋“œ๋ฅผ ์ˆœ์ฐจ๋Œ€๋กœ ์ฝ์œผ๋ฉด์„œ ๋งŒ๋“ฌ (scope ์Šคํƒ์„ ์‚ฌ์šฉ) Type Checking Type Expressions Array types: T[], T[10] Structure types : {id1: T1, id2: T2 …} Pointer types: T* Function types: T1 X T2 X … X Tn -> T_return Type Judgement A โ”œ E : T A ์ƒํ™ฉ์—์„œ E๋Š” Tํƒ€์ž…์„ ๋งŒ์กฑํ•œ๋‹ค A โ”œ if(E) S1 else S2 : T ์œ„ ์กฐ๊ฑด์€ ๋ชจ๋“  E, S1, S2, A, T์— ๋Œ€ํ•œ ๊ฐ€์ •์ด ์„ฑ๋ฆฝํ•  ๋•Œ ๊ฒฐ๋ก  T๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค Proof Tree (ํƒ€์ž… ์œ ๋„ ํŠธ๋ฆฌ) ์—ญ์‚ผ๊ฐํ˜• ๋ชจ์–‘ ๋งŒ์กฑํ•˜๋Š” proof tree๊ฐ€ ์žˆ๋‹ค -> ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์—†๋‹ค ๊ทธ ์™ธ Semantic Analyses break, continue, goto ๋ฌธ์ด ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ์žˆ๋Š” ์ง€ ๋“ฑ ์ปดํŒŒ์ผ๋Ÿฌ ํ›„๋ฐ˜๋ถ€ (๋น ๋ฅด๊ณ , ์‹ค์ œ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๊ธฐ) Instruction Selection Tree ๊ธฐ๋ฐ˜ Intermediate Representation MEM(e) : ์ฃผ์†Œ e๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ•œ word์˜ ๋‚ด์šฉ TEMP(t) : ๋ ˆ์ง€์Šคํ„ฐ t SEQ(s1, s2): ๋ฌธ์žฅ s1 ์ˆ˜ํ–‰ ํ›„ s2 ์ˆ˜ํ–‰ ESEQ(s, e): ๋ฌธ์žฅ s ์ˆ˜ํ–‰ ํ›„ (๊ฒฐ๊ณผ ์—†์Œ) e๊ฐ€ ์ถ”๊ฐ€ ์ˆ˜ํ–‰ BINOP(o, e1, e2) : ์—ฐ์‚ฐ์ž o, ํ”ผ์—ฐ์‚ฐ์ž e1, e2, ๊ฒฐ๊ณผ ์ €์žฅ๋œ ์ฃผ์†Œ ๋ฐ˜ํ™˜ const(i): ์ •์ˆ˜ ์ƒ์ˆ˜ i Register Allocation ์ตœ์ ํ™” ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ๋Œ€ํ•œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ Register์— ์ €์žฅ Interference ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ definition์ด live range ์—์„œ ๊ณตํ†ต operation์„ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ Interference Graph : ์„œ๋กœ interfere ํ•˜๋ฉด ์—ฐ๊ฒฐํ•˜๋Š” ๊ทธ๋ž˜ํ”„ Graph coloring : ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋Š” ๋‹ค๋ฅธ ์ƒ‰์œผ๋กœ ์น ํ•˜๊ธฐ Instruction Scheduling instruction์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ์–ด stall ๊ฐœ์ˆ˜ ๋“ฑ์„ ์ค„์—ฌ์„œ ์ˆ˜ํ–‰์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ stall : ๋‹ค๋ฅธ ๋ช…๋ น์–ด ์ˆ˜ํ–‰์„ ๊ธฐ๋‹ค๋ฆฌ๋А๋ผ CPU๋ฅผ ๋‚ญ๋น„ํ•˜๋Š” ๊ฒƒ ๋ชฉํ‘œ Wasting time์„ ์ค„์ธ๋‹ค ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ ๋‚˜์™€์•ผํ•œ๋‹ค register spilling์„ ํ”ผํ•ด์•ผํ•œ๋‹ค Static scheduling ๋‹จ๊ณ„ Local basic scheduling, Loop scheduling, global scheduling Local basic scheduling List scheduling : greedy, heuristic, local technique ์‚ฌ์šฉ precedence graph๋ฅผ ๋งŒ๋“ ๋‹ค ๊ฐ ๋…ธ๋“œ์— priority function์„ ์ ์šฉํ•œ๋‹ค “ready-operation queue"๋ฅผ ์—์„œ ready operation์„ ํ•˜๋‚˜ ์„ ํƒ ํ›„ scheduling, ready operation queue๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. Longest latency-weighted path๋ฅผ ์ด์šฉํ•ด์„œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•œ๋‹ค ๊ธฐํƒ€ Optimization ๋ฐฉ๋ฒ• addr r1 1 -> inc r1 ํŠน์ˆ˜ ์„ฑ์งˆ์˜ ๋ ˆ์ง€์Šคํ„ฐ ํ™œ์šฉ ํŠน์ˆ˜ ๋ชฉ์ ์˜ ๋ช…๋ น์–ด ํ™œ์šฉ Register ๊ฐ„ mov ์ œ๊ฑฐ ์ค‘๋ณต๋œ load ์ œ๊ฑฐ Control Flow Optimizations(์ตœ์ ํ™”) ์ฃผ์–ด์ง„ ์ž…๋ ฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ข€ ๋” ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ถ„๋ฅ˜ ๋ฐฉ๋ฒ• ๋ถ„์„ : Control Flow Analysis vs Data Flow Analysis ์ตœ์ ํ™” Inner basic block(local) vs Inter basic block(global) Cyclic code opt vs Acyclic code opt Control Flow Analysis Control Flow ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ€๋Šฅํ•œ ์ˆ˜ํ–‰์ˆœ์„œ (๋ถ„๊ธฐ) Branch Execution -> dynamic control flow : ์‹คํ–‰ ํ•ด๋ด์•ผ ํ™•์ธ ๊ฐ€๋Šฅ Compiler -> static control flow : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถ„์„ํ•ด์„œ ์•Œ ์ˆ˜ ์žˆ์Œ Analysis ์ •์  ์„ฑ์งˆ (static property): ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰ ์—†์ด ๋„์ถœ ๋˜๋Š” ์„ฑ์งˆ CFA(Control Flow Analysis) : ์ฝ”๋“œ์˜ ๋ถ„๊ธฐ ๊ตฌ์กฐ๋ฅผ CFG ํ˜•ํƒœ๋กœ ํ‘œํ˜„ Basic Block ๋™์ผํ•œ execution condition์„ ์ ์šฉ๋ฐ›๋Š” instruction ๋ฌถ์Œ instruction ์™ธ์—๋Š” branch๊ฐ€ ์—†์Œ Maximal basic block ๊ตฌํ•˜๊ธฐ BB์˜ leader(์ฒซ๋ฒˆ์งธ instruction)๋ฅผ ์ฐพ๋Š”๋‹ค ๋‹ค์Œ leader ์ด์ „๊นŒ์ง€์˜ instruction์„ ๊ตฌํ•œ๋‹ค Weighted CFG Profiling: ๋ฐ˜๋ณตํ•ด์„œ ์ˆ˜ํ–‰ํ•ด๋ณด๋ฉด์„œ ์‹คํ–‰ํšŸ์ˆ˜๋ฅผ ์–ป์Œ ์–ป์€ weight๋ฅผ edge์— ํ‘œ์‹œ Control Flow Optimization Acyclic Code Loop๊ฐ€ ์—†๋Š” ์ฝ”๋“œ ๋ถ„์„ ๋ฐ ์ตœ์ ํ™”๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฌ์›€ ์ข…๋ฅ˜ Inner basic block opt. = Intra opt. = Local opt. Inter basic block opt. = Global opt. Inner Basic Block Optimization Commn subexpression elimination ๊ณตํ†ต๋œ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐ Algebraic simplification ๋Œ€์ˆ˜๋ฒ•์น™์„ ์ด์šฉํ•˜์—ฌ ์‹์„ ๊ฐ„์†Œํ™” ex) x=1*y; -> x=y; Strength reduction ์—ฐ์‚ฐ์ž์˜ ๋น„์šฉ์ด ์ ์€ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ex) x=x*2; -> x=x+x; ex) y=a/4; -> y=a>>2; Constant folding / propagation folding: ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ƒ์ˆ˜์‹์„ ์ง์ ‘์‹œ๊ฐ„ propagation : ๊ณ ์ •๋œ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜๋กœ ๋Œ€์ฒด Inter Basic Block Optimization Global application of inner basic block optimization Global common subexpression elimination basic block ๊ฐ„์˜ ๊ณตํ†ต ๋ถ€๋ถ„์‹์— ๋Œ€ํ•ด ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐ Global constant folding / propagation basic block ๊ฐ„์˜ ์ƒ์ˆ˜๋ฅผ ์ธ์‹ํ•˜์—ฌ ํ•œ๋ฒˆ๋งŒ ๊ณ„์‚ฐ Other transformation Branch to unconditional branch ๋ถˆํ•„์š”ํ•œ ๋ถ„๊ธฐ ์ œ๊ฑฐ Unconditional branch to branch ๋ถ„๊ธฐ ํ›„ ๋ฐ”๋กœ ๋ถ„๊ธฐ -> ๋ถ„๊ธฐ ํ•œ๋ฒˆ์œผ๋กœ ๋ณ€๊ฒฝ Branch to next basic block (next instr) ๋ถ„๊ธฐ ํ›„ ๋ฐ”๋กœ ๋‹ค์Œ basic block์œผ๋กœ ๋ถ„๊ธฐ ์ œ๊ฑฐ Basic block merging ๋‘ basic block์„ ํ•ฉ์นจ Branch to same target ๊ฐ™์€ basic block์œผ๋กœ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ์„ ์ œ๊ฑฐ Branch target expansion ๋ถ„๊ธฐ ๋Œ€์ƒ์ด ๋˜๋Š” basic block์„ ํ•ฉ์นจ Unreachable code elimination Entry์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ‘unreachable’ block ์ œ๊ฑฐ Loop Optimization Loop๋Š” ํ•œ๋ฒˆ optimizeํ•˜๋ฉด ํšจ๊ณผ๊ฐ€ ํฌ๋‹ค Loop unrolling : ๋ฐ˜๋ณต๋ฌธ์„ ํ’€์–ด์„œ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ค„์ž„ Loop invarient : ๋งค๋ฒˆ ๋™์ผํ•œ ๊ฐ’์„ ๋‚ด๋Š” ๋ฌธ์žฅ์„ ๋ฐ˜๋ณต๋ฌธ ๋ฐ–์œผ๋กœ ๋นผ๋ƒ„ Count up to zero : i๋ฅผ ๊ฐ์†Œํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝ (i๋ฅผ 0๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด n๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฆ„) Dataflow Analysis + Optimization Dataflow Analysis ํ”„๋กœ๊ทธ๋žจ ๋‚ด์— ๊ฐ data ๊ฐ’๋“ค์ด ์ƒ์„ฑ/์†Œ๋ฉธ๋˜๋Š” ์ •๋ณด๋ฅผ ๋ชจ์œผ๋Š” ๊ฒƒ Reaching Definition Analysis definition : ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ assign๋˜๋Š” ๊ฒƒ reach : definition d๊ฐ€ ํŠน์ • ์œ„์น˜ p์— ๋„๋‹ฌํ•œ๋‹ค kill : definition d์˜ ๋‘๊ฐœ์˜ ํฌ์ธํŠธ์‚ฌ์ด์—์„œ ๋‹ค๋ฅธ definition์ด ์กด์žฌํ•œ๋‹ค GEN/KILL GEN: ๋ธ”๋ก ๋‚ด์—์„œ ์ƒ์„ฑ๋œ definition KILL: ๋ธ”๋ก ๋‚ด์—์„œ ์†Œ๋ฉธ๋œ definition IN/OUT IN : ์ด์ „ ๋ธ”๋ก์˜ OUT์˜ ํ•ฉ์ง‘ํ•ฉ OUT : IN์—์„œ GEN์„ ๋”ํ•˜๊ณ  KILL์„ ๋บ€ ๊ฒƒ
new ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ๊ฐœ์š” ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ์˜ ์š”๊ตฌ์‚ฌํ•ญ ๊ธฐ๋ฐ€์„ฑ(Confidentiality) ์ •๋ณด๋ฅผ ๊ถŒํ•œ์ด ์—†๋Š” ๊ฐœ์ธ์—๊ฒŒ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ•จ ๋ฌด๊ฒฐ์„ฑ(Integrity) ์ •๋ณด์™€ ํ”„๋กœ๊ทธ๋žจ์€ ์ธ๊ฐ€๋œ ๋ฐฉ์‹์œผ๋กœ๋งŒ ๋ณ€๊ฒฝ๋˜๋„๋ก ํ•จ ๊ฐ€์šฉ์„ฑ(Availability) ์ •๋ณด ์ž์‚ฐ์— ๋Œ€ํ•ด ์ ์ ˆํ•œ ์‹œ๊ฐ„์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•จ ๋ณด์•ˆ ๊ณต๊ฒฉ์˜ ์ข…๋ฅ˜ ์†Œ๊ทน์  ๊ณต๊ฒฉ(Passive Attack) ์ •๋ณด๋ฅผ ๋„์ฒญํ•˜๊ฑฐ๋‚˜ ๊ฐ์‹œํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ์–ด๋ฐฉ๋ฒ• : ์•”ํ˜ธํ™” ์ ๊ทน์  ๊ณต๊ฒฉ(Active Attack) ์ •๋ณด๋ฅผ ๋ณ€์กฐํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ์–ด๋ฐฉ๋ฒ• : ๋ฉ”์‹œ์ง€ ์ธ์ฆ ๋ณด์•ˆ ์„œ๋น„์Šค ์ธ์ฆ(Authentication) ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ • ๋Œ€๋“ฑ ๊ฐœ์ฒด ์ธ์ฆ, ๋ฐ์ดํ„ฐ-๊ทผ์›์ง€ ์ธ์ฆ ์ ‘๊ทผ ์ œ์–ด(Access Control) ์ž์›์„ ๋ถˆ๋ฒ•์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ€์„ฑ(Data Confidentiality) ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ฒ•์  ๋…ธ์ถœ์„ ๋ง‰๋Š” ๊ฒƒ ์—ฐ๊ฒฐ๊ธฐ๋ฐ€์„ฑ, ๋น„์—ฐ๊ฒฐ ๊ธฐ๋ฐ€์„ฑ, ์„ ๋ณ„๋œ-ํ•„๋“œ ๊ธฐ๋ฐ€์„ฑ, ํŠธ๋ž˜ํ”ฝ-ํ๋ฆ„ ๊ธฐ๋ฐ€์„ฑ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ(Data Integrity) ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์†ก์‹ ๋œ ๋ฐ์ดํ„ฐ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ ์—ฐ๊ฒฐํ˜• ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ, ๋น„์—ฐ๊ฒฐํ˜• ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ, ๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์„ ๋ณ„๋œ-ํ•„๋“œ ์—ฐ๊ฒฐ ๋ฌด๊ฒฐ์„ฑ, ๋น„์—ฐ๊ฒฐ ๋ฌด๊ฒฐ์„ฑ, ์„ ๋ณ„๋œ-ํ•„๋“œ ๋น„์—ฐ๊ฒฐ ๋ฌด๊ฒฐ์„ฑ ๋ถ€์ธ ๋ด‰์‡„ (Non-repudiation) ํ†ต์‹ ์˜ ํ•œ ์ฃผ์ฒด๊ฐ€ ํ†ต์‹ ์— ์ฐธ์—ฌํ–ˆ๋˜ ์‚ฌ์‹ค์„ ๋ถ€์ธํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ๊ฐ€์šฉ์„ฑ ์„œ๋น„์Šค (Availability Service) ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํŠน์ • ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํŠน์ • ํ”„๋กœํ† ์ฝœ ๊ณ„์ธต์—์„œ ๊ตฌํ˜„๋˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ธ์ฆ ์•”ํ˜ธํ™” ๋””์ง€ํ„ธ ์„œ๋ช… ์ ‘๊ทผ ์ œ์–ด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์ธ์ฆ ๊ตํ™˜ ํŠธ๋ž˜ํ”ฝ ํŒจ๋”ฉ ๊ฒฝ๋กœ ์ œ์–ด ๊ณต์ฆ ์ผ๋ฐ˜ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๊ณ„์ธต๊ณผ ์„œ๋น„์Šค์— ๋…๋ฆฝ์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์‹ ๋ขฐ๋ฐ›๋Š” ๊ธฐ๋Šฅ ๋ณด์•ˆ ๋ ˆ์ด๋ธ” ์‚ฌ๊ฑด ํƒ์ง€ ๋ณด์•ˆ ๊ฐ์‚ฌ ์ถ”์  ๋ณด์•ˆ ๋ณต๊ตฌ ์•”ํ˜ธ ๊ธฐ์ˆ ์˜ ์ดํ•ด ์ „ํ†ต์ ์ธ ์•”ํ˜ธ ๊ธฐ์ˆ  ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์  ๋น„๋ฐ€์„ฑ ์œ ์ง€ (Confidentiality) ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€ (Data Integrity) ์‚ฌ์šฉ์ž ๋˜๋Š” ์ž๋ฃŒ์˜ ์ถœ์ฒ˜ ์ธ์ฆ (Authentication) ๋ถ€์ธ ๋ฐฉ์ง€ (Non-repudiation) ์•”ํ˜ธ ํ•ด๋… ํ•ด๋…์ž๋Š” ์•”ํ˜ธ ์‹œ์Šคํ…œ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ํ‚ค๋งŒ ๋ชจ๋ฆ„ Cipher Text Only Attack : ์•”ํ˜ธ๋ฌธ ๋‹จ๋… ๊ณต๊ฒฉ Know Plain Text Attack : ์•Œ๋ ค์ง„ ํ‰๋ฌธ ๊ณต๊ฒฉ Chosen Plain Text Attack : ์„ ํƒ์  ํ‰๋ฌธ ๊ณต๊ฒฉ ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™” ๋น„๋ฐ€ํ‚ค ์•”ํ˜ธ์˜ ๋น„๊ต ๊ตฌ๋ถ„ ๊ณต๊ฐœํ‚ค ์•”ํ˜ธ ๋น„๋ฐ€ํ‚ค ์•”ํ˜ธ ํ‚ค์˜ ๊ด€๊ณ„ ์•”ํ˜ธํ™” ํ‚ค != ๋ณตํ˜ธํ™” ํ‚ค ์•”ํ˜ธํ™” ํ‚ค = ๋ณตํ˜ธํ™” ํ‚ค ํ‚ค์˜ ๊ฐœ์ˆ˜ 2n n(n-1)/2 1์ธ๋‹น ํ•„์š”ํ•œ ๋น„๋ฐ€ํ‚ค 1 n-1 ์†๋„ ๋น„ํšจ์œจ์  ํšจ์œจ์  ๋Œ€์นญํ‚ค(๋น„๋ฐ€ํ‚ค) ์•”ํ˜ธ ์ข…๋ฅ˜ ๋ธ”๋ก ์•”ํ˜ธ : ๋ธ”๋ก ๋‹จ์œ„๋กœ ์•”ํ˜ธํ™” DES, IDEA, AES ์ŠคํŠธ๋ฆผ ์•”ํ˜ธ : ๋น„ํŠธ ๋‹จ์œ„๋กœ ์•”ํ˜ธํ™” RC4, A5/1 ํ•œ๊ตญ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ NEAT, SEED, NES, ARIA ๊ณต๊ฐœํ‚ค(๋น„๋Œ€์นญํ‚ค) ์•”ํ˜ธ ์ข…๋ฅ˜ ์†Œ์ธ์ˆ˜ ๋ถ„ํ•ด ๊ธฐ๋ฐ˜ : RSA ์ด์‚ฐ ๋Œ€์ˆ˜ ๊ธฐ๋ฐ˜ : ElGamal ํƒ€์› ๊ณก์„  ๊ธฐ๋ฐ˜ ํ‚ค ์ƒ์„ฑ ์„œ๋กœ์†Œ์ธ ๋‘ ์†Œ์ˆ˜ p, q๋ฅผ ์„ ํƒ n = p * q ฯ†(n) = (p-1)(q-1) gcd(e, ฯ†(n)) = 1์„ ๋งŒ์กฑํ•˜๋Š” e ์„ ํƒ d * e mod ฯ†(n) = 1์„ ๋งŒ์กฑํ•˜๋Š” d ์„ ํƒ ๊ณต๊ฐœํ‚ค : {e, n}, ๋น„๋ฐ€ํ‚ค : {d, n} ์•”ํ˜ธํ™” C = M^e mod n ๋ณตํ˜ธํ™” M = C^d mod n DH (Diffie Hellman) ํ‚ค ๊ณต์œ  q(์†Œ์ˆ˜), ฮฑ(q์˜ ์›์‹œ๊ทผ, ฮฑ<q) ์ž„์˜ ์ˆ˜ $X_A < q$๋ฅผ ๋งŒ์กฑํ•˜๋Š” $X_A$๋ฅผ ์„ ํƒ ๊ณต๊ฐœํ•  $Y_A = \alpha^{X_A} mod\ q$ ์ƒ๋Œ€๋ฐฉ์ด ์ƒ์„ฑํ•˜๋Š” ๋น„๋ฐ€ํ‚ค $K = Y_A^{X_B} mod\ q$ ์•”ํ˜ธ ๊ธฐ์ˆ ์˜ ํ™œ์šฉ ๋””์ง€ํ„ธ ์„œ๋ช… ํŠน์„ฑ ์œ„์กฐ ๋ถˆ๊ฐ€, ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€, ์„œ๋ช…์ž ์ธ์ฆ, ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€, ๋ถ€์ธ ๋ฐฉ์ง€ ์„œ๋ช…์ž์˜ ๋น„๋ฐ€ํ‚ค๋กœ ์•”ํ˜ธํ™” ์„œ๋ช…์ž์˜ ๊ณต๊ฐœํ‚ค๋กœ ๋ณตํ˜ธํ™” ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ๋ฉ”์‹œ์ง€ ์ธ์ฆ ํ•ด์‹œ ํ•จ์ˆ˜์˜ ์š”๊ฑด ๋‹จ๋ฐฉํ–ฅ์„ฑ : H(x) = h์ผ๋•Œ, x๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค ์•ฝํ•œ ์ถฉ๋Œ ์ €ํ•ญ์„ฑ : H(x)=H(y)๋ฅผ ๋งŒ์กฑํ•˜๋Š” y(=x)๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค ๊ฐ•ํ•œ ์ถฉ๋Œ ์ €ํ•ญ์„ฑ : H(x)=H(y)๋ฅผ ๋งŒ์กฑํ•˜๋Š” (x, y)๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค ๊ณต๊ฐœํ‚ค ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ ์ธ์ฆ์„œ ๊ณต๊ฐœํ‚ค์™€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์ „์ž ๋ฌธ์„œ ํ‘œ์ค€ : X.509 v3 PKI (Public Key Infrastructure) ๊ณต๊ฐœํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ธ์ฆํ•˜๋Š” ๊ตฌ์กฐ CA (Certificate Authority) : ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ RA (Registration Authority) : ์‚ฌ์šฉ์ž ๋“ฑ๋ก CRL (Certificate Revocation List) : ํ๊ธฐ๋œ ์ธ์ฆ์„œ ๋ชฉ๋ก ๋™ํ˜•์•”ํ˜ธ์™€ ์–‘์ž์•”ํ˜ธ ๊ธฐ์ˆ  ๋™ํ˜•์•”ํ˜ธ ์•”ํ˜ธํ™”๋œ ์ƒํƒœ์—์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณตํ˜ธํ™”ํ•˜๋ฉด ์›๋ฌธ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ์•”ํ˜ธํ™” ๊ธฐ๋ฒ• ๋ถ€๋ถ„ ๋™ํ˜• ์•”ํ˜ธ : ๋ง์…ˆ๊ณผ ๊ณฑ์…ˆ ์ค‘์—์„œ ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ๋งŒ ์ง€์› ์ค€๋™ํ˜• ์•”ํ˜ธ : ์—ฐ์‚ฐ์˜ ํšŸ์ˆ˜์— ์ œํ•œ์ด ์กด์žฌ ์™„์ „ ๋™ํ˜• ์•”ํ˜ธ : ์ž„์˜์˜ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ ํ™œ์šฉ ์•”ํ˜ธํ™”๋œ ์ƒํƒœ๋กœ ์—ฐ์‚ฐ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์„ฑ์ด ๋†’์Œ ์–‘์ž ๋‚ด์„ฑ ์•”ํ˜ธ (PQC: Post Quantum Cryptography) ์–‘์ž ์ปดํ“จํ„ฐ์— ์˜ํ•œ ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•œ ๊ณต๊ฐœํ‚ค ์•”ํ˜ธ QKD(Quantum Key Distribution) : ์–‘์ž ํ†ต์‹ ์„ ์œ„ํ•ด ๋น„๋ฐ€ํ‚ค๋ฅผ ๋ถ„๋ฐฐ/๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ  QRNG(Quantum Random Number Generator) : ์–‘์ž ๋‚œ์ˆ˜ ์ƒ์„ฑ๊ธฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์‚ฌ์šฉ์ž ์ธ์ฆ ์›๋ฆฌ ์ธ์ฆ ์ ˆ์ฐจ ์‹ ์› ํ™•์ธ ๋‹จ๊ณ„ ์ž…์ฆ ๋‹จ๊ณ„ NIST์˜ ์ „์ž ์ธ์ฆ ๋ชจ๋ธ ์ธ์ฆ ์ˆ˜๋‹จ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ†ตํ•œ ์ธ์ฆ : ๋น„๋ฐ€๋ฒˆํ˜ธ ์†Œ์œ ๋ฌผ์„ ํ†ตํ•œ ์ธ์ฆ : OTP ๊ธฐ๊ธฐ, ์ธ์ฆ์„œ ์ƒ์ฒด ์กฐ์ง์„ ํ†ตํ•œ ์ธ์ฆ : ์ง€๋ฌธ, ๋ง๋ง‰ ํ–‰๋™์„ ํ†ตํ•œ ์ธ์ฆ : ๋ชฉ์†Œ๋ฆฌ ํŒจํ„ด, ํ•„์  ๋ณด์กด ๋“ฑ๊ธ‰ ์˜ํ–ฅ ํ”„๋กœํŒŒ์ผ ๋ณด์ฆ๋ ˆ๋ฒจ : ์‹ ๋ขฐ์„œ ์ •๋„์— ๋”ฐ๋ผ 4๊ฐ€์ง€ ๋“ฑ๊ธ‰์œผ๋กœ ๋ถ„๋ฅ˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๊ณต๊ฒฉ ์œ ํ˜• ์˜คํ”„๋ผ์ธ ์‚ฌ์ „ ๊ณต๊ฒฉ ํŠน์ • ๊ณ„์ • ๊ณต๊ฒฉ ์ž˜ ์•Œ๋ ค์ง„ ํŒจ์Šค์›Œ๋“œ ๊ณต๊ฒฉ, ๋Œ€์ž… ๊ณต๊ฒฉ ๋‹จ์ผ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ํŒจ์Šค์›Œ๋“œ ์ถ”์ธก ๋‹จ๋ง๊ธฐ ๊ฐ•ํƒˆ ์‚ฌ์šฉ์ž ์‹ค์ˆ˜ ์ด์šฉ ๋‹ค์ค‘ ๋น„๋ฐ€ ๋ฒˆํ˜ธ ์‚ฌ์šฉ ์ปดํ“จํ„ฐ ๋ชจ๋‹ˆํ„ฐ๋ง : ํ†ต์‹  ํŒจํ‚ท ๋ถ„์„ ํ•ด์‹œํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์‚ฌ์šฉ Salt์˜ ์—ญํ•  ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์•„๋„ ๋‹ค๋ฅธ ํ•ด์‹œ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ํ•จ ํŒจ์Šค์›Œ๋“œ ํฌ๋ž™ํ‚น ์‚ฌ์ „ ๊ณต๊ฒฉ ๋ ˆ์ธ๋ณด์šฐ ํ…Œ์ด๋ธ” ๊ณต๊ฒฉ : ๋ชจ๋“  ์†”ํŠธ์— ๋Œ€ํ•œ ํ•ด์‹œ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด ๋†“์€ ํ…Œ์ด๋ธ”์„ ์ด์šฉ ํŒจ์Šค์›Œ๋“œ ์„ ํƒ ๊ธฐ๋ฒ• ์‚ฌ์šฉ์ž ๊ต์œก ์ปดํ“จํ„ฐ ๋ฐœ์ƒ ํŒจ์Šค์›Œ๋“œ ํŒจ์Šค์›Œ๋“œ ๊ฒ€์‚ฌ์˜ ํ™œ์„ฑํ™” : ์ž์ฒด ํŒจ์Šค์›Œ๋“œ ํฌ๋ž˜์ปค ์‹คํ–‰ ์‚ฌ์ „ ํŒจ์Šค์›Œ๋“œ ๊ฒ€์‚ฌ : ํŒจ์Šค์›Œ๋“œ ์•ˆ์ •์„ฑ ๊ฒ€์‚ฌ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ข…๋ฅ˜ ๋ฉ”๋ชจ๋ฆฌ ์นด๋“œ ์Šค๋งˆํŠธ ์นด๋“œ : ์ž„๋ฒ ๋””๋“œ ๋งˆ์ดํฌ๋กœํ”„๋กœ์„ธ์„œ ํฌํ•จ ์ƒ์ฒด ์ธ์ฆ ๊ธฐ์ˆ  ์ •ํ™•๋„ : ํ™•๋ฅ  ๋ฐ€๋„ ํ•จ์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์ •๊ทœ ๋ถ„ํฌ๋ฅผ ๋”ฐ๋ฆ„ FAR (False Acceptance Rate) : ๊ฑฐ์ง“ ์ˆ˜๋ฝ๋ฅ  FRR (False Rejection Rate) : ๊ฑฐ์ง“ ๊ฑฐ๋ถ€์œจ EER (Equal Error Rate) : FAR๊ณผ FRR์ด ๊ฐ™์€ ์ง€์  ์›๊ฒฉ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฉ€ํ‹ฐ ํŒฉํ„ฐ ์ธ์ฆ : ๋‘ ์š”์†Œ ์ด์ƒ์„ ์‚ฌ์šฉํ•œ ์ธ์ฆ ๋ฉ€ํ‹ฐ ์ฑ„๋„ ์ธ์ฆ : ๋‹ค์–‘ํ•œ ์ฑ„๋„์„ ํ†ตํ•ด ์ธ์ฆ ์ธ์ฆ ํ”„๋กœํ† ์ฝœ ํŒจ์Šค์›Œ๋“œ ํ”„๋กœํ† ์ฝœ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†ก ์‚ฌ์šฉ์ž๋Š” ํŒจ์Šค์›Œ๋“œ์™€ ๋‚œ์ˆ˜๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ํ•ด์‹œ๊ฐ’์„ ์ƒ์„ฑ, ์ „์†ก ํ† ํฐ ํ”„๋กœํ† ์ฝœ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†ก ์‚ฌ์šฉ์ž๋Š” ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚œ์ˆ˜๋ฅผ ์•”ํ˜ธํ™”, ์ „์†ก ์ •์  ์ƒ์ฒด ํ”„๋กœํ† ์ฝœ ํ˜ธ์ŠคํŠธ๋Š” ๋‚œ์ˆ˜์™€ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ ์‹๋ณ„์ž๋ฅผ ์ „์†ก ์‚ฌ์šฉ์ž๋Š” ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์ฒด ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™”, ์ „์†ก ๋™์  ์ƒ์ฒด ํ”„๋กœํ† ์ฝœ ํ˜ธ์ŠคํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋žœ๋ค ์‹œํ€€์Šค๋‚˜ ๋‚œ์ˆ˜๋ฅผ ์ „์†ก ์‚ฌ์šฉ์ž๋Š” ์ด๋ฅผ ๋งํ•˜๊ฑฐ๋‚˜, ๊ธ€์ž๋ฅผ ์“ฐ๋Š” ๋“ฑ์˜ ๋™์ž‘์„ ์ˆ˜ํ–‰, ์•”ํ˜ธํ™” ํ›„ ์ „์†ก ์ ‘๊ทผ ์ œ์–ด ์ ‘๊ทผ ์ œ์–ด ์›๋ฆฌ ์ ‘๊ทผ์ œ์–ด ์ฒ ํ•™ ์ ‘๊ทผํ†ต์ œ ์˜์—ญ ๊ด€๋ฆฌ์  ํ†ต์ œ ๊ธฐ์ˆ ์  ํ†ต์ œ ๋ฌผ๋ฆฌ์  ํ†ต์ œ ์ ‘๊ทผ ์ œ์–ด ์›์น™ ์•Œ ํ•„์š”์„ฑ ์›์น™ ์ตœ์†Œ ๊ถŒํ•œ ์›์น™ ์ตœ๋Œ€ ๊ถŒํ•œ ์›์น™ ์ง๋ฌด ๋ถ„๋ฆฌ ์›์น™ ์ ‘๊ทผ ์ œ์–ด ๊ธฐ๋ณธ ์š”์†Œ ์ฃผ์ œ : ๊ฐ์ฒด์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์กด์žฌ : user, group, other ๊ฐ์ฒด : ์ ‘๊ทผ์ด ์ œ์–ด๋˜๋Š” ์ž์› : ํŒŒ์ผ ๋˜๋Š” ๋ ˆ์ฝ”๋“œ ์ ‘๊ทผ ๊ถŒํ•œ : ์ฃผ์ฒด๊ฐ€ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• : ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ์‹คํ–‰ ๋“ฑ ์ ‘๊ทผ ์ œ์–ด ์š”๊ตฌ ์‚ฌํ•ญ ๋‹ซํžŒ ์ •์ฑ… : ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ ์—ด๋ฆฐ ์ •์ฑ… : ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ ์ ‘๊ทผ ์ œ์–ด ์ •์ฑ… ์ž„์˜ ์ ‘๊ทผ ์ œ์–ด (DAC) ๊ฐ•์ œ์  ์ ‘๊ทผ ์ œ์–ด (MAC) ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด (RBAC) ์†์„ฑ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด (ABAC) ์ž„์˜ ์ ‘๊ทผ ์ œ์–ด (DAC, ์ž์œจ์  ์ ‘๊ทผ ์ œ์–ด) ํ•œ ๊ฐœ์ฒด๊ฐ€ ์ž์‹ ์˜ ์˜์ง€๋Œ€๋กœ ๋‹ค๋ฅธ ๊ฐœ์ฒด์—๊ฒŒ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ์‹ ์ ‘๊ทผ ์ œ์–ด ๋ชฉ๋ก (access control list) > ๊ฐœ์ฒด๋ณ„๋กœ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ช…์‹œํ•˜๋Š” ๋ฐฉ์‹ ์ธ๊ฐ€ ํ…Œ์ด๋ธ” ํ™•์žฅ๋œ ์ ‘๊ทผ ์ œ์–ด ๋งคํŠธ๋ฆญ์Šค UNIX ํŒŒ์ผ ์ ‘๊ทผ ์ œ์–ด Set-UID : ์‹คํ–‰ํ•  ๋•Œ, euid๋ฅผ ์†Œ์œ ์ž์˜ id๋กœ ์„ค์ •๋จ ex) -rwsr-xr-x : 4755 Set-GID : ์‹คํ–‰ํ•  ๋•Œ, egid๋ฅผ ์†Œ์œ ๊ทธ๋ฃน์˜ id๋กœ ์„ค์ •๋จ ex) -rwxr-sr-x : 2755 ํŒจ์Šค์›Œ๋“œ ํŒŒ์ผ : /etc/shadow : ———- : 000 ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด ์‚ฌ์šฉ์ž์˜ ์—ญํ• ์— ๋”ฐ๋ผ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ์‹ ์—ญํ•  ๊ณ„์ธต - RBAC1 ์—ญํ•  ๊ตฌ์กฐ๋Š” ๊ธฐ๊ด€ ๋‚ด ์—ญํ• ์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜๋‹จ ์ œ์•ฝ(์ „์ œ์กฐ๊ฑด)์˜ ์˜๋ฏธ์™€ ์ข…๋ฅ˜ - RBAC2 ์ œ์•ฝ์˜ ์ข…๋ฅ˜ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ธ ์—ญํ•  : ์ง๋ฌด์™€ ๋Šฅ๋ ฅ์„ ๋ถ„๋ฆฌ cardinality : ์—ญํ• ์— ๊ด€ํ•œ ์ตœ๋Œ€์ˆซ์ž๋ฅผ ์„ค์ • ์ „์ œ ์กฐ๊ฑด : ํŠน์ • ์—ญํ• ์ด ๋‹ค๋ฅธ ๋ช…์‹œ๋œ ์—ญํ• ์— ํ• ๋‹น ๋˜์—ˆ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๋Š” ๊ทธ ์—ญํ• ์—๋งŒ ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋‹ค ์†์„ฑ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด ์ž์›๊ณผ ์ฃผ์ฒด์˜ ์„ฑ์งˆ์˜ ํŠน์„ฑ์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ํ‘œํ˜„ํ•˜์—ฌ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹ ABAC ๋ชจ๋ธ์˜ 3๊ฐ€์ง€ ์ฃผ์š” ์š”์†Œ ๊ตฌ์„ฑ ๋‚ด์˜ ์กด์žฌ๋ฅผ ์œ„ํ•ด ์ •์˜๋œ ์†์„ฑ ABAC ์ •์ฑ…์„ ์œ„ํ•ด ์ •์˜๋œ ์ •์ฑ… ๋ชจ๋ธ ์ ‘๊ทผ ์ œ์–ด ์‹คํ–‰์„ ์œ„ํ•œ ์ •์ฑ…์— ์ ์šฉ๋˜๋Š” ๊ตฌ์กฐ ๋ชจ๋ธ ์†์„ฑ ์ฃผ์ฒด, ๊ฐ์ฒด ํ™˜๊ฒฝ ์กฐ๊ฑด, ๊ถŒํ•œ์— ์˜ํ•ด ๋ฏธ๋ฆฌ ์ •์˜๋˜๊ณ  ํ• ๋‹น๋œ ์š”๊ตฌ ๋™์ž‘์˜ ํŠน์ • ์ธก๋ฉด์„ ์ •์˜ํ•˜๋Š” ์„ฑ์งˆ ์œ ํ˜• ์ฃผ์ฒด ์†์„ฑ : ์‚ฌ์šฉ์ž, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ, ํ”„๋กœ์„ธ์Šค, ๋””๋ฐ”์ด์Šค ๊ฐ์ฒด ์†์„ฑ : ๋””๋ฐ”์ด์Šค, ํŒŒ์ผ, ํ”„๋กœ๊ทธ๋žจ, ๋„คํŠธ์›Œํฌ ๋“ฑ ํ™˜๊ฒฝ ์†์„ฑ : ๋‚ ์งœ, ์‹œ๊ฐ„, ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ๋ ˆ๋ฒจ ๋“ฑ ABAC์˜ ๋…ผ๋ฆฌ ๊ตฌ์กฐ ACL ์ ‘๊ทผ ์ฒด์ธ ABAC ์‹ ๋ขฐ ์ฒด์ธ ์ •์ฑ… ์กฐ์ง ๋‚ด์—์„œ ์ฃผ์ฒด์˜ ๊ถŒํ•œ๊ณผ ํ™˜๊ฒฝ ์กฐ๊ฑด์—์„œ ์ž์› ํ˜น์€ ๊ฐ์ฒด๋“ค์ด ๋ณดํ˜ธ๋˜๋Š” ๊ฒƒ์— ๊ธฐ๋ฐ˜ํ•œ ํ—ˆ๊ฐ€๋œ ํ–‰์œ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ทœ์น™๊ณผ ๊ด€๊ณ„์˜ ์ง‘ํ•ฉ ๊ฐ•์ œ์  ์ ‘๊ทผ ์ œ์–ด (MAC) ๊ฐ์ฒด์— ํฌํ•จ๋œ ์ •๋ณด์˜ ๋น„๋ฐ€์„ฑ๊ณผ ์ด๋Ÿฌํ•œ ๋น„๋ฐ€์„ฑ์˜ ์ ‘๊ทผ ์ •๋ณด์— ๋Œ€ํ•˜์—ฌ ์ฃผ์ฒด๊ฐ€ ๊ฐ–๋Š” ๊ถŒํ•œ์— ๊ทผ๊ฑฐํ•˜์—ฌ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ธฐ๋ฐ€์„ฑ์— ๋”ฐ๋ฅธ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด No read up (๋‹จ์ˆœ ๋ณด์•ˆ ์†์„ฑ) ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์€ ์ฃผ์ฒด๋Š” ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋†’์€ ๊ฐ์ฒด๋ฅผ ์ฝ์„ ์ˆ˜ ์—†์Œ No write down (*(์Šคํƒ€) ๋ณด์•ˆ ํŠน์„ฑ) ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋†’์€ ์ฃผ์ฒด๋Š” ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์€ ๊ฐ์ฒด์— ๊ธฐ๋กํ•  ์ˆ˜ ์—†์Œ ๋ฌด๊ฒฐ์„ฑ์— ๋”ฐ๋ฅธ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด No read up (๋‹จ์ˆœ ๋ฌด๊ฒฐ์„ฑ ํŠน์„ฑ) ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋†’์€ ์ฃผ์ฒด๋Š” ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์€ ๊ฐ์ฒด๋ฅผ ์ฝ์„ ์ˆ˜ ์—†์Œ No write down (*(์Šคํƒ€) ๋ฌด๊ฒฐ์„ฑ ํŠน์„ฑ) ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์€ ์ฃผ์ฒด๋Š” ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋†’์€ ๊ฐ์ฒด์— ๊ธฐ๋กํ•  ์ˆ˜ ์—†์Œ ์‹ ์›, ์‹ ์šฉ์žฅ, ์ ‘๊ทผ ๊ด€๋ฆฌ (ICAM) ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž์› : ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ, ์‹œ์Šคํ…œ ์ž์›, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ž์› ์ „ํ†ต์ ์ธ DoS ๊ณต๊ฒฉ ํ”Œ๋Ÿฌ๋”ฉ ํ•‘ ๋ช…๋ น ๋Œ€์ƒ ์กฐ์ง์— ๋Œ€ํ•ด ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ๊ธฐ๋Šฅ์„ ์ œ์••ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์  ์‹œ์ž‘ ์ฃผ์†Œ ์Šคํ‘ธํ•‘ ์œ„์กฐ๋œ ์†Œ์Šค ์ฃผ์†Œ ์‚ฌ์šฉ ํ›„๋ฐฉ ์‚ฐ๋ž€(backscatter) ํŠธ๋ž˜ํ”ฝ์„ ์ด์šฉํ•ด ๋Œ€์‘ SYN ์Šคํ‘ธํ•‘ ์ผ๋ฐ˜์ ์ธ DoS๊ณต๊ฒฉ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ๋„˜์น˜๊ฒŒ ํ•จ Flooding ๊ณต๊ฒฉ์— ๋น„ํ•ด ์ ์€ ํŠธ๋ž˜ํ”ฝ์œผ๋กœ ๊ณต๊ฒฉ ๊ฐ€๋Šฅ ๊ณต๊ฒฉ์ž ์ž…์žฅ ์Šคํ‘ธํ•‘๋œ ์‹œ์Šคํ…œ์ด ์กด์žฌํ•œ๋‹ค๋ฉด Reset ํŒจํ‚ท์„ ์ˆ˜์‹  ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํƒ€์ด๋จธ์— ์˜ํ•œ ์žฌ์ „์†ก ํ›„ ์—”ํŠธ๋ฆฌ ์‚ญ์ œ Reset์œผ๋กœ ๋ฐ˜์‘ํ•˜์ง€ ์•Š๋Š” ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉ ํ”Œ๋Ÿฌ๋”ฉ ๊ณต๊ฒฉ ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜ ICMP ํ”Œ๋Ÿฌ๋”ฉ UDP ํ”Œ๋Ÿฌ๋”ฉ TCP SYN ํ”Œ๋Ÿฌ๋”ฉ DDoS (Distributed Denial of Service) ์—ฌ๋Ÿฌ ๋Œ€์˜ ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ƒ ์‹œ์Šคํ…œ์„ ๊ณต๊ฒฉํ•˜๋Š” ๋ฐฉ์‹ ๋ถ„์‚ฐ ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ๊ธฐ๋ฐ˜ ๋Œ€์—ญํญ ๊ณต๊ฒฉ ์„ธ์…˜ ๊ฐœ์‹œ ํ”„๋กœํ† ์ฝœ(SIP) ํ”Œ๋Ÿฌ๋“œ ์„ธ์…˜ ๊ฐœ์‹œ ํ”„๋กœํ† ์ฝœ : VoIP ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ HTTP ๊ธฐ๋ฐ˜ ๊ณต๊ฒฉ ์ŠคํŒŒ์ด๋”๋ง(spidering) ํŠน์ • HTTP ๋งํฌ์—์„œ ์‹œ์ž‘๋˜๋ฉฐ, ์žฌ๊ท€์  ๋ฐฉ์‹์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์›น์‚ฌ์ดํŠธ์— ๋ชจ๋“  ๋งํฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ๋ด‡ R-U-DEAD-YET (RUDY) ๊ณต๊ฒฉ Content-Length๋ฅผ ํฌ๊ฒŒ ์„ค์ •ํ•˜์—ฌ ์„œ๋ฒ„์˜ ์ง€์—ฐ์„ ์œ ๋ฐœํ•˜๋Š” ๊ธฐ๋ฒ• Slowloris ๊ณต๊ฒฉ ๋น„์ •์ƒ์ ์ธ ํ—ค๋” ๊ฐ’์„ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜์—ฌ, ์„œ๋ฒ„๊ฐ€ ํ—ค๋”๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐ˜์‚ฌ ๋ฐ ์ฆํญ ๊ณต๊ฒฉ ๋ฐ˜์‚ฌ ๊ณต๊ฒฉ TCP SYN ์Šคํ‘ธํ•‘ ๊ณต๊ฒฉ DNS ๋ฐ˜์‚ฌ ๊ณต๊ฒฉ ์ฆํญ ๊ณต๊ฒฉ (smurfs) DNS ์ฆํญ ๊ณต๊ฒฉ ๊ณต๊ฒฉ์ž๊ฐ€ ํƒ€๊ฒŸ ์‹œ์Šคํ…œ์˜ ์Šคํ‘ธํ•‘ ์†Œ์Šค ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” DNS ์—ฐ์‡„์  ์š”์ฒญ ์ ์€ ์š”์ฒญ์œผ๋กœ ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” DNS ํ–‰์œ„๋ฅผ ์ด์šฉ ๋ฐฉ์–ด์ฑ… : ์Šคํ‘ธํ•‘ ์†Œ์Šค ์ฃผ์†Œ์˜ ์‚ฌ์šฉ์„ ๋ฐฉ์ง€ DoS ๊ณต๊ฒฉ ๋ฐฉ์–ด, ์˜ˆ๋ฐฉ, ๋Œ€์‘ DoS ๊ณต๊ฒฉ ์˜ˆ๋ฐฉ ์Šคํ‘ธํ•‘ ์†Œ์Šค ์ฃผ์†Œ ์ฐจ๋‹จ TCP ์—ฐ๊ฒฐ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ • IP ๋‹ค์ด๋ ‰ํŠธ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ… ๊ธฐ๋Šฅ ์ฐจ๋‹จ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์„œ๋น„์Šค๋‚˜ ๋ถ€ํ˜ธ์กฐํ•ฉ ์ฐจ๋‹จ capcha๋ฅผ ์ด์šฉํ•ด ์ž๋™ํ™”๋œ ์š”์ฒญ ์ฐจ๋‹จ ์•Œ๋งž์€ ํ‘œ์ค€ ์‹œ์Šคํ…œ ๋ณด์•ˆ ๊ด€ํ–‰ํ™” ๋ฏธ๋Ÿฌ ์„œ๋ฒ„ ๋˜๋Š” ๋ณต์ œ ์„œ๋ฒ„์˜ ์‚ฌ์šฉ DoS ๊ณต๊ฒฉ ๋Œ€์‘ ๊ณต๊ฒฉ ์œ ํ˜• ํ™•์ธ : ํŒจํ‚ท ์บก์ฒ˜ ISP๋กœ ํŒจํ‚ท์˜ ํ๋ฆ„์„ ์—ญ์ถ”์  : ๋†’์€ ๋น„์šฉ ๋ฐœ์ƒ ๋น„์ƒ ์‚ฌํƒœ ๊ณ„ํš ๊ตฌํ˜„ ์‚ฌ๊ณ  ๋Œ€์‘ ๊ณ„ํš ์—…๋ฐ์ดํŠธ DNS ์‹ฑํฌํ™€ ์ ์šฉ ์ข€๋น„์™€ C&C ์„œ๋ฒ„์˜ ํ†ต์‹ ์„ ์ฐจ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ• DDoS ๋Œ€ํ”ผ์†Œ ์นจ์ž… ํƒ์ง€์™€ ์นจ์ž… ์ฐจ๋‹จ ์นจ์ž…์ž ์นจ์ž…์ž ์œ ํ˜• ์‚ฌ์ด๋ฒ„ ๋ฒ”์ฃ„์ž ํ•ดํ‚น์ฃผ์˜์ž ์ •๋ถ€ ํ›„์› ์ง‘๋‹จ ๊ธฐํƒ€ ํ–‰๋™ ํŒจํ„ด ๊ณต๊ฒฉ ๋Œ€์ƒ ํฌ์ฐฉ ๋ฐ ์ •๋ณด ์ˆ˜์ง‘ ์ดˆ๊ธฐ ์ ‘์† ๊ถŒํ•œ ์ƒ์Šน ์ •๋ณด ์ˆ˜์ง‘ ๋˜๋Š” ์‹œ์Šคํ…œ ๊ณต๊ฒฉ ์ ‘๊ทผ ๊ด€๋ฆฌ ์ถ”์  ํšŒํ”ผ ์นจ์ž… ํƒ์ง€ ๋ณด์•ˆ ์นจ์ž… : ์นจ์ž…์ž๊ฐ€ ํ—ˆ๊ฐ€ ๊ถŒํ•œ ์—†์ด ์‹œ์Šคํ…œ (๋˜๋Š” ์ž์›)์„ ๋นผ๋‚ด๊ฑฐ๋‚˜ ์•ก์„ธ์Šคํ•˜๋ ค๋Š” ์‹œ๋„๋กœ ๊ตฌ์„ฑ๋œ ์‚ฌ๊ฑด์˜ ์กฐํ•ฉ ์นจ์ž… ํƒ์ง€ : ํ—ˆ๊ฐ€๋˜์ง€ ์•Š์€ ๋ฐฉ์‹์œผ๋กœ ์‹œ์Šคํ…œ ์ž์›์—์„œ์˜ ์ ‘๊ทผ ์‹œ๋„๋ฅผ ๋ฐœ๊ฒฌ ๋ฐ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•Œ๋ ค์ฃผ๋Š” ๋ชฉ์ ์˜ ์‹œ์Šคํ…œ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ณด์•ˆ ์„œ๋น„์Šค ์นจ์ž… ํƒ์ง€ ์‹œ์Šคํ…œ (IDS) ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ IDS ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ IDS ๋ถ„์‚ฐ IDS ๋˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ IDS ๋ถ„์„ ๋ฐฉ๋ฒ• ์ด์ƒ ์ง•ํ›„ ํƒ์ง€ ํ–‰๋™ ๊ธฐ๋ฐ˜ ํƒ์ง€ : ํ–‰๋™ ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ์ง€ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ํƒ์ง€ : ์•Œ๋ ค์ง„ ๊ณต๊ฒฉ ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ์ง€ ์‹œ๊ทธ๋‹ˆ์ฒ˜ ๋ฐฉ์‹ ๋˜๋Š” ํœด๋ฆฌ์Šคํ‹ฑ ๋ฐฉ์‹ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ IDS HIDS ์ทจ์•ฝํ•˜๊ฑฐ๋‚˜ ๋ฏผ๊ฐํ•œ ์‹œ์Šคํ…œ์— ํŠน์ˆ˜ ๋ณด์•ˆ ์†Œํ”„ํŠธ์›จ์–ด ๊ณ„์ธต์„ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ถ”์  ๋กœ๊ทธ ํŒŒ์ผ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐ์‚ฌ ๊ธฐ๋ก : ์‹œ์Šคํ…œ์ด ์ƒ์„ฑํ•˜๋Š” ๋กœ๊ทธ ํŒŒ์ผ ํŠน์ • ๊ฐ์‚ฌ ๊ธฐ๋ก : IDS์— ์˜ํ•ด ์š”๊ตฌ๋œ ์ •๋ณด๋งŒ์„ ๊ธฐ๋กํ•˜๋Š” ์ˆ˜์ง‘ ์‹œ์„ค ํŒŒ์ผ ๋ฌด๊ฒฐ์„ฑ ์ฒดํฌ์„ฌ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์•ก์„ธ์Šค USTAT ์•ก์…˜ vs SunOS ์ด๋ฒคํŠธ ์œ ํ˜• ๋ถ„์‚ฐ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ ์นจ์ž… ํƒ์ง€ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ IDS NIDS ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ์นจ์ž…์„ ํƒ์ง€ NIDS ์„ผ์„œ ๋ฐฐ์น˜ ์ธ๋ผ์ธ ์„ผ์„œ : ๋„คํŠธ์›Œํฌ ์„ธ๊ทธ๋จผํŠธ์— ์‚ฝ์ž…๋˜์–ด ๊ทธ ์„ผ์„œ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ๋งŒ ๊ฐ์ง€ ์ˆ˜๋™ ์„ผ์„œ : ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ ์‚ฌ๋ณธ์„ ๊ฐ์‹œ ์นจ์ž… ํƒ์ง€ ๊ธฐ๋ฒ• ์‹œ๊ทธ๋‹ˆ์ฒ˜ ํƒ์ง€ ์ด์ƒ ์ง•ํ›„ ๊ฐ์ง€ Stateful protocol analysis ํŠธ๋ž˜ํ”ฝ์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜์—ฌ ๋น„์ •์ƒ์ ์ธ ํŠธ๋ž˜ํ”ฝ์„ ํƒ์ง€ ๋ฐฉํ™”๋ฒฝ ๊ธฐ๋Šฅ ์ ‘๊ทผ ํ†ต์ œ ์‚ฌ์šฉ์ž ์ธ์ฆ ๊ฐ์‚ฌ ๋ฐ ๋กœ๊ทธ ๊ธฐ๋Šฅ ์ฃผ์†Œ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ (NAT) ์ข…๋ฅ˜ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฐฉํ™”๋ฒฝ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ ๋ฐฉํ™”๋ฒฝ ํ†ตํ•ฉ ์œ„ํ˜‘ ๊ด€๋ฆฌ (UTM) ๋ฐฉํ™”๋ฒฝ, IDS, IPS, ๋ฐฑ์‹  ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ์†”๋ฃจ์…˜์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•œ ์žฅ๋น„ ํŽธ์˜์„ฑ์ด ๋†’๊ณ  ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์Œ ํ—ˆ๋‹ˆํŒŸ ๊ณต๊ฒฉ์ž์˜ ๊ณต๊ฒฉ์„ ์œ ๋„ํ•˜์—ฌ ๊ณต๊ฒฉ์ž์˜ ํ–‰๋™์„ ๋ถ„์„ํ•˜๋Š” ์‹œ์Šคํ…œ ์Šค๋…ธํŠธ ํ˜ธ์ŠคํŠธ ๋˜๋Š” ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ์†Œ์Šค IDS ํŒจํ‚ท ๋””์ฝ”๋” : ํ”„๋กœํ† ์ฝœ ํ—ค๋” ์‹๋ณ„ ๋ฐ ๊ฒฉ๋ฆฌ ํƒ์ง€ ์—”์ง„ : ๊ทœ์น™ ์ง‘ํ•ฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ ํŒจํ‚ท์„ ๋ถ„์„ ๋กœ๊ฑฐ : ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐ ํŒจํ‚ท์„ ์†Œํ˜•์œผ๋กœ ์ €์žฅ ๊ฒฝ๊ณ  : ํƒ์ง€๋œ ํŒจํ‚ท์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ๋ฅผ ๋ณด๋ƒ„ SSL/TLS/VPN SSL์˜ ๊ธฐ๋ณธ ๊ฐœ๋… SSL/TLS ํ”„๋กœํ† ์ฝœ ๊ตฌ์„ฑ Handshake Layer : Handshake, Cipher spec ๋ณ€๊ฒฝ, Alert ํ”„๋กœํ† ์ฝœ๋กœ ๊ตฌ์„ฑ Record Layer : ๋‹จํŽธํ™”, ์••์ถ•, ๋ฌด๊ฒฐ์„ฑ, ์•”ํ˜ธํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Record ํ”„๋กœํ† ์ฝœ๋กœ ๊ตฌ์„ฑ SSL/TLS Handshake client->server hello server->client hello certificate : ์„œ๋ฒ„ ์ธ์ฆ์„œ server key exchange : ์„œ๋ฒ„ ํ‚ค ๊ตํ™˜ certificate_request : ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ์š”์ฒญ (์„ ํƒ) hello done client->server certificate : ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ (์„ ํƒ) client key exchange : ํด๋ผ์ด์–ธํŠธ ํ‚ค ๊ตํ™˜ certificate_verify : ์„œ๋ฒ„ ์ธ์ฆ์„œ ๊ฒ€์ฆ (์„ ํƒ) change cipher spec finished server->client change cipher spec finished Change Cipher Spec Protocol ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์ƒˆ๋กœ์šด ์•”ํ˜ธํ™” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ Alert Protocol ์˜ค๋ฅ˜ ๋ฐœ์ƒ์‹œ ์ƒ๋Œ€๋ฐฉ์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ํ†ต๋ณดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๊ฒฝ๊ณ ์™€ ์‹ฌ๊ฐ์œผ๋กœ ๋ถ„๋ฅ˜, ์‹ฌ๊ฐ์˜ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ ์ข…๋ฃŒ Record Protocol ๋™์ž‘๊ณผ์ • : ๋‹จํŽธํ™” -> ์••์ถ•(์„ ํƒ) -> MAC ์ฒจ๋ถ€ -> ์•”ํ˜ธํ™” -> SSL ๋ ˆ์ฝ”๋“œ ํ—ค๋” ๋ถ™์ด๊ธฐ MAC : ํ‚ค ๊ณต์œ ๊ณผ์ •์—์„œ ๋„์ถœ๋œ ๋น„๋ฐ€ํ‚ค ์‚ฌ์šฉ ์•”ํ˜ธํ™” : ์••์ถ•๋œ ๋ฉ”์‹œ์ง€์™€ MAC์„ ๋Œ€์นญ ์•”ํ˜ธ๋กœ ์•”ํ˜ธํ™” SSL vs TLS Handshake์—์„œ์˜ ์ฐจ์ด์  TLS๋กœ ๋ฐœ์ „ํ•˜๋ฉด์„œ Handshake ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค„์ž„ ์‚ฌ์šฉํ•˜๋Š” ์ด ์•”ํ˜ธ ๊ทธ๋ฃน ์ˆ˜๋ฅผ ์ค„์—ฌ ํ”„๋กœ์„ธ์Šค ์†๋„๋ฅผ ํ–ฅ์ƒ Alert์—์„œ์˜ ์ฐจ์ด์  ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€ ์œ ํ˜•์ด ์ถ”๊ฐ€๋จ TLS Alert๋Š” ๋ณด์•ˆ์„ ์œ„ํ•ด ์•”ํ˜ธํ™”๋˜์–ด ์ „์†ก๋จ ๋ฉ”์‹œ์ง€ ์ธ์ฆ์—์„œ์˜ ์ฐจ์ด์  SSL์€ MAC์„ ์‚ฌ์šฉ, TLS๋Š” HMAC์„ ์‚ฌ์šฉ Cipher suite์—์„œ์˜ ์ฐจ์ด์  ์ทจ์•ฝํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(RC4, DES) ์‚ฌ์šฉ ์ค‘๋‹จ ์‹ ๊ทœ ํ‚ค ๊ตํ™˜, ๊ฒ€์ฆ, ์•”ํ˜ธํ™”, MAC ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ์šฉ TLS๋Š” ๋ฒ„์ „ ๋ณ„๋กœ ์ง€์›ํ•˜๋Š” Cipher suite๊ฐ€ ๋‹ค๋ฆ„ SSL/TLS ํ™œ์šฉ TLS ์„œ๋ฒ„ ๊ตฌ์ถ• ๋ฐฉ๋ฒ• ํ‚ค์Œ ์ƒ์„ฑ ์ƒ์„ฑํ•œ ๊ณต๊ฐœํ‚ค๋ฅผ ๋„ฃ์–ด์„œ CSR ์ƒ์„ฑ, ๊ฐœ์ธํ‚ค๋กœ ์ „์ž ์„œ๋ช… CSR์„ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰๊ธฐ๊ด€์— ์ „์†ก ์ธ์ฆ์„œ ๋ฐœ๊ธ‰๊ธฐ๊ด€์€ CSR์˜ ์ „์ž ์„œ๋ช…์„ CSR์— ํฌํ•จ๋œ ๊ณต๊ฐœํ‚ค๋กœ ์„œ๋ช… ๊ฒ€์ฆ ์‚ฌ์šฉ์ž์˜ ๊ณต๊ฐœํ‚ค์™€ ์ถ”๊ฐ€์ •๋ณด(๋„๋ฉ”์ธ, ์ด๋ฉ”์ผ ๋“ฑ)๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์›น์„œ๋ฒ„์— ์ ์šฉ SSL/TLS ์„œ๋ฒ„์˜ ๋ณด์•ˆ ๊ฐ•ํ™” HSTS (HTTP Strict Transport Security) HTTPS๋กœ๋งŒ ํ†ต์‹ ํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๊ธฐ์ˆ  ํ—ค๋”์— Strict-Transport-Security๋ฅผ ์„ค์ • max-age ๊ธฐ๊ฐ„๋™์•ˆ ์ž๋™ ์ ์šฉ SSL/TLS ์ทจ์•ฝ์  TLSv1.2์ด์ „์˜ ํ”„๋กœํ† ์ฝœ์€ ์ทจ์•ฝ์ ์ด ์กด์žฌ POODLE (Padding Oracle On Downgraded Legacy Encryption) ๋ธ”๋ก ์•”ํ˜ธํ™” ๊ธฐ๋ฒ•์ธ CBC ๋ชจ๋“œ ์‚ฌ์šฉ์‹œ ์•”ํ˜ธ๋ฌธ์ด MAC์— ์˜ํ•ด ๋ณดํ˜ธ๋˜์ง€ ์•Š๋Š” ์ทจ์•ฝ์  DROWN (Decrypting RSA with Obsolete and Weakened eNcryption) ๊ณต๊ฒฉ์ž๊ฐ€ SSLv2 proves๋ฅผ ์†ก์‹ ํ•˜์—ฌ ํ‚ค๋ฅผ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์  BEAST (Browser Exploit Against SSL/TLS) CBC์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•ด HTTPS ์ฟ ํ‚ค๋ฅผ ํ•ด๋…ํ•  ์ˆ˜ ์žˆ๋Š” ์ทจ์•ฝ์  FREAK (Factoring RSA Export Keys) SSL ์„œ๋ฒ„๊ฐ€ ๊ณต๊ฒฉ์— ์˜ํ•ด ์ˆ˜์ถœ์šฉ RSA๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ์‹œํ‚จํ›„ Brute-force๋กœ ํ‚ค๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์ทจ์•ฝ์  Logjam SSL ์„œ๋ฒ„๊ฐ€ ๊ณต๊ฒฉ์— ์˜ํ•ด ์ˆ˜์ถœ์šฉ DHE๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ์‹œํ‚จํ›„ Brute-force๋กœ ํ‚ค๋ฅผ ์ฐพ์•„๋‚ด๋Š” ์ทจ์•ฝ์  Heartbleed OpenSSL 1.0.1์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ทจ์•ฝ์  ์ทจ์•ฝ์  ๋Œ€์‘ ์„œ๋ฒ„ ๊ด€๋ฆฌ์ž : ์ทจ์•ฝํ•œ ํ”„๋กœํ† ์ฝœ, Cipher suite๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •, ์ฒ ์ €ํ•œ ๋น„๋ฐ€ํ‚ค ๊ด€๋ฆฌ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž : ์ตœ์‹  ๋ฒ„์ „์˜ ๋ธŒ๋ผ์šฐ์ € ์œ ์ง€, ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ ํ™•์ธ, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ ์ž์ œ ๊ณตํ†ต : ์ตœ์‹  SLS/TLS ํ”„๋กœํ† ์ฝœ ์†Œํ”„ํŠธ์›จ์–ด ์‚ฌ์šฉ HTTPS ํŒจํ‚ท ์ฐจ๋‹จ ๊ธฐ์ˆ  ๋ฐ ์ด์Šˆ DNS ์„œ๋ฒ„ ์‘๋‹ต ๋ณ€์กฐ ๋ฐ IP ์ฐจ๋‹จ DNS ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ๋ณ€์กฐํ•˜์—ฌ HTTPS ์ ‘์†์„ ์ฐจ๋‹จํ•˜๋Š” ๊ธฐ์ˆ  CDN ์„œ๋ฒ„ ๊ฒฝ์œ ๋ฅผ ํ†ตํ•ด ์šฐํšŒํ•˜๋Š” ์‚ฌ๋ก€๊ฐ€ ๋“ฑ์žฅ -> ํŒจํ‚ท ๋ถ„์„ ๊ธฐ๋ฐ˜ ์ฐจ๋‹จ ํŒจํ‚ท ๋ถ„์„ ๊ธฐ๋ฐ˜ ์ฐจ๋‹จ ํŒจํ‚ท์„ ๋ถ„์„ํ•˜์—ฌ HTTPS ํŒจํ‚ท์„ ์ฐจ๋‹จํ•˜๋Š” ๊ธฐ์ˆ  DPI (Deep Packet Inspection) : ํŒจํ‚ท์˜ ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ฐจ๋‹จ HTTPS SNI ๊ธฐ๋ฐ˜ ์ฐจ๋‹จ TLS ํ†ต์‹  ํ‘œ์ค€์„ ์—ญ์ด์šฉํ•œ ์ฐจ๋‹จ ๋ฐฉ๋ฒ• SNI๋Š” Client Hello ๋‹จ๊ณ„์—์„œ ํ‰๋ฌธ์œผ๋กœ ์ „์†ก๋œ๋‹ค๋Š” ํŠน์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์ฐจ๋‹จ TLS ์•…์šฉ๊ณผ ๋Œ€์‘ ๊ธฐ์ˆ  ์•…์šฉ์‚ฌ๋ก€ ์ •๋ณด ์œ ์ถœ ๊ฒฝ๋กœ๋กœ์˜ ์•…์šฉ SSL/TLS ๊ธฐ์ˆ ์„ ์—ญ์ด์šฉํ•˜์—ฌ ๋‚ด๋ถ€ ์ •๋ณด ์œ ์ถœ ์‹œ ๋‚ด์šฉ์„ ์•Œ ์ˆ˜ ์—†๋„๋ก ํ•จ ์•…์„ฑ ์ฝ”๋“œ ์œ ์ž… ํ†ต๋กœ๋กœ์˜ ์•…์šฉ SSL/TLS ๊ธฐ์ˆ ์„ ์ด์šฉํ•˜์—ฌ ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์œ ํฌํ•˜๋Š” ํ†ต๋กœ๋กœ ์‚ฌ์šฉ ๋Œ€์‘ ๊ธฐ์ˆ  TLS ๊ฐ€์‹œ์„ฑ ํ™•๋ณด ๊ธฐ์ˆ  SSL/TLS์„ ๋ณตํ˜ธํ™” ํ•ด ๊ฐ€์‹œ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๊ธฐ์ˆ  TLS Fingering ๊ธฐ์ˆ  TLS Handshake ๋ฐ ํŠธ๋ž˜ํ”ฝ์—์„œ ํŠน์ง•์„ ์ถ”์ถœํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋ฒ„๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ธฐ์ˆ  ๋ฉ”์‹œ์ง€๋ฅผ ์ฑ„์ทจ -> ํ•„๋“œ ์ถ”์ถœ -> ์ง€๋ฌธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ -> ์ €์žฅ ๋ฐ ๋น„๊ต ๊ธฐ๋ฒ• ์‚ฌ์šฉ ์˜ˆ์‹œ : JA3, ์ธ๊ณต์ง€๋Šฅ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ  IPSec IP ํŒจํ‚ท์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ IPSec ๊ฐœ์š” ์ œ๊ณต : ์ธ์ฆ, ๊ธฐ๋ฐ€์„ฑ, ํ‚ค ๊ด€๋ฆฌ ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ ์ „์†ก ๋ชจ๋“œ : ํŽ˜์ด๋กœ๋“œ๋งŒ ์•”ํ˜ธํ™” ํ„ฐ๋„ ๋ชจ๋“œ : ํ—ค๋”์™€ ํŽ˜์ด๋กœ๋“œ ๋ชจ๋‘ ์•”ํ˜ธํ™” ํ”„๋กœํ† ์ฝœ AH(Authentication Header) ์ œ๊ณต : ์ธ์ฆ, ๋ฌด๊ฒฐ์„ฑ ESP(Encapsulating Security Payload) ์ œ๊ณต : ์ธ์ฆ, ๊ธฐ๋ฐ€์„ฑ, ๋ฌด๊ฒฐ์„ฑ ESP ๋‹จ๋… ์‚ฌ์šฉ ๋˜๋Š” ESP+AH ์‚ฌ์šฉ(ํ„ฐ๋„๋ชจ๋“œ) IKE (Internet Key Exchange)
new ์›น ๋ณด์•ˆ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
Web Security Model Web ๋ณด์•ˆ์˜ ๋ชฉํ‘œ Integirty : ๋ฌด๊ฒฐ์„ฑ Confidentiality : ๊ธฐ๋ฐ€์„ฑ HTTP URL https:// www.example.edu :80 /lectures ?lec=80 #slides protocol + hostname + port + path + query + fragment Cookies ์„œ๋ฒ„๊ฐ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ณด๋‚ด๋Š” ์ •๋ณด ์—ญํ•  : ์„ธ์…˜ ๊ด€๋ฆฌ, ์‚ฌ์šฉ์ž ์„ค์ • ์ €์žฅ, ์‚ฌ์šฉ์ž ์ถ”์  ๋“ฑ 1// ์ฟ ํ‚ค ์„ค์ • 2Set-Cookie: name=value; 3// ์ฟ ํ‚ค ์ „์†ก 4Cookie: name=value; Same Origin Policy (SOP) ๊ฐ™์€ Origin์—์„œ๋งŒ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค Origin scheme://domain:port Domain Relaxation ์„œ๋ธŒ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  document.domain์„ ์ˆ˜์ •ํ•˜์—ฌ, ์„œ๋ธŒ ๋„๋ฉ”์ธ ๊ฐ„์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  ๊ฐ€๋Šฅ ์˜ˆ์‹œ 1a.domain.com -> domain.com ๊ฐ€๋Šฅ 2a.domain.com -> b.domain.com ๋ถˆ๊ฐ€๋Šฅ 3a.domain.com -> com ๋ถˆ๊ฐ€๋Šฅ ์ทจ์•ฝ์  : ์•…์˜์ ์ธ ์‚ฌ์ดํŠธ๊ฐ€ document.domain์„ ์ˆ˜์ •ํ•˜์—ฌ ์ ‘๊ทผ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : Mozilla Public Suffix List (PSL) ์‚ฌ์šฉ BroadcastChannel API ๊ฐ™์€ origin์˜ ๋‹ค๋ฅธ context ๊ฐ„์˜ ํ†ต์‹  ์‚ฌ์šฉ๋ฒ• 1const bc = new BroadcastChannel('channel'); 2bc.postMessage('message'); 3bc.onmessage = (e) => console.log(e.data); XMLHttpRequest (XHR) ์„œ๋ฒ„์™€ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ฐ์ฒด CORS (Cross-Origin Resource Sharing) ๋‹ค๋ฅธ Origin์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•  ๋•Œ, ์„œ๋ฒ„์—์„œ ํ—ˆ์šฉํ•˜๋Š” ์ •์ฑ… Cookie ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ด๋Š” ์ •๋ณด Cookie Scoping Domain ํ•ด๋‹น ๋„๋ฉ”์ธ์€ Subdomain ๋˜๋Š” Parent Domain์— ๋Œ€ํ•ด์„œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†ก Path ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ํ•˜์œ„ ๊ฒฝ๋กœ๊นŒ์ง€ ์ฟ ํ‚ค๋ฅผ ์ „์†ก Secure Cookies HTTPS ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†ก 1Set-Cookie: name=value; Secure HTTPOnly Cookies JavaScript์—์„œ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ํ•จ 1Set-Cookie: name=value; HttpOnly CSRF (Cross Site Request Forgery) ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์—์„œ ์š”์ฒญ์„ ์œ„์กฐํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ๋ฐฐ๊ฒฝ ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ๋ผ๋ฉด, ์‚ฌ์šฉ์ž๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฟ ํ‚ค์™€ ํ•จ๊ป˜ ์š”์ฒญ์„ ์ „์†ก cross-site์—์„œ๋„ ์ฟ ํ‚ค์™€ ํ•จ๊ป˜ ์š”์ฒญ์„ ๋ณด๋ƒˆ์„๋•Œ, ์„œ๋ฒ„๊ฐ€ same-site์ธ์ง€ cross-site์ธ์ง€ ํ™•์ธ์ด ๋ถˆ๊ฐ€ํ•œ ๊ฒฝ์šฐ CSRF ๊ณต๊ฒฉ ๊ฐ€๋Šฅ ์˜ˆ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค ํ”ผํ•ด์ž๊ฐ€ ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ๋กœ Malicious Site์— ์ ‘์† Malicious site์—์„œ ํ”ผํ•ด์ž ์˜์ง€์™€ ์ƒ๊ด€์—†์ด ์ฟ ํ‚ค์™€ ํ•จ๊ป˜ ์š”์ฒญ์„ ์ „์†ก GET ์˜ˆ์‹œ ์ฝ”๋“œ 1<img src="http://bank.com/transfer?to=attacker&amount=1000" /> POST ์˜ˆ์‹œ ์ฝ”๋“œ 1<form action="http://bank.com/transfer" method="post"> 2 <input type="hidden" name="to" value="attacker" /> 3 <input type="hidden" name="amount" value="1000" /> 4</form> 5<script> 6 document.forms[0].submit(); 7</script> ๋ฐฉ์–ด Referer Header ์š”์ฒญ์„ ๋ณด๋‚ธ ํŽ˜์ด์ง€์˜ ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” HTTP header๋ฅผ ํ™•์ธํ•˜์—ฌ, ์š”์ฒญ์„ ๋ณด๋‚ธ ํŽ˜์ด์ง€๊ฐ€ ๊ฐ™์€ ์‚ฌ์ดํŠธ์ธ์ง€ ํ™•์ธ 1Referer: http://www.example.com ํ•œ๊ณ„ ํ•ด๋‹น field๋ฅผ ์ด์šฉํ•ด์„œ ์ ‘์† ๊ธฐ๋ก์„ ํ™•์ธ ๊ฐ€๋Šฅ -> ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฌธ์ œ Same-Site Cookies ์„œ๋ฒ„๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•  ๋•Œ, SameSite๋ผ๋Š” ์ฟ ํ‚ค ์†์„ฑ๋ฅผ ์ „์†ก, same-site์ธ์ง€ cross-site์ธ์ง€ ํ™•์ธํ•˜์—ฌ, ์„ค์ •๊ฐ’์— ๋”ฐ๋ผ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜์ง€ ์•Š์Œ ์„ค์ • ๊ฐ’ None (๋ชจ๋“  ์š”์ฒญ์— ์ฟ ํ‚ค ์ „์†ก) Strict (cross-site๋Š” ํ•ญ์ƒ ์ฟ ํ‚ค ์ „์†กํ•˜์ง€ ์•Š์Œ) Lax (cross-site๋Š” GET ์š”์ฒญ์‹œ์—๋งŒ ์ฟ ํ‚ค ์ „์†กํ•˜์ง€ ์•Š์Œ) Secret Token ํŠน์ • origin์˜ ์ฒซ ์š”์ฒญ๋•Œ, ํŠน์ •ํ•œ ํ† ํฐ์„ ์ƒ์„ฑ, ์ดํ›„ ์š”์ฒญ์‹œ ํ•ด๋‹น ํ† ํฐ์„ ํ•จ๊ป˜ ์ „์†กํ•˜์—ฌ, ์š”์ฒญ์ด ๊ฐ™์€ Origin์—์„œ ์˜จ ๊ฒƒ์ธ์ง€ ํ™•์ธ Bypassing with Clickjacking ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ํด๋ฆญ์„ ์œ ๋„ํ•˜์—ฌ, CSRF ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ• ๋ฐฉ์–ด X-Frame-Options Header (๊ฐ’ : DENY, SAMEORIGIN, ALLOW-FROM uri) ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ XSS(Cross Site Scripting) Attack Non-persistent (Reflected) XSS Attack ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•˜์—ฌ, ๊ณต๊ฒฉ์ž๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ query string์„ ์‹คํ–‰ํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌ (innerHTML) ํ”ผํ•ด์ž๊ฐ€ ํ•ด๋‹น ๋งํฌ๋ฅผ ์‹คํ–‰ => http://www.example.com/search?input=<script>alert(โ€œattackโ€);</script> ํ”ผํ•ด์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ alert๊ฐ€ ์‹คํ–‰๋จ Persistent (Stored) XSS Attack ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ DB์— ์ €์žฅํ•˜์—ฌ, ๊ณต๊ฒฉ์ž๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ ๊ฒŒ์‹œํŒ์— ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌ ํ”ผํ•ด์ž๊ฐ€ ํ•ด๋‹น ํŽ˜์ด์ง€์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๊ธ€์„ ์ž‘์„ฑ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๊ธ€์„ ์ฝ์„ ๋•Œ, ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋จ XSS๋กœ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ํ”ผํ•ด Web defacing(์›นํŽ˜์ด์ง€ ๋ณ€์กฐ) Spoofing requests(์‚ฌ์šฉ์ž์˜ ์š”์ฒญ ๋ณ€์กฐ) Stealing information(์ •๋ณด ํƒˆ์ทจ) Self-Propagation XSS Worm XSS ๊ณต๊ฒฉ์„ ํ†ตํ•ด, ์ž๋™์œผ๋กœ ๊ณต๊ฒฉ์„ ์ „ํŒŒํ•˜๋Š” ๊ธฐ๋ฒ• 2๊ฐ€์ง€ ์ ‘๊ทผ DOM Approach 1let jsCode = document.getElementById('worm').innerHTML; Link Approach 1let jsCode = `'<script src="http://www.example.com/worm.js"></script>'`; ๋ฐฉ์–ด ์ž…๋ ฅ๊ฐ’ ํ•„ํ„ฐ๋ง : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ํ•„ํ„ฐ๋งํ•˜์—ฌ, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค Encoding : ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์ถœ๋ ฅํ•  ๋•Œ, HTML Encodingํ•˜์—ฌ, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค Content Security Policy (CSP) : ์›นํŽ˜์ด์ง€์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œํ•œํ•˜์—ฌ, XSS ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•œ๋‹ค ์˜ˆ์‹œ (script ํŒŒ์ผ) 1Content-Security-Policy: script-src 'self' example.com ์˜ˆ์‹œ (inline script) 1Content-Security-Policy: script-src 'nonce-2726c7f26c' 2// allowed script 3`<script nonce=2726c7f26c> ... </script>` 4// not allowed script 5`<script nonce=42eh44jhad> ... </script>` SQL Injection SQL ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ, DB์— ๋Œ€ํ•œ ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ EID์— “EID5002’#“์„ ์‚ฝ์ž… -> PASSWORD ๊ฒ€์ฆ์„ ์šฐ์ฆ 1SELECT NAME, SALERY, SSN 2FROM EMPLOYEE 3WHERE EID='EID5002'#' AND PASSWORD='1234'; curl์„ ์ด์šฉํ•ด์„œ SQL Injection ๊ณต๊ฒฉ 1curl 'www.example.com/getdata.php?EID=a' OR 1=1&PASSWORD=' ๋ฐฉ์–ด Filtering and Encoding data SQL Injection์—์„œ ์“ฐ์ด๋Š” ํŠน์ˆ˜๋ฌธ์ž๋ฅผ Filtering, Encoding 1$mysqli->real_escape_string($input); ํ•œ๊ณ„ ํ•„์š”ํ•œ ๋ฌธ์ž์—ด์„ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Œ Prepared Statements SQL ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•˜์—ฌ, ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์„ ์‚ฝ์ž…ํ•˜์ง€ ์•Š๊ณ , ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ 1$stmt = $mysqli->prepare("SELECT NAME, SALARY, SSN FROM EMPLOYEE WHERE EID=? AND PASSWORD=?"); 2// ss means "string string" 3$stmt->bind_param("ss", $EID, $PASSWORD); 4$stmt->execute(); Blind SQL Injection SQL Injection ๊ณต๊ฒฉ์„ ํ†ตํ•ด, DB์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•˜๋Š” ๊ธฐ๋ฒ• Conditional Response 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฐ์ง€ ํ™•์ธ */ 2xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 'm 3/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 't'๋ณด๋‹ค ํฐ์ง€ ํ™•์ธ */ 4xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 't SQL Error - Divide by Zero 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ */ 2xyz' AND (SELECT CASE WHEN (Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 3'm') THEN 1/0 ELSE 'a' END FROM Users)='a SQL Error - Cast 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฌ๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ */ 2CAST((SELECT example_column FROM example_table) AS int) Time Delay 1/* Password์˜ ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ 'm'๋ณด๋‹ค ํฌ๋ฉด ๋”œ๋ ˆ์ด ๋ฐœ์ƒ */ 2'; IF (SELECT COUNT(Username) FROM Users WHERE Username = 'Administrator' AND 3SUBSTRING(Password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'- ShellShock Attack bash ์‰˜์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• Set-UID Programs Set-UID root ๊ถŒํ•œ์„ ๊ฐ€์ง„ ํ”„๋กœ๊ทธ๋žจ์ด systemํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• RUID : Real User ID : ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ EUID : Effective User ID : ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๊ถŒํ•œ Set-UID Program : ์‚ฌ์šฉ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ root ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ, RUID์™€ EUID๊ฐ€ ๋‹ค๋ฆ„, Set-UID Program์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 1$ sudo chown root vul 2$ sudo chmod 4755 vul 3$ ls -l vul 4-rwsr-xr-x 1 root root 1234 Mar 11 12:00 vul # s๊ฐ€ ์กด์žฌ ์ทจ์•ฝํ•œ C ํ”„๋กœ๊ทธ๋žจ (vul : Set-UID program) 1#include <stdio.h> 2void main() { 3 setuid(geteuid()); // root ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋กœ ์„ค์ • 4 system("/bin/ls -l"); // ls -l ๋ช…๋ น์–ด ์‹คํ–‰ 5} ๊ณต๊ฒฉ ๋ช…๋ น์–ด 1$ export foo='() { echo "hello"; }; /bin/sh' 2$ ./vul CGI(Common Gateway Interface) Programs ์›น ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” CGI ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ทจ์•ฝ์  ์ทจ์•ฝํ•œ CGI ํ”„๋กœ๊ทธ๋žจ (test.cgi) 1#!/bin/bash 2echo "Content-type: text/plain" 3echo 4echo "Hello, World!" ๊ณต๊ฒฉ ๋ช…๋ น์–ด 1$ curl http://10.0.2.69/cgi-bin/test.cgi 2Hello, World! ๊ณต๊ฒฉ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ์„ค์ • ํŒŒ์ผ์— ํ•˜๋“œ์ฝ”๋”ฉ๋œ db password ํƒˆ์ทจ reverse shell ์‹คํ–‰ Environment Variables & Attacks ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ• fork() : ์ž์‹์„ ์ƒ์„ฑ, ์ž์‹์ด ๋ถ€๋ชจ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ƒ์† execve() : ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์ž์‹์œผ๋กœ ์‹คํ–‰, ์ƒˆ๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ • Attacks via Dynamic Linker ๋งํฌ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์›๋ฆฌ LD_PRELOAD๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ชฉ๋ก์„ ์ €์žฅ ํ•จ์ˆ˜๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด, LD_LIBRARY_PATH์—์„œ ์ฐพ์Œ ๋‘ ๋ณ€์ˆ˜๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ๋งํฌ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์กฐ์ž‘ ์˜ˆ์‹œ 1$ export LD_PRELOAD=/path/to/malicious.so 2$ ./vul Attacks via Execution Program ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์„ ์กฐ์ž‘ํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• ์˜ˆ์‹œ 1$ export PATH=/path/to/malicious:$PATH 2$ ./vul 3# // root shell ์ทจ๋“ Attacks via Library format string ๋“ฑ์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• Attacks via Application Code buffer overflow ๋“ฑ์˜ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• Set-UID Approach VS Service Approach Clickjacking Attack ์‚ฌ์šฉ์ž์˜ ์˜๋„์™€ ์ƒ๊ด€์—†์ด ํด๋ฆญ์„ ์œ ๋„ํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• 1<iframe id="top" src="http://www.attack.com" style="opacity: 0"></iframe> 2<iframe id="bottom" src="http://www.example.com>" style="opacity: 1"></iframe> ๋ฐฉ์–ด Client-side (Framekiller and Framebuster) javascript๋ฅผ ์ด์šฉํ•˜์—ฌ, ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ iframe์œผ๋กœ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ 1if (top != self) 2if (top.location != self.location) 3... ํ•œ๊ณ„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋งŽ์•„์„œ ๋ถˆ์•ˆ์ • -> ์ž˜ ์“ฐ์ง€ ์•Š๋Š”๋‹ค ์šฐํšŒ Double framing : ๋‘๊ฐœ์˜ iframe์„ ์‚ฌ์šฉํ•˜์—ฌ, ์ฒซ๋ฒˆ์งธ iframe์„ ์ˆจ๊ธฐ๊ณ , ๋‘๋ฒˆ์งธ iframe์„ ๋ณด์—ฌ์คŒ Abusing onBeforeUnload : ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚  ๋•Œ, alert์„ ๋„์›Œ์„œ, ์‚ฌ์šฉ์ž์˜ ํด๋ฆญ์„ ์œ ๋„ sandbox attribute : iframe์— sandbox attribute๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ํ•ด๋‹น iframe์—์„œ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•จ options allow-same-origin allow-scripts allow-forms allow-modals allow-top-navigation ์˜ˆ์‹œ 1<iframe ... sandbox="allow_forms allow-scripts"></iframe> Referrer checking problems Referer๋ฅผ ํ™•์ธํ•˜์—ฌ ํŠน์ • ๋„๋ฉ”์ธ์˜ ์‚ฌ์ดํŠธ๋งŒ iframe์œผ๋กœ ๋ Œ๋”๋ง๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ•œ๊ณ„ : Referer๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ์šฐํšŒ ๊ฐ€๋Šฅ Server-side X-Frame-Options ํŠน์ • ORIGIN ํŽ˜์ด์ง€์—์„œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ ์˜ˆ์‹œ 1X-Frame-Options: DENY // ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Œ 2X-Frame-Options: SAMEORIGIN // ๊ฐ™์€ ORIGIN ํŽ˜์ด์ง€์—์„œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋ง 3X-Frame-Options: ALLOW-FROM uri // ํŠน์ • uri์—์„œ๋งŒ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ iframe์œผ๋กœ ๋ Œ๋”๋ง Outdated : CSP ์‚ฌ์šฉ ๊ถŒ์žฅ Content Security Policy (CSP) ์›นํŽ˜์ด์ง€์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œํ•œ script-src : ์Šคํฌ๋ฆฝํŠธ source๋ฅผ ์ œํ•œ img-src : ์ด๋ฏธ์ง€์˜ source๋ฅผ ์ œํ•œ frame-ancestors : <frame>, <iframe>, <object>, <embed> ๋˜๋Š” <applet> ์š”์†Œ์˜ ๋ถ€๋ชจ๋ฅผ ์ œํ•œ ์˜ˆ์‹œ 1$csp = "Content-Security-Policy: frame-ancestors *"; 2header($csp); Types of Context Integrity Visual Integrity ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด์— ๋Œ€ํ•œ ๋ฌด๊ฒฐ์„ฑ ๋ฐฉ์–ด๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ• : User Confirmation, UI Randomization, Visibility Detection on Click Temporary Integrity ์‚ฌ์šฉ์ž ํ™•์ธ ์‹œ์ ๊ณผ ํด๋ฆญ ์‹œ์ž‘ ์‹œ์  ์‚ฌ์ด์˜ UI ์ƒํƒœ ์ฐจ์ด์— ๋Œ€ํ•œ ๋ฌด๊ฒฐ์„ฑ ๋ฐฉ์–ด๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ• : Access Control Gadgets SSRF (Server Side Request Forgery) ์„œ๋ฒ„์—์„œ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ• ๊ณต๊ฒฉ (์„œ๋ฒ„๊ฐ€ ์‹ ๋ขฐ๋œ ์„œ๋ฒ„์—์„œ ์š”์ฒญ์ด ์˜จ ๊ฒƒ์œผ๋กœ ์ฐฉ๊ฐ) 1POST /product/stock HTTP/1.0 2Content-Type: application/www-form-urlencoded 3Content-Length: 30 4 5stockApi=http://localhost/admin ๋ฐฉ์–ด ์ฐจ๋‹จ๋œ ๋ฌธ์ž์—ด์„ URL ์ธ์ฝ”๋”ฉ ๋˜๋Š” ๋Œ€์†Œ๋ฌธ์ž ๋ณ€ํ˜•์„ ํ†ตํ•ด ์ˆจ๊น€ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ, ์š”์ฒญ์„ ๋ณด๋ƒ„ using @ 1https://expected-host:fakepassword@evil-host using # 1https://evil-host#expected-host Rogue DNS 1https://expected-host.evil-host Double encoding : # -> %23 -> %2523 XXE (XML eXternal Entity) Injection XML ํŒŒ์‹ฑ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์„ ์ด์šฉํ•˜์—ฌ, ๊ณต๊ฒฉํ•˜๋Š” ๊ธฐ๋ฒ• XML custom entity XML์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด์„ ์ •์˜ 1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE message [<!ENTITY greeting "Hello, ">]> 3<message> 4 <text>&greeting;world!</text> 5</message> Access internal file XML ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ, ์„œ๋ฒ„์˜ ํŒŒ์ผ์„ ์ฝ์–ด์˜ค๋Š” ๊ณต๊ฒฉ 1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE foo[<!ENTITY xxe SYSTEM "file:///etc/passwd">]> 3<stockCheck><productId>&xxe;</productId></stockCheck> With SSRF SSRF์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ์™ธ๋ถ€ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ณต๊ฒฉ 1<!DOCTYPE foo[<!ENTITY xxe SYSTEM "http://localhost/admin">]> ์•”ํ˜ธ๊ธฐ์ˆ  ์ „ํ†ต์ ์ธ ์•”ํ˜ธ๊ธฐ์ˆ  ์•”ํ˜ธ์˜ ์ •์˜ ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์  ๊ธฐ๋ฐ€์„ฑ (Confidentiality) : ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์•„์•ผํ•จ ์ž๋ฃŒ์˜ ๋ฌด๊ฒฐ์„ฑ (Data Integrity) : ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„๋ณ€์กฐ๋˜๋ฉด ์•ˆ๋จ ์ธ์ฆ (Authentication) : ์ •๋ณด์˜ ์ถœ์ฒ˜๊ฐ€ ์ •๋‹นํ•ด์•ผํ•จ ๋ถ€์ธ๋ฐฉ์ง€ (Non-repudiation) : ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜์ง€ ์•Š์•„์•ผํ•จ ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ธฐ๋ณธ ์กฐ๊ฑด (K : Key, M : Message, C : Cipher Text) ์•”ํ˜ธํ™” : E(K, M) = C ๋ณตํ˜ธํ™” : D(K, C) = C E(K, M)๊ณผ D(K, C)์˜ ๊ณ„์‚ฐ์€ ์‰ฌ์›Œ์•ผ ํ•จ K๋ฅผ ๋ชจ๋ฅผ๋•Œ C์—์„œ M์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์›Œ์•ผ ํ•จ ์•”ํ˜ธ ํ•ด๋… ๋ฐฉ๋ฒ• Cipher Text Only Attack : ์•”ํ˜ธ๋ฌธ๋งŒ์„ ์ด์šฉํ•˜์—ฌ ํ‰๋ฌธ์„ ์ฐพ๋Š” ๊ณต๊ฒฉ Known Plain Text Attack : ์•”ํ˜ธ๋ฌธ๊ณผ ํ‰๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ํ‚ค๋ฅผ ์ฐพ๋Š” ๊ณต๊ฒฉ Chosen Plain Text Attack : ํ‰๋ฌธ์„ ์„ ํƒํ•˜์—ฌ ์•”ํ˜ธ๋ฌธ์„ ์ฐพ๋Š” ๊ณต๊ฒฉ ์•”ํ˜ธ์˜ ์ข…๋ฅ˜ ๋Œ€์นญํ‚ค(๋น„๋ฐ€ํ‚ค)(๊ด€์šฉํ‚ค) ์•”ํ˜ธ ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”์— ๊ฐ™์€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธ ์‚ฌ์šฉ์ž n๋ช…์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ํ‚ค์˜ ๊ฐœ์ˆ˜ : n(n-1)/2 ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜ ๋ธ”๋ก ์•”ํ˜ธ (DES, IDEA, AES) ํ‰๋ฌธ์„ ๋ธ”๋ก์œผ๋กœ ๋‚˜๋ˆ„์–ด ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ์‹ ์ŠคํŠธ๋ฆผ ์•”ํ˜ธ (RC4) ํ‰๋ฌธ๊ณผ ํ‚ค๋ฅผ ๋น„ํŠธ ๋‹จ์œ„๋กœ XORํ•˜์—ฌ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ์‹ ํ•œ๊ตญ์—์„œ ์“ฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ข…๋ฅ˜ : NEAT, SEED, NES, ARIA ๊ณต๊ฐœํ‚ค(๋น„๋Œ€์นญํ‚ค) ์•”ํ˜ธ ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”์— ๋‹ค๋ฅธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธ ์‚ฌ์šฉ์ž n๋ช…์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ํ‚ค์˜ ๊ฐœ์ˆ˜ : 2n ๊ธฐ๋ฐ€์„ฑ (Confidentiality) : ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™”, ๊ฐœ์ธํ‚ค๋กœ ๋ณตํ˜ธํ™” ์ธ์ฆ (Authentication) : ๊ฐœ์ธํ‚ค๋กœ ์•”ํ˜ธํ™”, ๊ณต๊ฐœํ‚ค๋กœ ๋ณตํ˜ธํ™” ํ‚ค ์ƒ์„ฑ DH ํ‚ค ๊ตํ™˜ ์•”ํ˜ธ๊ธฐ์ˆ ์˜ ํ™œ์šฉ ๋””์ง€ํ„ธ ์„œ๋ช… ํŠน์„ฑ : ์œ„์กฐ๋ถˆ๊ฐ€, ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€, ์„œ๋ช…์ž ์ธ์ฆ, ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€, ๋ถ€์ธ ๋ฐฉ์ง€ ๋™ํ˜•์•”ํ˜ธ์™€ ์–‘์ž์•”ํ˜ธ ๊ธฐ์ˆ 
new Spring - JPA : ๊ฐœ๋…, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ, ์—ฐ๊ด€ ๊ด€๊ณ„ ๋งคํ•‘
๐Ÿƒ Spring
JPA (Java Persistence API) JAVA์ง„์˜์˜ ORM ๊ธฐ์ˆ  ํ‘œ์ค€, interface ๋ชจ์Œ Hibernate, EclipseLink, DataNucleus ๋“ฑ์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์กด์žฌ EntityManager Entity : RDB์˜ Table๊ณผ ๋งคํ•‘๋˜๋Š” ๊ฐ์ฒด EntityManagerFactory Entity๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” EntityManager๋ฅผ ์ƒ์‚ฐํ•˜๋Š” ๊ณต์žฅ Thread safe: O EntityManager Entity์˜ CRUD๋“ฑ ๋ชจ๋“  ์ผ์„ ์ฒ˜๋ฆฌ Thread safe: X ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ Entity๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ EntityManager๋Š” Entity๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณด๊ด€ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” Entity๋Š” ์‹๋ณ„์ž๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค (ID) -> key-value๋กœ Entity๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ flush: ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณ€๊ฒฝ ๋‚ด์šฉ๋“ค์„ DB์— ๋™๊ธฐํ™”ํ•˜๋Š” ์ž‘์—… ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์ด์  1์ฐจ ์บ์‹œ ๋™์ผ์„ฑ ๋ณด์žฅ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ ๋ณ€๊ฒฝ ๊ฐ์ง€ ์ง€์—ฐ ๋กœ๋”ฉ Entity์˜ Life cycle ๋น„์˜์† (New / Transient): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์ „ํ˜€ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ์ƒํƒœ ์˜์† (Managed): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋œ ์ƒํƒœ ์ค€์˜์† (Detached): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋˜์—ˆ๋‹ค๊ฐ€ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ ์‚ญ์ œ (Removed): ์‚ญ์ œ๋œ ์ƒํƒœ ์ €์žฅ 1EntityManager em = emf.createEntityManager(); // Entity manger ์ƒ์„ฑ 2EntityTransaction transaction = em.getTransaction(); // Transaction ํš๋“ 3transaction.begin(); 4 5Customer customer = new Customer(); // ๋น„์˜์† ์ƒํƒœ 6customer.setId(1L); 7customer.setFirstName("John"); 8customer.setLastName("Doe"); 9 10em.persist(customer); // ์˜์†ํ™” 11 12transaction.commit(); // Transaction commit ์กฐํšŒ 1// Customer(1L) ๋งŒ๋“ค์–ด์„œ commit 2... 3Customer entity = em.find(Customer.class, 1L); // 1์ฐจ ์บ์‹œ์—์„œ ์กฐํšŒ, query ์‹คํ–‰ X 4em.clear(); // ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™” 5Customer entity = em.find(Customer.class, 1L); // DB์—์„œ ์กฐํšŒ, query ์‹คํ–‰ O ์ˆ˜์ • 1// Customer(1L) ๋งŒ๋“ค์–ด์„œ commit 2... 3Customer entity = em.find(Customer.class, 1L); 4entity.setFirstName("guppy"); 5entity.setLastName("hong"); 6 7transaction.commit(); // update! ๋ณ€๊ฒฝ๊ฐ์ง€ (dirty checking) JPA๋Š” Entity๋ฅผ ์˜์†ํ™”ํ•  ๋•Œ์˜ ์ตœ์ดˆ ์ƒํƒœ๋ฅผ ์Šค๋ƒ…์ƒท์œผ๋กœ ์ €์žฅํ•ด๋‘”๋‹ค flush ์‹œ์ ์— ์Šค๋ƒ…์ƒท๊ณผ ๋น„๊ตํ•ด์„œ ๋ณ€๊ฒฝ๋œ Entity์— ๋Œ€ํ•ด update query๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค ์‚ญ์ œ 1// Customer(1L) ๋งŒ๋“ค์–ด์„œ commit 2... 3Customer entity = em.find(Customer.class, 1L); 4em.remove(entity); 5 6transaction.commit(); // delete! Entity Mapping ๋‹จ์ผ ์—”ํ‹ฐํ‹ฐ๋งคํ•‘ @Entity : ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ํ•„์ˆ˜ @Table : name์œผ๋กœ ๋งคํ•‘ํ•  ํ…Œ์ด๋ธ” ์ด๋ฆ„ ์ง€์ • @Id GenerationType - AUTO, IDENTITY, SEQUENCE, TABLE @Column name, length, unique, columnDefinition… insertable=updatable, nullable @Enumerated EnumType - ORDINAL, STRING ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘ ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ํ‚ค๋กœ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งบ๋Š”๋‹ค 1. ์ฐธ์กฐ์˜ ๋ฐฉํ–ฅ ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ ํ…Œ์ด๋ธ”์€ ํ•ญ์ƒ ์–‘๋ฐฉํ–ฅ์ด๋‹ค 2. ์—ฐ๊ด€ ๊ด€๊ณ„ ์ฃผ์ธ ๊ฐ์ฒด๊ฐ€ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งบ์„ ๋•Œ, ์—ฐ๊ด€ ๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ์ •ํ•ด์•ผ ํ•œ๋‹ค ์ฃผ์ธ๋งŒ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌ(๋“ฑ๋ก, ์ˆ˜์ •) ํ•  ์ˆ˜ ์žˆ๋‹ค, ์ฃผ์ธ์ด ์•„๋‹Œ ์ชฝ์€ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅ mappedBy๋ฅผ ํ†ตํ•ด ์ฃผ์ธ์ด ์•„๋‹Œ ์—”ํ‹ฐํ‹ฐ์—์„œ ์ฃผ์ธ์„ ์ง€์ •ํ•œ๋‹ค 3. ๋‹ค์ค‘์„ฑ ManyToOne, OneToMany, OneToOne, ManyToMany JoinColumn(name="", referencedColumnName="") ์™ธ๋ž˜ ํ‚ค๋ฅผ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ name: ๋งคํ•‘ํ•  ์™ธ๋ž˜ ํ‚ค ์ด๋ฆ„ referencedColumnName: ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช… ์˜ˆ์ œ - ์—ฐ๊ด€๊ด€๊ณ„ ํŽธ์˜ ๋ฉ”์†Œ๋“œ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์—์„œ ํ•œ์ชฝ์—๋งŒ ์„ค์ •ํ•˜๋ฉด ์–‘์ชฝ ๋‹ค ์„ค์ •ํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์™€ ๊ทธ ํŽธ์˜๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•œ ์ฝ”๋“œ์ด๋‹ค Member.java 1@OneToMany(mappedBy = "member") 2private List<Order> orders = new ArrayList<>(); 3 4public void addOrder(Order order) { 5 this.orders.add(order); 6 order.setMember(this); 7} Order.java 1@ManyToOne 2@JoinColumn(name="member_id", referencedColumnName = "id") 3private Member member; 4 5public void setMember(Member member) { 6 if (this.member != null) { 7 this.member.getOrders().remove(this); 8 } 9 this.member = member; 10 member.getOrders().add(this); 11}
new [๋ชจ๊ฐ์ฝ”24ํ•˜๊ณ„] 02 : ๊ฒฐ๊ณผ
๐Ÿ‘จโ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ”
RAG (Retrieval-Augmented Generation) ์ด๋ก  ์ •๋ฆฌ RAG๋Š” ๊ฒ€์ƒ‰๊ณผ ์ƒ์„ฑ์„ ๊ฒฐํ•ฉํ•œ ๋ชจ๋ธ๋กœ, ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์–ป์€ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋ธ LLM์˜ ๋ฌธ์ œ์  ํ• ๋ฃจ์‹œ๋„ค์ด์…˜: ์ƒ์„ฑ ๋ชจ๋ธ์ด ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์— ์—†๋Š” ๋‚ด์šฉ์„ ์ƒ์„ฑํ•˜๋Š” ํ˜„์ƒ ์ตœ์‹ ์˜ ์‘๋‹ต์„ ๊ธฐ๋Œ€ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์˜ค๋ž˜๋˜์—ˆ๊ฑฐ๋‚˜ ์ผ๋ฐ˜์ ์ธ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ถœ์ฒ˜๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ RAG๋Š” ์œ„์—์„œ ์„œ์ˆ ํ•œ LLM ๋ฌธ์ œ์˜ ์ผ๋ถ€๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์ด๋‹ค. OpenSearch OpenSearch๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์—”์ง„์œผ๋กœ, ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜์˜ ํฌํฌ ๋ฒ„์ „ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฃผ์š” ๊ธฐ๋Šฅ ๋ถ„์‚ฐ ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ๋ณด์•ˆ ์‹œ๊ฐํ™”์™€ ๋Œ€์‹œ๋ณด๋“œ ์ง€์› index์™€ document index : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค document : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ถ„์„๊ธฐ Analyzer (Character Filter + Tokenizer + Token Filter) ํ…์ŠคํŠธ๋ฅผ ํ† ํฐํ™”ํ•˜๊ณ  ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ ๋ถ„์„ ๊ณผ์ • Character Filter ํŠน์ • ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ Tokenizer ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Token Filter ํ† ํฐ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ OpenSearch์—์„œ ์ง€์›ํ•˜๋Š” ์š”์†Œ Tokenizer Standard Tokenizer : ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ, ๋ฌธ์žฅ ๋ถ€ํ˜ธ ์‚ญ์ œ Letter Tokenizer : ๋ฌธ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Whitespace Tokenizer : ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Ngram Tokenizer : ๋ถ€๋ถ„ ๋ฌธ์ž์—ด๋กœ ํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌ Token Filter Standard Token Filter : ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์Œ Lowercase Token Filter : ํ…์ŠคํŠธ๋ฅผ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ Synonym Token Filter : ๋™์˜์–ด ์ฒ˜๋ฆฌ Analyzer Standard Analyzer : Standard Tokenizer + Standard Token Filter Simple Analyzer : Letter Tokenizer + Lowercase Token Filter Whitespace Analyzer : Whitespace Tokenizer + Lowercase Token Filter OpenSearch ์ ‘๊ทผ์„ ์œ„ํ•œ cURL ๋ช…๋ น์–ด ์ธ๋ฑ์Šค ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/_cat/indices" ํŠน์ • ์ธ๋ฑ์Šค ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}" ์ „์ฒด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}/_search" ํŠน์ • ๊ฒ€์ƒ‰์–ด๋กœ ๊ฒ€์ƒ‰ํ•œ ๊ฒฐ๊ณผ ์กฐํšŒ 1curl -X GET -u {username}:{password} \ 2"http://localhost:9200/{index_name}/_search" \ 3-H "Content-Type: application/json" \ 4-d '{"query": {"match": {"field": "value"}}}' ์ธ๋ฑ์Šค ์‚ญ์ œ 1curl -X DELETE -u {username}:{password} \ 2"http://localhost:9200/{index_name}" OpenSearch๋ฅผ ํ™œ์šฉํ•œ Rag ์‹ค์Šต ๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„์—์„œ ํŒ€ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋‹ค. ์šฐ๋ฆฌ ํŒ€์˜ ์ฃผ์ œ๋Š” ํŠน์ • ์ธ๋ฌผ์—๊ฒŒ ์ƒ๋‹ด์„ ๋ฐ›๋Š” ๊ฒƒ ๊ฐ™์€ ๋Œ€ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฑ—๋ด‡์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํŠน์ • ์ธ๋ฌผ์ด ํ–ˆ๋˜ ๋ง์„ ๋ชจ์•„ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ RAG ๋ชจ๋ธ์— ์ ์šฉ์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ์ˆœ์„œ ์ผ๋ก  ๋จธ์Šคํฌ๊ฐ€ TED์—์„œ ํ•œ ์ธํ„ฐ๋ทฐ๋ฅผ ํ…์ŠคํŠธ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. OpenSearch ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„๋ฒ ๋”ฉํ•ด์„œ OpenSearch์— ์ €์žฅํ•œ๋‹ค. RAG ๋ชจ๋ธ์ด OpenSearch๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค. 1. ์ผ๋ก  ๋จธ์Šคํฌ ์ธํ„ฐ๋ทฐ ํ…์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ ํŠœ๋ธŒ์—์„œ “์Šคํฌ๋ฆฝํŠธ ๋ณด๊ธฐ"๋ฅผ ํ†ตํ•ด ์ธํ„ฐ๋ทฐ ์ž๋ง‰์„ ๊ฐ€์ ธ์˜จ๋‹ค. 122:03 2EM: ์ด ํฐ ํŠธ๋Ÿญ์„ ๋ชฐ๋ฉด์„œ ๋ง๋„ ์•ˆ๋˜๋Š” ์›€์ง์ž„์„ ๋ณด์˜€์ฃ . 3CA: ์•„์ฃผ ๋ฉ‹์ง€๋„ค์š”. ์ž, ๊ทธ๋Ÿผ ์ •๋ง ๊ต‰์žฅํ•œ ์‚ฌ์ง„์—์„œ 422:09 5์กฐ๊ธˆ์€ ๋œ ๊ต‰์žฅํ•œ ์‚ฌ์ง„์„ ๋ณด์ฃ . "์œ„๊ธฐ์˜ ์ฃผ๋ถ€๋“ค"์ธ๊ฐ€์—์„œ ๋‚˜์˜ค๋Š” ๊ท€์—ฌ์šด ์ง‘ ์‚ฌ์ง„์ธ๋ฐ์š”. 622:15 7์ด๊ฒŒ ๊ฐ‘์ž๊ธฐ ์™œ ๋‚˜์˜จ๊ฑฐ์ฃ ? 8... ์ผ๋ก  ๋จธ์Šคํฌ๊ฐ€ ํ•œ ๋ง๋งŒ ์†์ˆ˜ ์ •๋ฆฌํ•œ๋‹ค. 1๋„ค. ์ œ ์Šค์Šค๋กœ๋„ ๊ทธ ์งˆ๋ฌธ์„ ์ž์ฃผ ํ•˜๋Š” ํŽธ์ž…๋‹ˆ๋‹ค. 2์ €ํฌ๋Š” LA์˜ ์ง€ํ•˜์— ๊ตฌ๋ฉ์„ ๋‚ด๋ ค๊ณ  ํ•˜๋Š”๋ฐ์š”. ์ด๋Š” ๊ตํ†ต ์ฒด์ฆ์„ ์™„ํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•œ 33์ฐจ์› ๋„คํŠธ์›Œํฌ์˜ ํ„ฐ๋„์ด ๋  ์ˆ˜๋„ ์žˆ๋Š” ์‹œ๋ฐœ์ ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. 4๊ตํ†ต ์ฒด์ฆ์€ ์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ์˜ ์˜ํ˜ผ์„ ํƒˆํƒˆ ํ„ฐ๋Š” ๋ฌธ์ œ ์ค‘์˜ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. 5์„ธ๊ณ„ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์น˜๊ณ  ์žˆ์ฃ . ์ธ์ƒ์—์„œ ๋„ˆ๋ฌด๋„ ๋งŽ์€ ๋ถ€๋ถ„์„ ๊ฐ€์ ธ๊ฐ‘๋‹ˆ๋‹ค. 6... 2. OpenSearch ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ 1docker create -it -p 9200:9200 -p 9600:9600 -e OPENSEARCH_INITIAL_ADMIN_PASSWORD={password} -e "discovery.type=single-node" -v opensearch_vol:/usr/share/opensearch/data --name opensearch opensearchproject/opensearch ์„ค๋ช… -p 9200:9200 : OpenSearch HTTP ํฌํŠธ -p 9600:9600 : OpenSearch ๋ชจ๋‹ˆํ„ฐ๋ง ํฌํŠธ -e OPENSEARCH_INITIAL_ADMIN_PASSWORD={password} : ์ดˆ๊ธฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ • -e “discovery.type=single-node” : ๋‹จ์ผ ๋…ธ๋“œ๋กœ ์‹คํ–‰ -v opensearch_vol:/usr/share/opensearch/data : ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ SSL ์˜ค๋ฅ˜ ๋ฐœ์ƒ๊ณผ ํ•ด๊ฒฐ ํ•˜์ง€๋งŒ ์œ„ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค 12024-07-05 22:15:12 Caused by: io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: ... 22024-07-05 22:15:12 at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1314) ~[netty-handler-4.1.110.Final.jar:4.1.110.Final] 32024-07-05 22:15:12 at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1387) ~[netty-handler-4.1.110.Final.jar:4.1.110.Final] 42024-07-05 22:15:12 at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:530) ~[netty-codec-4.1.110.Final.jar:4.1.110.Final] 52024-07-05 22:15:12 at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:469) ~[netty-codec-4.1.110.Final.jar:4.1.110.Final] 62024-07-05 22:15:12 ... 16 more ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์ด ๊ธธ์ง€ ์•Š๊ณ , ํ•ด๋‹น ํฌํŠธ๋Š” ์™ธ๋ถ€์— ๋…ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ SSL์„ ๋„๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€๋‹ค. 1/usr/share/opensearch/config/opensearch.yml 2# ๋ณ€๊ฒฝ ์ „ 3plugins.security.ssl.http.enabled: true 4# ๋ณ€๊ฒฝ ํ›„ 5plugins.security.ssl.http.enabled: false 3. ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ž„๋ฒ ๋”ฉ ๋ฐ OpenSearch์— ์ €์žฅ RAG ์„ธ์…˜์„ ํ•ด์ฃผ์‹  ๋ฉ˜ํ† ๋‹˜์ด ์งœ์ค€ ์ฝ”๋“œ๋ฅผ ์ ๊ทน! ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€๋‹ค. OpenSearch ์ธ๋ฑ์Šค ์ƒ์„ฑ 1from opensearchpy import OpenSearch 2import torch 3from transformers import AutoTokenizer, AutoModel 4from langchain.text_splitter import RecursiveCharacterTextSplitter 5from langchain_community.document_loaders import TextLoader 6from langchain_community.vectorstores import OpenSearchVectorSearch 7 8INDEX_NAME = "elon_musk" 9FILE_NAME = "ted_elon_musk_script.txt" 10 11## OpenSearch ์—ฐ๊ฒฐ ์„ค์ • 12client = OpenSearch( 13 hosts=[{"host": "localhost", "port": 9200}], http_auth=("admin", {password}) 14) 15 16## ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ 17loader = TextLoader(file_path=FILE_NAME, encoding="utf-8") 18docs = loader.load() 19 20text_splitter = RecursiveCharacterTextSplitter( 21 chunk_size=100, 22 chunk_overlap=0, 23 separators=["\n"], 24 length_function=len, 25) 26 27documents = text_splitter.split_documents(docs) 28 29# print(documents) 30 31## Embedding ๋ชจ๋ธ ์ •์˜ 32class MyEmbeddingModel: 33 def __init__(self, model_name): 34 self.tokenizer = AutoTokenizer.from_pretrained(model_name) 35 self.model = AutoModel.from_pretrained(model_name) 36 37 def embed_documents(self, doc): 38 inputs = self.tokenizer( 39 doc, return_tensors="pt", padding=True, truncation=True, max_length=512 40 ) 41 42 with torch.no_grad(): 43 outputs = self.model(**inputs) 44 embeddings = outputs.last_hidden_state.mean(dim=1).tolist() 45 46 return embeddings 47 48 def embed_query(self, text): 49 inputs = self.tokenizer( 50 [text], padding=True, truncation=True, return_tensors="pt", max_length=512 51 ) 52 with torch.no_grad(): 53 outputs = self.model(**inputs) 54 embeddings = outputs.last_hidden_state.mean(dim=1).tolist() 55 return embeddings 56 57 58## index ๊ตฌ์กฐ ์ •์˜ 59index_body = { 60 "settings": { 61 "analysis": { 62 "tokenizer": { 63 "nori_user_dict": { 64 "type": "nori_tokenizer", 65 "decompound_mode": "mixed", 66 "user_dictionary": "user_dic.txt", 67 } 68 }, 69 "analyzer": { 70 "korean_anlyzer": { 71 "filter": [ 72 "synonym", "lowercase", 73 ], 74 "tokenizer": "nori_user_dict", 75 } 76 }, 77 "filter": { 78 "synonym" :{ 79 "type": "synonym_graph", 80 "synonyms_path" : "synonyms.txt" 81 } 82 } 83 } 84 } 85} 86 87## Embedding ๋ชจ๋ธ ์ƒ์„ฑ 88my_embedding = MyEmbeddingModel("monologg/kobert") 89 90## OpenSearch์— ๋ฐ์ดํ„ฐ ์‚ฝ์ž… 91vector_db = OpenSearchVectorSearch.from_documents( 92 index_name=INDEX_NAME, 93 body=index_body, 94 documents=documents, 95 embedding=my_embedding, 96 op_type="create", 97 opensearch_url="http://localhost:9200", 98 http_auth=("admin", {password}), 99 use_ssl=False, 100 verify_certs=False, 101 ssl_assert_hostname=False, 102 ssl_show_warn=False, 103 bulk_size=1000000, 104 timeout=360000, 105) 106 107result = vector_db.add_documents(documents, bulk_size=1000000) tokenizer๋Š” ํ•œ๊ตญ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” “nori_tokenizer"๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. embedding ๋ชจ๋ธ์€ ์ €๊ฑฐ ๋ง๊ณ ๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ์–ด๋–ค ๋ชจ๋ธ์ด ํ”„๋กœ์ ํŠธ์— ๊ฐ€์žฅ ๋ถ€ํ•ฉํ•˜๋Š” ๋ชจ๋ธ์ธ์ง€๋Š” ์‹คํ—˜์„ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค. curl์„ ํ†ตํ•ด localhost:9200/elon_musk/_search๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด ์ž„๋ฒ ๋”ฉํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋“ค์–ด๊ฐ”๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 4. RAG ๋ชจ๋ธ์ด OpenSearch๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ ๋Œ€๋‹ต ์ƒ์„ฑ 1from langchain.prompts import PromptTemplate 2from langchain.chains import LLMChain 3from langchain_openai import ChatOpenAI 4from opensearchpy import OpenSearch 5import os 6 7INDEX_NAME = "elon_musk" 8 9# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • 10os.environ["OPENAI_API_KEY"] = {api_key} 11 12llm = ChatOpenAI( 13 model_name="gpt-3.5-turbo", 14) 15 16prompt_template = PromptTemplate( 17 input_variables=["context", "question"], 18 template=""" 19Imagine you are {character_name}, 20a wise and experienced advisor. Given the context: "{context}", 21how would you respond to this inquiry: "{question}"?', 22(in korean) 23""", 24) 25 26 27llm_chain = LLMChain(llm=llm, prompt=prompt_template) 28 29client = OpenSearch( 30 hosts=["http://localhost:9200"], 31 http_auth=("admin", {password}), 32 use_ssl=False, 33 verify_certs=False, 34 ssl_assert_hostname=False, 35 ssl_show_warn=False, 36) 37 38def search_documents(query): 39 search_body = {"query": {"match": {"text": query}}} 40 response = client.search(index=INDEX_NAME, body=search_body) 41 hits = response["`its"]["hits"] 42 return [hit["_source"]["text"] for hit in hits] 43 44if __name__ == "__main__": 45 question = input("Enter your question\n") 46 search_results = search_documents(question) 47 48 print(search_results) 49 50 # context = " ".join(search_results) 51 context = "" 52 53 response = llm_chain.invoke({"character_name": INDEX_NAME, "context": context, "question": question}) 54 55 print (response["text"]) OpenSearch์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฟผ๋ฆฌํ•˜์—ฌ RAG ๋ชจ๋ธ์— ๋„ฃ์–ด ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค. search_documents ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด OpenSearch์— ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ context๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฒฐ๊ณผ ์งˆ๋ฌธ ํ…Œ์Šฌ๋ผ์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด? RAG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ๋Œ€๋‹ต ํ…Œ์Šฌ๋ผ๋Š” ํ˜์‹ ์ ์ธ ๊ธฐ์—…์œผ๋กœ์„œ ๋ฏธ๋ž˜๋ฅผ ํ–ฅํ•œ ๋น„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ์ „๊ธฐ ์ž๋™์ฐจ ๊ธฐ์ˆ ๊ณผ ์—๋„ˆ์ง€ ์†”๋ฃจ์…˜์€ ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ์˜ ํ˜์‹ ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ์ง€์† ๊ฐ€๋Šฅํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ธ์ •์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. RAG๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ์ ์šฉ๋œ context [‘๊ธธ๊ฒŒ ๊ฐˆ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์•„์š”.\n๊ทธ๋Ÿฌ๋„ค์š”. ์ €๋Š” ์ตœ๋Œ€ํ•œ ์˜ค๋žซ๋™์•ˆ ํ…Œ์Šฌ๋ผ์— ๋จธ๋ฌผ ์ƒ๊ฐ์ด์—์š”.\n๊ทธ๋ฆฌ๊ณ  ์ค€๋น„ ์ค‘์— ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ์ผ๋„ ๋งŽ๊ณ ์š”. ์•„์‹œ๋‹ค์‹œํ”ผ, ๋ชจ๋ธ 3์ด ์ถœ์‹œ ์˜ˆ์ •์ด๊ณ ์š”.’, ‘์˜ฌํ•ด ๋ง๊นŒ์ง€ LA์—์„œ ๋‰ด์š•๊นŒ์ง€\n์™„์ „ ์ž์œจ ์ฃผํ–‰์œผ๋กœ ํšก๋‹จํ•˜๋Š” ๊ณ„ํš์— ๋งž์ถฐ์„œ ์ง„ํ–‰ ์ค‘์ด์—์š”.\n์‚ฌ๋žŒ์ด ํ…Œ์Šฌ๋ผ์— ํƒ€์„œ ์šด์ „๋Œ€๋ฅผ ์žก์ง€ ์•Š๊ณ  “๋‰ด์š•"์„ ์ฐ์œผ๋ฉด ๊ทธ๋ฆฌ๋กœ ๊ฐ„๋‹ค๋Š” ๋ง์ด๋„ค์š”.’, ‘๊ธธ๊ฒŒ ๊ฐˆ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์•„์š”.\n๊ทธ๋Ÿฌ๋„ค์š”. ์ €๋Š” ์ตœ๋Œ€ํ•œ ์˜ค๋žซ๋™์•ˆ ํ…Œ์Šฌ๋ผ์— ๋จธ๋ฌผ ์ƒ๊ฐ์ด์—์š”.\n๊ทธ๋ฆฌ๊ณ  ์ค€๋น„ ์ค‘์— ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ์ผ๋„ ๋งŽ๊ณ ์š”. ์•„์‹œ๋‹ค์‹œํ”ผ, ๋ชจ๋ธ 3์ด ์ถœ์‹œ ์˜ˆ์ •์ด๊ณ ์š”.’, ‘์˜ฌํ•ด ๋ง๊นŒ์ง€ LA์—์„œ ๋‰ด์š•๊นŒ์ง€\n์™„์ „ ์ž์œจ ์ฃผํ–‰์œผ๋กœ ํšก๋‹จํ•˜๋Š” ๊ณ„ํš์— ๋งž์ถฐ์„œ ์ง„ํ–‰ ์ค‘์ด์—์š”.\n์‚ฌ๋žŒ์ด ํ…Œ์Šฌ๋ผ์— ํƒ€์„œ ์šด์ „๋Œ€๋ฅผ ์žก์ง€ ์•Š๊ณ  “๋‰ด์š•"์„ ์ฐ์œผ๋ฉด ๊ทธ๋ฆฌ๋กœ ๊ฐ„๋‹ค๋Š” ๋ง์ด๋„ค์š”.’] RAG๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋Œ€๋‹ต ์ €๋Š” ํ…Œ์Šฌ๋ผ๋ฅผ ๋งค์šฐ ๊ธ์ •์ ์œผ๋กœ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ๋Š” ํ˜์‹ ์ ์ธ ๊ธฐ์ˆ ๊ณผ ์ง€์† ๊ฐ€๋Šฅํ•œ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•œ ๋น„์ „์„ ๊ฐ–์ถ˜ ๊ธฐ์—…์œผ๋กœ์„œ, ์ž์œจ ์ฃผํ–‰ ๊ธฐ์ˆ ์„ ํ†ตํ•ด ์šฐ๋ฆฌ์˜ ์‚ถ์„ ํ˜์‹ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ „๊ธฐ์ฐจ ์‹œ์žฅ์„ ์„ ๋„ํ•˜๊ณ  ํ™˜๊ฒฝ์— ์นœํ™”์ ์ธ ์ฐจ๋Ÿ‰์„ ์ œ๊ณตํ•˜๋Š” ๋ฉ‹์ง„ ๊ธฐ์—…์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์Šฌ๋ผ์˜ ๋ฏธ๋ž˜๊ฐ€ ๋ฐ๊ณ  ํฅ๋ฏธ๋กœ์šด ์ผ๋“ค์ด ๊ณ„์†ํ•ด์„œ ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ณ ์ฐฐ ํ™•์‹คํžˆ RAG๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ๊ฐ๊ด€์ ์ด๊ณ  ์ผ๋ฐ˜์ ์ธ ๋Œ€๋‹ต์„ ํ•˜๋Š” ๋ฐ˜๋ฉด, RAG๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ…Œ์Šฌ๋ผ์— ๋Œ€ํ•ด ๊ธ์ •์ ์ธ ์ผ๋ก  ๋จธ์Šคํฌ์˜ ๋Œ€๋‹ต๊ณผ, ์ž์œจ์ฃผํ–‰ ๊ธฐ์ˆ ์„ ์–ธ๊ธ‰ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ˜์˜ํ•˜์—ฌ ๋Œ€๋‹ต์„ ์ƒ์„ฑํ•˜์˜€๋‹ค.
new Fastapi, RabbitMQ, Celery ์—ฐ๋™
๐Ÿ Python
๋ฐฐ๊ฒฝ ํ…Œ์ปค ๋ถ€ํŠธ์บ ํ”„์—์„œ ํŒ€ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋‹ค. ์›น์†Œ์ผ“์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ gpt๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๋Š” ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์›ํ™œํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„์‚ฐ ๋น„๋™๊ธฐ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ชฉํ‘œ Fastapi, RabbitMQ, Celery๋ฅผ ๊ฐ์ž docker ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ตฌ๋™์‹œํ‚ค๊ณ  ์—ฐ๋™ํ•œ๋‹ค. docker-compose.yml 1version: '3' 2 3services: 4 rabbitmq: 5 image: rabbitmq:3 6 ports: 7 - "5672:5672" # RabbitMQ์˜ AMQP ํฌํŠธ 8 - "15672:15672" # RabbitMQ ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค ํฌํŠธ 9 volumes: 10 - rabbitmq_data:/var/lib/rabbitmq 11 expose: 12 - "5672" 13 - "15672" 14 15 celery_worker: 16 build: 17 context: . 18 dockerfile: Dockerfile.worker 19 command: celery -A utils.celery_worker worker --loglevel=info 20 working_dir: /app 21 volumes: 22 - ./app/utils:/app/utils 23 environment: 24 - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672// 25 depends_on: 26 - rabbitmq 27 28 celery_beat: 29 image: celery:4 30 command: celery -A celery_beat beat --loglevel=info 31 working_dir: /app 32 environment: 33 - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672// 34 volumes: 35 - ./app/utils:/app 36 depends_on: 37 - rabbitmq 38 39 web: 40 image: python:slim 41 working_dir: /app 42 # interactive mode 43 stdin_open: true 44 # tty mode 45 tty: true 46 environment: 47 - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672// 48 volumes: 49 - ./app:/app 50 ports: 51 - "8000:8000" 52 depends_on: 53 - rabbitmq 54 - celery_worker 55 - celery_beat 56 57volumes: 58 rabbitmq_data: Celery worker์—๋งŒ Dockerfile.worker๋ฅผ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•œ ์ด์œ  worker์— ์ถ”๊ฐ€์ ์œผ๋กœ python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์•ผํ•จ Celery ๊ณต์‹ ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ deprecated ๋˜์—ˆ์Œ. Fastapi๋Š” ์‹œ๊ฐ„ ๊ด€๊ณ„์ƒ ๋”ฐ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  python:slim ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. Dockerfile.worker 1FROM python:slim 2 3# ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜ 4# ffmpeg๊ฐ€ ํ•„์š”ํ•ด์„œ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค 5RUN apt-get update && \ 6apt-get install -y --no-install-recommends gcc libpq-dev ffmpeg && \ 7rm -rf /var/lib/apt/lists/* 8 9# ํ•„์š”ํ•œ ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€ ์„ค์น˜ 10COPY requirements_celery_worker.txt ./ 11RUN pip install --no-cache-dir -r requirements_celery_worker.txt celery_worker.py 1import os 2from celery import Celery 3 4broker_url = os.getenv('CELERY_BROKER_URL') 5app = Celery('worker', broker=broker_url, backend="rpc://") 6 7@app.task 8def add(x, y): 9 return x + y broker_url์€ RabbitMQ์˜ AMQP ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. backend๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ๋ฐฑ์—”๋“œ๋กœ RabbitMQ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Celery worker ์‚ฌ์šฉ ๋ฐฉ๋ฒ• 1from celery_worker import add 2 3# task๋ฅผ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ 4result = add.delay(4, 4) 5 6# apply_async๋Š” delay์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰ 7# delay์™€ ๋‹ฌ๋ฆฌ ์ถ”๊ฐ€๋กœ ์—ฌ๋Ÿฌ ์˜ต์…˜์„ ์„ค์ • ๊ฐ€๋Šฅ 8result = add.apply_async((4, 4)) 9 10# ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด get()์„ ์‚ฌ์šฉ, ๋ธ”๋กœํ‚น ํ˜ธ์ถœ 11result.get() 12 13# ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์—… 14result.ready() 15 16# ์ž‘์—…์ด ์‹คํŒจํ–ˆ๋Š”์ง€ ํ™•์ธ 17result.successful() 18# or 19result.failed() 20 21# ์ž‘์—…์˜ ์ƒํƒœ ํ™•์ธ (PENDING, STARTED, SUCCESS, FAILURE) 22result.state()
new ์ปดํ“จํ„ฐ๋„คํŠธ์›Œํฌ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
HTTP HTTP Method Method request payload response payload idempotent GET Optional O O HEAD Optional O O POST Yes O X PUT Yes O O DELETE Optional O O CONNECT Optional O X OPTIONS Optional O O TRACE Optional O O PATCH Yes O X HTTP Protocol Version HTTP/1.0 ์—ฐ๊ฒฐ๋ฐฉ์‹ : non-persistent HTTP TCP ์—ฐ๊ฒฐ ํ•œ๋ฒˆ์— ์ตœ๋Œ€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด ๊ฐ ๊ฐ์ฒด๋‹น 2๊ฐœ์˜ RTT๊ฐ€ ํ•„์š” HTTP/1.1 ์—ฐ๊ฒฐ๋ฐฉ์‹ : persistent HTTP ์ด์ „ TCP ์—ฐ๊ฒฐ์„ ์žฌ์‚ฌ์šฉ -> ์™•๋ณต์ง€์—ฐ์‹œ๊ฐ„ ๊ฐ์†Œ (Connection: Keep-Alive) Pipelining์œผ๋กœ ๋ณ‘๋ ฌ ์š”์ฒญ๊ณผ ์‘๋‹ต (์˜ˆ: HTML+CSS) 1๊ฐœ์˜ TCP์—์„œ ๊ฐ์ฒด๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ „์†ก -> Head-of-line(HoL) ํ˜„์ƒ ๋ฐœ์ƒ ์—ฌ๋Ÿฌ ๊ฐœ์˜ TCP ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉ - ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋„๋ฉ”์ธ๋‹น ์—ฐ๊ฒฐ ์ˆ˜ ์ œํ•œ ๋„๋ฉ”์ธ ์ƒค๋”ฉ(Domain Sharding) : ์—ฐ๊ฒฐ ์ œํ•œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ๋‘๊ธฐ (HTTP/2์—์„œ๋Š” X) HTTP/2 ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋ ˆ์ž„: ์šฐ์„ ์ˆœ์œ„, ํ๋ฆ„์ œ์–ด, ์„œ๋ฒ„ ํ‘ธ์‹œ ์šฐ์„ ์ˆœ์œ„ ์ง€์ • : ์ฝ˜ํ…์ธ ๊ฐ€ ๋กœ๋“œ๋˜๋Š” ์ˆœ์„œ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ : TCP์—ฐ๊ฒฐ 1๊ฐœ๋กœ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์ „์†ก ์„œ๋ฒ„ ํ‘ธ์‹œ : ์„œ๋ฒ„๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์˜ˆ์ธกํ•˜์—ฌ ์ „์†ก ํ—ค๋” ์••์ถ•, ํ—ค๋”์™€ ๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ HTTP/3 QUIC ํ”„๋กœํ† ์ฝœ, UDP ๊ธฐ๋ฐ˜ ๊ธฐํƒ€ HTTP Cookie ์›น์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ ์‹œ ๊ธฐ๋ก Third-party Cookie ๊ด‘๊ณ ์— ์‚ฌ์šฉ HTTP Cache ์ตœ์ดˆ ์š”์ฒญ์€ ์›๋ž˜ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ, ์ดํ›„ ์š”์ฒญ์€ Proxy(Cache) ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ CDN (Content Delivery Network) ์ปจํ…์ธ ๋ฅผ ์ „์„ธ๊ณ„ ์—ฌ๋Ÿฌ ์ง€์—ญ์— ๋ฏธ๋ฆฌ ๋ฐฐํฌ Internet protocol traceroute : ํŒจํ‚ท ๊ฒฝ๋กœ ์ถ”์  netstat -rn, route -n : ๋ผ์šฐํ„ฐ ์ •๋ณด ํ™•์ธ P2P ๋ฒ„ํด๋ฆฌ์†Œ์ผ“ : ๋ฒ„ํด๋ฆฌ ๋Œ€ํ•™๊ต์—์„œ ๊ฐœ๋ฐœํ•œ UNIX Socker API IP IP Address IPv4 32bit IPv6 128bit (64bit : network prefix, 64bit : host network identifier) Network identifier + Interface identifier ์ข…๋ฅ˜ : unicast, anycast, link-local, multicast ::1/128 : loopback address Internet ์„ฑ๋Šฅ ์ธํ„ฐ๋„ท ์„ฑ๋Šฅ ์ง€ํ‘œ ์†๋„(๋Œ€์—ญํญ, ๋น„ํŠธ์ „์†ก๋ฅ ) ๋‹จ์œ„ : BPS ์ธก์ • ๋„๊ตฌ : iperf ๋งํฌ์˜ ๋Œ€์—ญํญ ์ง€์—ฐ์‹œ๊ฐ„ ๋‹จ์œ„ : sec ์ธก์ • ๋ฐฉ๋ฒ• : ๋‹จ๋ฐฉํ–ฅ ์ง€์—ฐ์‹œ๊ฐ„, RTT ์ธก์ •๋„๊ตฌ : ping, traceroute ์ข…๋ฅ˜ ์ „์†ก ์ง€์—ฐ : 1bit ์ „์†ก์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ์ „ํŒŒ ์ง€์—ฐ ํ์ž‰ ์ง€์—ฐ : ์ปดํ“จํ„ฐ / ๋ผ์šฐํ„ฐ์—์„œ ์ฒ˜๋ฆฌ๋˜๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„ ์ฒ˜๋ฆฌ ์ง€์—ฐ : ํŒจํ‚ท ํ—ค๋” ๋˜๋Š” ๊ฒฝ๋กœ ํ…Œ์ด๋ธ” ์ฐพ๋Š” ์‹œ๊ฐ„ ์†์‹ค๋ฅ  ๋‹จ์œ„ : % ์ธก์ • ๋ฐฉ๋ฒ• : ์‹คํŒจํ•œ ํŒจํ‚ท ์ˆ˜ / ์ „์†กํ•œ ํŒจํ‚ท ์ˆ˜ ์ธก์ • ๋„๊ตฌ : ping ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋ฐฉ๋ฒ• HAR(HTTP ARchive format) ํŒŒ์ผ ๋ถ„์„ ๋ธŒ๋ผ์šฐ์ € <-> ์‚ฌ์ดํŠธ ๊ฐ„์˜ ํ†ต์‹  ๋‚ด์—ญ์„ JSONํ˜•ํƒœ๋กœ ์ €์žฅํ•œ ํŒŒ์ผ Bookmarklet ํ˜„์žฌ ์›น์‚ฌ์ดํŠธ ๋ถ„์„ํ•ด์ฃผ๋Š” ๋ธŒ๋ผ์šฐ์ € add-on ๋ธŒ๋ผ์šฐ์ € ์ตœ์ ํ™” css, js, html ์šฐ์„ ์ˆœ์œ„ ๋ถ€์—ฌ ์˜ˆ์ธกํ•ด์„œ ๋ฏธ๋ฆฌํ•˜๊ธฐ (์ž์› ๊ฐ€์ ธ์˜ค๊ธฐ, DNS, TCP ์—ฐ๊ฒฐ, Web page Rendering) DNS (Domain Name System) Domain ์ด๋ฆ„ -> IP ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ dig ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด dns ์ •๋ณด ํ™•์ธ ๊ฐ€๋Šฅ ํฌํŠธ๋ฒˆํ˜ธ : 53 Slammer Worm DNS ์„œ๋ฒ„ ๊ณต๊ฒฉ DNS ๋™์ž‘ ๋ฐฉ์‹ UDP(<= 512B),TCP(> 512B) PORT : 53 DNS Query Type A : IPv4 ์ฃผ์†Œ AAAA : IPv6 ์ฃผ์†Œ CNAME : ๋ณ„์นญ TLD (Top Level Domain) ๋งจ๋’ค์— ๋ถ™๋Š” ๋„๋ฉ”์ธ (.com, .net, .org ๋“ฑ๋“ฑ) Authoritative DNS Server DNS ์ •๋ณด์™€ ํ•ด๋‹น IP ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์„œ๋ฒ„ DNS Caching DDNS (Dynamic DNS) IP์ฃผ์†Œ๊ฐ€ ๊ฐฑ์‹ ๋˜๋ฉด DNS ์ •๋ณด ๊ฐฑ์‹  (๊ฐ€์ •์˜ ๊ณต์œ ๊ธฐ) DNS ๊ณต๊ฒฉ DNS Sppofing, DNS cache poisoning, Phising DNSSEC (DNS Security Extensions) ๋ฐ์ดํ„ฐ ์œ„์กฐ-๋ณ€์กฐ ๊ณต๊ฒฉ ๋ฐฉ์ง€ ํ‘œ์ค€๊ธฐ์ˆ  ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™”๋ฐฉ์‹์˜ ์ „์ž์„œ๋ช… ๋„์ž… DoH (DNS over HTTPS) DNS ์ •๋ณด๋ฅผ jsonํ˜•์‹์œผ๋กœ ๋งŒ๋“ค์–ด HTTPS ์ „์†ก DNS over TLS DNS ์ •๋ณด๋ฅผ TLS๋กœ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ „์†ก SNI (Server Name Indication) : ๋„๋ฉ”์ธ ์ •๋ณด TLS์—์„œ๋Š” SNI๋ฅผ ์•”ํ˜ธํ™”ํ•˜์ง€ ์•Š์Œ ํฌํŠธ๋ฒˆํ˜ธ: 853 P2P ๋‘ ๋ฐฉ์‹์˜ ๋น„๊ต 1๊ฐœ์˜ ์„œ๋ฒ„ N๊ฐœ์˜ file $u_s$: ์„œ๋ฒ„ ์—…๋กœ๋“œ ๋Œ€์—ญํญ $d_i$: i๋ฒˆ์งธ peer์˜ ๋‹ค์šด๋กœ๋“œ ๋Œ€์—ญํญ Client-Server ๋ฐฉ์‹ ๋ฐฐํฌ ์‹œ๊ฐ„ $$ d_{cs} = max(\frac{NF}{u_s},\ \frac{F}{min(d_i)}) $$ P2P ๋ฐฉ์‹ ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๋Š” ์‹œ๊ฐ„ $$ d*{p2p} = max(\frac{F}{u_s},\ \frac{F}{min(d*{i})},\ \frac{NF}{u_s+\sum{u_i}}) $$ BitTorrent ํŒŒ์ผ์„ 256KB chunks๋กœ ๋ถ„ํ•  Distributed Hash Table (DHT) ๋ถ„์‚ฐ P2P DB key: hash(content), value: IP address ์ธ์ ‘ํ•œ ์ด์›ƒ์—๊ฒŒ ํ‚ค๋ฅผ ํ• ๋‹น Circular DHT ๊ฐ ํ”ผ์–ด๋Š” ์ธ์ ‘ ๋…ธ๋“œ๋งŒ ์•Œ๊ณ ์žˆ์Œ Skype ์‚ฌ์šฉ์ž ๊ฐ„ P2Pํ†ต์‹  FTP, SMTP ๋ฉ”์ผ๊ด€๋ จ ํ”„๋กœํ† ์ฝœ SMTP: ์ด๋ฉ”์ผ ์„œ๋ฒ„ ์ „์†ก ํ”„๋กœํ† ์ฝœ POP3, IMAP, HTTP: ์ด๋ฉ”์ผ ์„œ๋ฒ„ ์ ‘๊ทผ ํ”„๋กœํ† ์ฝœ telnet ํฌํŠธ๋ฒˆํ˜ธ: 23 ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์ „์†ก๊ณ„์ธต TCP segment ์‹ ๋ขฐ์„ฑ: ์˜ค๋ฅ˜ ํƒ์ง€/๋ณต๊ตฌ, ์ˆœ์„œ ์ „์†ก, ์ค‘๋ณต ์ œ๊ฑฐ ํ๋ฆ„์ œ์–ด: ์ˆ˜์‹ ์ž์˜ ์ƒํƒœ์— ๋”ฐ๋ฅธ ์ „์†ก๋Ÿ‰ ์กฐ์ ˆ ํ˜ผ์žก์ œ์–ด: ๋„คํŠธ์›Œํฌ+์ˆ˜์‹ ์ž์˜ ํ˜ผ์žก์ƒํƒœ์— ๋”ฐ๋ฅธ ์ „์†ก๋Ÿ‰ ์กฐ์ ˆ ์—ฐ๊ฒฐ๊ด€๋ฆฌ UDP segment ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค, ๋น ๋ฅด๋‹ค, ๋‹จ์ˆœํ•œ๋‹ค checksum : ์˜ค๋ฅ˜ ๊ฒ€์ถœ ๊ฐ€๋Šฅ ๊ณตํ†ต ์ง€์—ฐ์‹œ๊ฐ„, ๋Œ€์—ญํญ์€ ๋ณด์žฅ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค Stop-and-Wait ARQ ์†ก์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ: 0 or 1 ์ˆ˜์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : 1 ์„ฑ๋Šฅ $$d_{trans}=\frac{L}{R}$$ $$U_{sender}=\frac{d_{trans}}{RTT+d_{trans}}$$ Go-Back-N ARQ ์†ก์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : $2^m - 1$ ์ˆ˜์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : 1 Selective Repeat ARQ ์†ก์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : $2^{m - 1}$ ์ˆ˜์‹ ์ž ์œˆ๋„์šฐ ํฌ๊ธฐ : $2^{m - 1}$ TCP TCP ๊ฐœ์š” ์—ฐ๊ฒฐ ์ง€ํ–ฅ์  ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์ „์†ก pipelining : ๋ณ‘๋ ฌ ์ „์†ก Full duplex data : ๋™์ผ ์—ฐ๊ฒฐ์—์„œ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ์ „์†ก flow control byte๋‹จ์œ„ ์˜ stream ์ „์†ก TCP Segment Timeout ์„ค์ • ์ ๋‹นํ•œ tcp timeout ๊ฐ’ ์„ค์ • ํ•„์š” RTT๋ณด๋‹ค ๊ธธ์–ด์•ผํ•จ ๋„ˆ๋ฌด ์งง์œผ๋ฉด ๋ถˆํ•„์š”ํ•œ ์žฌ์ „์†ก, ๋„ˆ๋ฌด ๊ธธ๋ฉด ์„ธ๊ทธ๋จผํŠธ ์†์‹ค RTT ์ธก์ • $$EstimatedRTT = (1-\alpha)EstimatedRTT + \alpha SampleRTT$$ ๋ณดํ†ต $\alpha$ : 0.125 ์˜ค์ฐจ ๋ฒ”์œ„ ๊ณ„์‚ฐ $$ DevRTT = (1-\beta)DevRTT + \beta |SampleRTT - EstimatedRTT| $$ Timeout Interval ๋„์ถœ $$ TimeoutInterval = EstimatedRTT + 4*DevRTT $$ TCP ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์ „์†ก cumulative acks pipelined segments timeout -> ์žฌ์ „์†ก duplicate acks -> ์žฌ์ „์†ก TCP Flow control control ๋™์ž‘์›๋ฆฌ RcvWindow : ์†ก์‹ ์ž ์ตœ๋Œ€ ์ „์†กํฌ๊ธฐ RcvWindow๋งŒํผ buffer ๋‚ด spare room์œผ๋กœ ํ•œ๋‹ค TCP ์—ฐ๊ฒฐ ๊ด€๋ฆฌ (3-way handshake) ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹œ๋‚˜๋ฆฌ์˜ค client->server : FIN server->client : ACK + FIN client->server : ACK Socket Programming ์†Œ์ผ“ ์‘์šฉ ํ”„๋กœ์„ธ์Šค์™€ ์ „์†ก ๊ณ„์ธต ์‚ฌ์ด์˜ API ์—ฌ๋Ÿฌ๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ์™€ ํ†ต์‹  Multiprocess context switch ๋น„์šฉ ๋ฐœ์ƒ, IPC ํ†ต์‹  Multithread context switch ๋น„์šฉ ๋ฐœ์ƒ Select ์—ฌ๋Ÿฌ Socket I/O ๋™์‹œ ์ฒ˜๋ฆฌ ๋น„ํšจ์œจ์ ์ด๋‹ค Async ๋น ๋ฅด๋‹ค ๋ณต์žกํ•œ ์ฝ”๋“œ, ์–ด๋ ค์šด ๋””๋ฒ„๊น… WebSocket ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ๊ฐ€๋Šฅ Socket.io Node.js ๊ธฐ๋ฐ˜์˜ WebSocket ๊ตฌํ˜„์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Data Link ๊ณ„์ธต ๋งํฌ ๊ณ„์ธต์˜ ์—ญํ•  ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์˜ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ๋งํฌ์ œ์–ด, ๋‹ค์ค‘์ ‘๊ทผ, ํ๋ฆ„์ œ์–ด, ์—๋Ÿฌ์ œ์–ด MAC ์ฃผ์†Œ ๋””๋ฐ”์ด์Šค ๊ณ ์œ ์˜ ์‹๋ณ„์ž, 48bit CIDR ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  Class(A, B, C) ๋‹จ์œ„ ํ• ๋‹น์— ๋”ฐ๋ฅธ ๋น„ํšจ์œจ์ ์ธ ์ฃผ์†Œ ๊ด€๋ฆฌ BGP ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ” ๊ฐœ์ˆ˜ ์ตœ์†Œํ™” ์˜ˆ์‹œ (172.16.150.115/22) ์ฃผ์†Œ ๊ฐœ์ˆ˜ : $2^{32-22}-2$ = 1024 - 2 = 1022 ์ฒซ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ์ฃผ์†Œ๋Š” ํŠน์ˆ˜๋ชฉ์  IP๋ผ์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ : 172.16.148.0/22 ์ฃผ์†Œ ๊ณต๊ฐ„ : 172.16.148.0 ~ 172.16.151.255 ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ฃผ์†Œ : 172.16.151.255 Network ๊ณ„์ธต - IP Network ๊ณ„์ธต์˜ ์—ญํ•  IP ํŒจํ‚ท ์†ก์ˆ˜์‹ , IP ํŒจํ‚ท ์ „๋‹ฌ, IP ๊ฒฝ๋กœ ์ฐพ๊ธฐ Fragmentation MTU(Maximum Transfer Unit) : ๋งํฌ ๊ณ„์ธต ํ”„๋ ˆ์ž„ ํฌ๊ธฐ ์ œํ•œ Ethernet : 1500B MTU ๋ณด๋‹ค ํฐ IP ํŒจํ‚ท์„ ํŒŒํŽธํ™”, ๋ชฉ์ ์ง€์—์„œ ์žฌ์กฐ๋ฆฝ TTL ๋ผ์šฐํŒ… ๋ฃจํ”„ ๋ฐฉ์ง€, 0์ด ๋˜๋ฉด ํ๊ธฐ traceroute : TTL์„ ์ด์šฉํ•œ ๋„๊ตฌ IP Options IPv4 IPv4 datagram format IP Options Record route, MTU probe/reply, timestamp IHL(Header Length): IP ํ—ค๋” ๊ธธ์ด IP Options ํ•„๋“œ์˜ ์ตœ๋Œ€๊ธธ์ด๋Š” ์ตœ๋Œ€ IPํ—ค๋”๊ธธ์ด 60B - IHLํ•„๋“œ ์ตœ์†Œ๊ฐ’ 20B = 40B IP Record Route Option: IP ์ฃผ์†Œ ๊ธฐ๋กํ•˜๋Š” ์˜ต์…˜ Subnets ์„œ๋ธŒ๋„ท (Subnets) ๋ผ์šฐํ„ฐ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ง‘ํ•ฉ DHCP ํด๋ผ์ด์–ธํŠธ์˜ IP ์ฃผ์†Œ๋ฅผ ์ž๋™์œผ๋กœ ํ• ๋‹น, ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋กœํ† ์ฝœ Ipv6 Ipv6 datagram format IPv4์™€ ๋น„๊ต no checksum no fragmentation / reassembly no options Ipv4 -> Ipv6 ๋ณ€ํ™˜ tunneling : IPv6 ํŒจํ‚ท์„ IPv4 ํŒจํ‚ท์— ์บก์Аํ™” MiddleBox ์ถœ๋ฐœ์ง€์™€ ๋ชฉ์ ์ง€ ์‚ฌ์ด์—์„œ ip router์˜ ๊ธฐ๋Šฅ์„ ์ œ์™ธํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ค‘๊ฐ„ ์ƒ์ž NAT, Firewalls, Load balancers, Caches Network ๊ณ„์ธต - Routing Routing: ๊ธธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ Routing table : Trie ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฌ์šฉ ๋ฐฉ์‹ : Longest prefix matching Forwarding: ํŒจํ‚ท ์ „๋‹ฌ ๊ธฐ๋Šฅ Forwarding table : ๊ฐ€์žฅ ๊ธด ๊ณตํ†ต prefix๋ฅผ ์ฐพ์•„์„œ ํŒจํ‚ท ์ „๋‹ฌ Switching fabrics ๋ผ์šฐํ„ฐ ๋‚ด๋ถ€์—์„œ ํŒจํ‚ท์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹ 3๊ฐ€์ง€ ์ข…๋ฅ˜ : Memory, Bus, Crossbar ์ž…๋ ฅ ํฌํŠธ์—์„œ์˜ ๋ฌธ์ œ ์ž…๋ ฅ ํฌํŠธ์˜ ์†๋„ > ์Šค์œ„์น˜ ์†๋„ -> ํ์ž‰ ์ง€์—ฐ ๋ฐœ์ƒ Head-of-line(HoL) blocking : ํ์ž‰ ์ง€์—ฐ์œผ๋กœ ์ธํ•ด ๋‹ค๋ฅธ ํŒจํ‚ท๋“ค๋„ ์ง€์—ฐ๋˜๋Š” ํ˜„์ƒ ์ถœ๋ ฅ ํฌํŠธ์—์„œ์˜ ๋ฌธ์ œ ์Šค์œ„์น˜ ์†๋„ > ์ถœ๋ ฅ ํฌํŠธ์˜ ์†๋„ -> ํŒจํ‚ท ์†์‹ค ๋ฐœ์ƒ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ด๋ฏธ ๋Œ€๊ธฐ ์ค‘์ธ ํŒจํ‚ท์„ ํ๊ธฐ ์ƒˆ๋กœ ๋„์ฐฉํ•œ ํŒจํ‚ท์„ ํ๊ธฐ scheduling policy : FIFO, Round Robin ๋“ฑ๋“ฑ Transport ๊ณ„์ธต - ํ˜ผ์žก ์ œ์–ด ํ˜ผ์žก์ œ์–ด ๊ฐœ์š” Congestion : ๋„คํŠธ์›Œํฌ์˜ ์ฒ˜๋ฆฌ๋Ÿ‰ < ๋ฐ์ดํ„ฐ ์ „์†ก๋Ÿ‰ ํ˜ผ์žก ํƒ์ง€ : ์žฌ์ „์†ก ํƒ€์ด๋จธ, ์ค‘๋ณต ACK -> ํŒจํ‚ท ์†์‹ค cwnd : congestion window size Van Jacobson์ด ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นจ MSS(Maximum Segment Size): ์„ธ๊ทธ๋จผํŠธ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ (๋ฐ์ดํ„ฐ๋งŒ ํฌํ•จ) MTU(Maximum Transfer Unit): ์ตœ๋Œ€ ์ „์†ก ํฌ๊ธฐ ํ˜ผ์žก ์ œ์–ด ๋ฐฉ๋ฒ• AIMD Additive Increase Multiplicative Decrease ๋งค RTT๋งˆ๋‹ค cwnd 1MSS ์”ฉ ์ฆ๊ฐ€ ํŒจํ‚ท ์†์‹ค ๊ฐ์ง€ : cwnd ์ ˆ๋ฐ˜์œผ๋กœ ๊ฐ์†Œ Slow Start ์ดˆ๊ธฐ cwnd: 1 or 10 MSS ๋งค RTT๋งˆ๋‹ค cwnd 2๋ฐฐ๋กœ ์ฆ๊ฐ€ ํŒจํ‚ท ์†์‹ค์‹œ window size = 1 ํ˜ผ์žก ์ œ์–ด ์ •์ฑ… TCP Tahoe ์ฒ˜์Œ์—๋Š” Slow Start, ์ดํ›„์—๋Š” AIMD 3 duplicate ACKs ๋˜๋Š” timeout ๋ฐœ์ƒ ์‹œ ์ž„๊ณ„์  = window size/2 window size = 1 TCP Reno Tahoe์™€ ๋น„์Šทํ•˜๋‹ค timeout ๋ฐœ์ƒ์‹œ ์ž„๊ณ„์ ์€ ๊ทธ๋Œ€๋กœ window size = 1 3 duplicate Acks์ธ ๊ฒฝ์šฐ ์ž„๊ณ„์  = window size/2 window size = window size/2 TCP CUBIC K: window size๊ฐ€ Wmax์ธ ์‹œ์  K ๊ทผ์ฒ˜์—์„œ ๋А๋ฆฌ๊ฒŒ ์ฆ๊ฐ€ K ๋ฉ€๋ฆฌ์—์„œ ๋น ๋ฅด๊ฒŒ ์ฆ๊ฐ€ TCP BBR BBR: Bottleneck Bandwidth and RTT NAT ๊ณต์œ ๊ธฐ IP ์ฃผ์†Œ ๋ณ€ํ™˜ public IP <-> private IP ์ฃผ์†Œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํฌํŠธ๋„ ๋ฐ”๋€๋‹ค ๊ณต์œ ๊ธฐ addr-port mapping table์˜ ์ƒ์„ฑ๊ณผ ์‚ญ์ œ ๋‚ด๋ถ€->์™ธ๋ถ€ ์ƒ์„ฑ : TCP/UDP ์ตœ์ดˆ ํŒจํ‚ท ์†ก์‹  ํ›„ ์‚ญ์ œ : ํƒ€์ด๋จธ/TCP ์—ฐ๊ฒฐ ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ํ›„ ์™ธ๋ถ€->๋‚ด๋ถ€ ์ƒ์„ฑ : ๋‚ด๋ถ€์—์„œ ํŠธ๋ž˜ํ”ฝ ์ƒ์„ฑ ๋˜๋Š” ์ˆ˜๋™ ์‚ญ์ œ : ํƒ€์ด๋จธ/TCP ์—ฐ๊ฒฐ ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ํ›„ ๋˜๋Š” ์ˆ˜๋™ ํฌํŠธ ํฌ์›Œ๋”ฉ : ๊ณต์œ ๊ธฐ ๋‚ด๋ถ€์˜ ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํฌํŠธ(TCP) ๊ฐœ๋ฐฉ ๊ธฐ๋Šฅ ๊ณต์œ ๊ธฐ ์ •๋ณด ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด : netstat -rn, ifconfig, iptables -t nat -L -vn ๊ณต์œ ๊ธฐ์˜ ๊ณ„์ธต L7(์‘์šฉ๊ณ„์ธต) : DNS ์„œ๋ฒ„ L3(๋„คํŠธ์›Œํฌ ๊ณ„์ธต) : IP Router + ์ฃผ์†Œ ๋ฒˆ์—ญ๊ธฐ + DHCP L2(๋ฐ์ดํ„ฐ ๋งํฌ ๊ณ„์ธต) : Bridge, ์ด๋”๋„ท ์Šค์œ„์น˜, Wifi L1(๋ฌผ๋ฆฌ ๊ณ„์ธต) IP Routing L3(Network layer) ์—ญํ•  forwarding (data plane): ๋‹จ์ˆœ ํŒจํ‚ท ์ „๋‹ฌ routing (control plane): ํŒจํ‚ท ์ „๋‹ฌ ๊ฒฝ๋กœ ๊ฒฐ์ • control plane์˜ ๊ตฌ์กฐ Per-router control plane : ๋ผ์šฐํ„ฐ๋งˆ๋‹ค ๋ผ์šฐํŒ… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ SDN(Software Defined Networking) : ์ค‘์•™์ง‘์ค‘์‹ ๋ผ์šฐํŒ… ์•Œ๊ณ ๋ฆฌ์ฆ˜ Routing Protocols link state (centralized, global) ์ถœ๋ฐœ์ง€์—์„œ ๋ชฉ์ ์ง€๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐ dijkstra ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ ์‹œ๊ฐ„๋ณต์žก๋„(n๊ฐœ์˜ node) : $O(n^2)$ oscillation ๋ฐœ์ƒ ๊ฐ€๋Šฅ : ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์ด ์ˆ˜๋ ดํ•˜์ง€ ์•Š๋Š” ํ˜„์ƒ distance vector : ์ธ์ ‘ํ•œ ๋ผ์šฐํ„ฐ์—๊ฒŒ๋งŒ ์ •๋ณด ์ „๋‹ฌ ๊ฐ ๋…ธ๋“œ์—์„œ ๋™๊ธฐ์ ์œผ๋กœ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐ bellman-ford ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฌ์šฉ link cost๊ฐ€ ๋ฐ”๋€Œ๋ฉด local dv๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐ, ๋ฐ”๋€ dv๋ฅผ ์ธ์ ‘ node์— ์ „๋‹ฌ count-to-infinity ๋ฌธ์ œ : ๋ผ์šฐํŒ… ๋ฃจํ”„ ํ˜„์ƒ poisoned reverse : count-to-infinity ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• path vector Inter-AS routing protocol ๋ผ์šฐํ„ฐ ์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ๋„ ์ž‘๋™ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ intra-AS routing protocols : RIP, EIGRP, OSPF RIP (Routing Information Protocol) DV algorithm ์‚ฌ์šฉ ๋ฃจํ”„ ํƒ์ง€๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ• : poison reverse ์ด์ œ๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ EIGRP (Enhanced Interior Gateway Routing Protocol) DV ๊ธฐ๋ฐ˜ cisco OSPF (Open Shortest Path First) classic link-state ๋ชจ๋“  OSPF๋ฉ”์‹œ์ง€๋Š” ์ธ์ฆ๋จ Hierarchical routing : local area, backbone ๋‘ ๊ฐœ์˜ ๋ ˆ๋ฒจ๋กœ ๊ตฌ์„ฑ boundary router : AS๊ฐ„ ๋ผ์šฐํ„ฐ local router : local ๋‚ด๋ถ€ ๋ผ์šฐํ„ฐ area border router : local๊ณผ backbone์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ผ์šฐํ„ฐ Inter-AS routing BGP BGP (Border Gateway Protocol): ์ธํ„ฐ๋„ท ์ƒ์˜ AS๊ฐ„ ๋ผ์šฐํŒ… ํ”„๋กœํ† ์ฝœ eBGP : ์ธ์ ‘ํ•œ AS๊ฐ„ ๋ผ์šฐํŒ… ์ •๋ณด ๊ตํ™˜ iBGP : AS ๋‚ด๋ถ€ ๋ผ์šฐํ„ฐ๋“ค์—๊ฒŒ ๋ผ์šฐํŒ… ์ •๋ณด ์ „๋‹ฌ BGP session : BGP routers๋Š” TCP๋กœ ์—ฐ๊ฒฐ๋จ BGP path: prefix + attributes prefix: IP ์ฃผ์†Œ AS-PATH: AS ๋ฆฌ์ŠคํŠธ NEXT-HOP: ๋‹ค์Œ AS๋กœ ํ–ฅํ•˜๋Š” ๋ผ์šฐํ„ฐ ์ฃผ์†Œ BGP messages OPEN : TCP ์—ฐ๊ฒฐ ์„ค์ • UPDATE : ์ƒˆ ๊ฒฝ๋กœ๋ฅผ ๊ณต์‹œ (๋˜๋Š” ์ด์ „ ์—ฐ๊ฒฐ ์ฒ ํšŒ) KEEPALIVE : UPDATES ์—†์ด ์—ฐ๊ฒฐ ์œ ์ง€ NOTIFICATION : ์˜ค๋ฅ˜ ๋ณด๊ณ  BGP ๊ฒฝ๋กœ ์„ ํƒ ๋ฐฉ๋ฒ• ํฐ weight ํฐ local preference ์งง์€ AS-PATH ๊ฐ€๊นŒ์šด NEXT-HOP MED (Multi-Exit Discriminator) Transport ๊ณ„์ธต - ๋ณด์•ˆ TLS(Transport Layer Security) ํ‘œ์ค€ SSL 3.0 -> IETF TLS 1.0 -> TLS 1.2 -> TLS 1.3 HTTPS = TCP + TLS + HTTP Network Security์˜ ๊ตฌ์„ฑ์š”์†Œ Confidentiality (๊ธฐ๋ฐ€์„ฑ) Authentication (์ธ์ฆ) Message Integrity (๋ฌด๊ฒฐ์„ฑ) Access & Availability (๊ฐ€์šฉ์„ฑ) ์•”ํ˜ธํ™” ๋ชจ์Œ (Cipher Suite) ํ‚ค ๊ตํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜: Diffie-Hellman ์ธ์ฆ: RSA (๊ณต๊ฐœํ‚ค) ์•”ํ˜ธํ™”: AES (๋Œ€์นญํ‚ค) ๋ฌด๊ฒฐ์„ฑ: SHA256 (ํ•ด์‹œ) TLS Handshake ํ”„๋กœํ† ์ฝœ์˜ ๊ณผ์ • Client Hello : ๋ฒ„์ „, ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์•”ํ˜ธํ™” ์ข…๋ฅ˜ Server Hello : ์•”ํ˜ธํ™” ์ข…๋ฅ˜ Certificate : ์ธ์ฆ์„œ Server Hello Done Client Key Exchange : Pre-Master Secret ์ƒ์„ฑ ํ›„ ์ „์†ก Change Cipher Spec : ์•”ํ˜ธํ™” ์ข…๋ฅ˜ ์„ ํƒ Change Cipher Spec Finished : ์•”ํ˜ธํ™” ์ข…๋ฅ˜ ์„ ํƒ ์™„๋ฃŒ SSL/TLS ์ธ์ฆ์„œ ์„œ๋น„์Šค ์ •๋ณด : ๋ฐœ๊ธ‰ํ•œ CA, ๋„๋ฉ”์ธ ๋“ฑ CA(Certificate Authority) : ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ธฐ๊ด€ TLS 1.2์™€ TLS 1.3์˜ ๋น„๊ต IP ๊ณ„์ธต - ๋ณด์•ˆ ์•”ํ˜ธํ†ต์‹  - IP Sec IP ํŒจํ‚ท์—์„œ encryption, authentication, integrity 2๊ฐ€์ง€ ๋ชจ๋“œ transport mode: 1๊ฐœ์˜ datagram payload๋งŒ ์•”ํ˜ธํ™” tunnel mode: ์ „์ฒด datagram์ด encrypted, authenticated ํ”„๋กœํ† ์ฝœ AH(Authentication Header): ์ธ์ฆ, ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ ESP(Encapsulating Security Payload): ์ธ์ฆ, ๋ฌด๊ฒฐ์„ฑ, ๊ธฐ๋ฐ€์„ฑ ๋ณด์žฅ SAs(Security Associations) ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „ SA ์ƒ์„ฑ IP: ๋น„์—ฐ๊ฒฐ์„ฑ, IPsec: ์—ฐ๊ฒฐ์„ฑ SPI(Security Parameter Index): SA๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฐ’ IPsec datagram (tunnel mode, ESP) ESP trailer: block ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ padding ESP header IKE (Internet Key Exchange) ๊ธฐ์กด ๋ฐฉ์‹ : ์ˆ˜๋™ ํ‚ค๋กœ IPSec SA๋ฅผ ์ƒ์„ฑ endpoint๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ์ˆ˜๋™ ํ‚ค ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›€ -> IPsec IKE ์‚ฌ์šฉ ์•”ํ˜ธ ํ†ต์‹  - ๋Œ€์นญํ‚ค, ๊ณต๊ฐœํ‚ค, ์ „์ž์„œ๋ช… ์•”ํ˜ธ (cryptography) ๊ธฐ์ดˆ ์šฉ์–ด m : ํ‰๋ฌธ $K_A(m)$: ์•”ํ˜ธ๋ฌธ m = $K_B(K_A(m))$ : ๋ณตํ˜ธํ™” Symmetric key cryptography (๋Œ€์นญํ‚ค ์•”ํ˜ธํ™”) ์•”ํ˜ธํ™”, ๋ณตํ˜ธํ™”์— ๊ฐ™์€ ํ‚ค ์‚ฌ์šฉ ๋‹จ์ˆœ ์•”ํ˜ธํ™” ๋ฐฉ๋ฒ• substitution cipher : ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ์น˜ํ™˜ ์ข€ ๋” ์ •๊ตํ•œ ๋ฐฉ๋ฒ• cyclic cipher : ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ์น˜ํ™˜ํ•˜๊ณ , ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟˆ DES(Data Encryption Standard) 56bit symmetric key, input : 64bit ํ•˜๋ฃจ์— ์•ˆ ์ฑ„์›Œ์ง€๋Š” ์‹œ๊ฐ„์— ๋šซ๋ฆผ 3DES : 3๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๋กœ 3๋ฒˆ ์•”ํ˜ธํ™” AES(Advanced Encryption Standard) 128bit, 192bit, 256bit key input: 128bit AES๋Š” DEC๋ณด๋‹ค ๊ฒฌ๊ณ ํ•˜๋‹ค Public Key Cryptography (๊ณต๊ฐœํ‚ค) ๊ณต๊ฐœํ‚ค: ์•”ํ˜ธํ™”, ๊ฐœ์ธํ‚ค: ๋ณตํ˜ธํ™” ๋Œ€์นญํ‚ค๋ณด๋‹ค ๋А๋ฆฌ๋‹ค HTTPS = ๊ณต๊ฐœํ‚ค(ํ‚ค ๊ตํ™˜) + ๋Œ€์นญํ‚ค (์•”ํ˜ธํ™”) RSA ์•”ํ˜ธํ™” ๋ฐฉ์‹ ํŠน์ง• $K_B^-(K_B^+(m)) = m$ ๊ณต๊ฐœํ‚ค $K_B^+$๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๊ฐœ์ธํ‚ค $K_B^-$๊ฐ€ ๊ณ„์‚ฐ ๋ถˆ๊ฐ€๋Šฅ ํ•ด์•ผํ•œ๋‹ค. $K_B^-(K_B^+(m)) = m = K_B^+(K_B^-(m))$ ๋ฐฉ๋ฒ• ๋””์ง€ํ„ธ ์„œ๋ช… ์„œ๋ช…ํ•œ ์‚ฌ๋žŒ์˜ ์ธ์ฆ ์šฉ๋„ ๊ณต๊ฐœํ‚ค ํ™œ์šฉ ์ธ์ฆ์„œ ์ „์ž์„œ๋ช…๋งŒ์œผ๋กœ ์†ก์‹ ์ž์˜ ์‹ ์› ํ™•์ธ ๋ถˆ๊ฐ€๋Šฅ ๋‚ด์šฉ: ์‹ ์›์ •๋ณด, ๊ณต๊ฐœํ‚ค, ์œ ํšจ๊ธฐ๊ด€, ์ธ์ฆ๊ธฐ๊ด€์ •๋ณด, ์ „์ž์„œ๋ช… ํ‘œ์ค€ ๊ทœ๊ฒฉ : X.509 X.509 .der ํ˜น์€ .pem ํ™•์žฅ์ž ํŒŒ์ผ ์•”ํ˜ธํ†ต์‹  - ๋ฌด๊ฒฐ์„ฑ ์ „์ž ์„œ๋ช…์˜ ๋ฌด๊ฒฐ์„ฑ (A->B) m์— A๊ฐ€ ์œ ์ผํ•˜๊ฒŒ ์„œ๋ช…์„ ํ•ด์•ผํ•œ๋‹ค. A๋Š” m`์ด ์•„๋‹Œ m์—๋งŒ ์„œ๋ช…์„ ํ•ด์•ผํ•œ๋‹ค. ํ•ด์‹œ ํ•จ์ˆ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : MD5, SHA-1 ์•”ํ˜ธํ†ต์‹  - Firewall ๋ชฉ์  ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ ๋ฐฉ์ง€ (SYN flooding: ๊ฐ€์งœ TCP ์—ฐ๊ฒฐ์„ ์ƒ์„ฑ) ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ์˜ ๋ถˆ๋ฒ• ์ˆ˜์ •/์ ‘๊ทผ ๋ฐฉ์ง€ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•œ ๊ถŒํ•œ ์žˆ๋Š” ์•ก์„ธ์Šค๋งŒ ํ—ˆ์šฉ ํ•œ๊ณ„ IP spoofing: IP ์ฃผ์†Œ๋ฅผ ์œ„์กฐํ•˜์—ฌ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์— ์ ‘๊ทผํ•˜๋Š” ๊ณต๊ฒฉ Stateless packet filtering ํŒจํ‚ท ๋‹จ์œ„๋กœ ํŒจํ‚ท์„ ํ•„ํ„ฐ๋ง ํ•„ํ„ฐ๋ง ํ•˜๋Š” ๊ธฐ์ค€ : source IP, dest IP, TCP/UDP source, port ๋“ฑ ACL(Access Control List) : ํ—ˆ์šฉ/์ฐจ๋‹จ ๋ชฉ๋ก Stateful packet filtering TCP ์—ฐ๊ฒฐ๋งˆ๋‹ค ํŒจํ‚ท ์ƒํƒœ๋ฅผ ์ถ”์  ACL์— check connection column์ด ์ถ”์  ์—ฌ๋ถ€ ๊ฒฐ์ • Application gateway IP/TCP/UDP ํŒจํ‚ท์˜ data field๋ฅผ ํ™•์ธ Intrusion Detection System (IDS) (์นจ์ž… ํƒ์ง€ ์‹œ์Šคํ…œ) deep packet inspection : ํŒจํ‚ท์˜ ๋‚ด์šฉ์„ ํ™•์ธ ํŒจํ‚ท ๊ฐ„ ์ƒ๊ด€๊ด€๊ณ„ ์กฐ์‚ฌ (port scanning, network mapping, Dos attack) multiple IDSs : ์—ฌ๋Ÿฌ IDS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ท์„ ํ™•์ธ ์•”ํ˜ธํ†ต์‹  - email ์˜ˆ์‹œ (Alice๊ฐ€ Bob์—๊ฒŒ ๋ฉ”์ผ์„ ๋ณด๋‚ธ๋‹ค) Confidentiality(๊ธฐ๋ฐ€์„ฑ) Alice ๋Œ€์นญํ‚ค K ์ƒ์„ฑ K๋กœ ๋ฉ”์‹œ์ง€ ์•”ํ˜ธํ™”, K๋กœ ๋ฉ”์‹œ์ง€ ์•”ํ˜ธํ™” K๋ฅผ Bob์˜ ๊ณต๊ฐœํ‚ค๋กœ ์•”ํ˜ธํ™” ์•”ํ˜ธํ™” ๋œ K์™€ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ Bob K๋ฅผ Bob์˜ ๊ฐœ์ธํ‚ค๋กœ ๋ณตํ˜ธํ™” K๋กœ ๋ฉ”์‹œ์ง€ ๋ณตํ˜ธํ™” Integrity (๋ฌด๊ฒฐ์„ฑ), Authentication(์ธ์ฆ) Alice ๋ฉ”์‹œ์ง€ Hash์— Alice์˜ ๊ฐœ์ธํ‚ค๋กœ ๋””์ง€ํ„ธ ์„œ๋ช… ๋ฉ”์‹œ์ง€์™€ ๋””์ง€ํ„ธ ์„œ๋ช…์„ ์ „๋‹ฌ Bob ๋ฉ”์‹œ์ง€ hash๋ฅผ Alice์˜ ๊ณต๊ฐœํ‚ค๋กœ ๋ณตํ˜ธํ™” ๋””์ง€ํ„ธ ์„œ๋ช…๊ณผ ๋ฉ”์‹œ์ง€ hash๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ PGP (Pretty Good Privacy) ๋ฉ”์ผ์„ ์•”ํ˜ธํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ AES256(๋Œ€์นญํ‚ค) ์‚ฌ์šฉ S/MIME (Secure/Multipurpose Internet Mail Extensions) ๋ฉ”์ผ์„ ์•”ํ˜ธํ™”ํ•˜๋Š” ์‹œ์Šคํ…œ ์•”ํ˜ธํ™” + ๋””์ง€ํ„ธ ์„œ๋ช… = Confidentiality + Integrity + Authentication Multimedia streaming RTSP (Real-Time Streaming Protocol) RTMP (Real-Time Messaging Protocol) HLS (HTTP Live Streaming) ๋น„๋””์˜ค/์˜ค๋””์˜ค ์กฐ๊ฐ ํŒŒ์ผ HTTP ์ „์†ก ์ธ์ฝ”๋”ฉ : H.26 ์กฐ๊ฐํ™” : 6์ดˆ ์ •๋„ HTTP : TCP ๋ฒ„ํผ๋ง ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„ ๋ชฉ์ ์—๋Š” ๋ถ€์ ํ•ฉ MPEG-DASH (Dynamic Adaptive Streaming over HTTP) RTMP WebRTC Plug-in ์—†์ด ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์Œ์„ฑ/์˜์ƒ/P2P ๊ณต์œ  ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ‘œ์ค€ API P2P ์ž‘๋™ ๋ฐฉ์‹ STUN, TURN, ICE์™€ ๊ฐ™์€ NAT Traversal ๊ธฐ์ˆ  ์‚ฌ์šฉ ์‹ ํ˜ธ ๋ฉ”์‹œ์ง€ : Socket.io, ์›น์†Œ์ผ“, AJAX long polling STUN (Session Traversal Utilities for NAT) STUN ์„œ๋ฒ„์—์„œ ๊ณต์ธ IP ์ฃผ์†Œ ์ •๋ณด์™€ port๋ฒˆํ˜ธ ์งˆ์˜ ์‘๋‹ต TURN (Traversal Using Relays around NAT) ํ”ผ์–ด ๊ฐ„์— ํŠธ๋ž˜ํ”ฝ ๋ฆด๋ ˆ์ด ์„œ๋ฒ„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋™์ผํ•œ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์— ์œ„์น˜ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ ICE (Interactive Connectivity Establishment) ๋ธŒ๋ผ์šฐ์ €๊ฐ€ Peer๋ฅผ ํ†ตํ•œ ์—ฐ๊ฒฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ Wireless and Mobile Networks Elements of a wireless network base station : ์œ ์„  ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ relay: ๋กœ์ปฌ์—์„œ ์œ ์„  ๋„คํŠธ์›Œํฌ์™€ ๋ฌด์„  ํ˜ธ์ŠคํŠธ ๊ฐ„์— ํŒจํ‚ท ์ „์†ก์„ ๋‹ด๋‹น wireless link : ๋ชจ๋ฐ”์ผ์„ ๊ธฐ์ง€๊ตญ์— ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ infrastructure mode : ๊ธฐ์ง€๊ตญ์€ ํ•ธ๋“œํฐ์„ ์œ ์„  ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ handoff : ๋ชจ๋ฐ”์ผ์—์„œ AP๋ฅผ ๋ฐ”๊พธ๋ฉด์„œ ํ†ต์‹  ad hoc mode : ๊ธฐ์ง€๊ตญ ์—†์ด ๋ชจ๋ฐ”์ผ ๊ฐ„์— ํ†ต์‹  ๋ฌด์„  ํ†ต์‹ ์˜ ํŠน์ง• ์œ ์„  ๋Œ€๋น„ ์•ฝํ•œ ์‹ ํ˜ธ ๋‹ค๋ฅธ ๋ฌด์„  ์žฅ์น˜์™€์˜ ๊ฐ„์„ญ ๋‹ค์ค‘ ๊ฒฝ๋กœ ์ „ํŒŒ SNR(Signal to Noise Ratio) : ์‹ ํ˜ธ ๋Œ€ ์žก์Œ๋น„ BER(Bit Error Rate) : ๋น„ํŠธ ์˜ค๋ฅ˜์œจ Hidden terminal problem : A-B, B-C ๊ฐ€๋Šฅ A-C ๋ถˆ๊ฐ€๋Šฅ 802.11 LAN base station๊ณผ ๋ฌด์„  host๊ฐ„์˜ ํ†ต์‹  Infrastructure ๋ชจ๋“œ์˜ BSS(Basic Service Set)์— ํฌํ•จ๋˜๋Š” ๊ฒƒ Wireless hosts AP (base station) ad hoc mode: hosts only CSMA : ์ „์†ก ์ „ ์ถฉ๋Œ ๊ฒ€์‚ฌ -> ์ถฉ๋Œ ๊ฐ์ง€๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ ๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ Sense channel์ด DIFS์— ๋Œ€ํ•ด idleํ•˜๋ฉด ํ”„๋ ˆ์ž„์„ ์ „์†ก Sense channel์ด busyํ•˜๋ฉด random backoff ํ›„ ack๊ฐ€ ์˜ค์ง€ ์•Š์œผ๋ฉด backoff๋ฅผ ์ฆ๊ฐ€, 2๋ฒˆ ๋ฐ˜๋ณต ๋ฐ›๋Š” ์‚ฌ๋žŒ ํ”„๋ ˆ์ž„์„ ๋ฐ›์œผ๋ฉด SIFS ํ›„ ack ์ „์†ก CA sender๊ฐ€ ์ž‘์€ RTS(Request to Send) ํ”„๋ ˆ์ž„์„ BS๋กœ ์ „์†ก (CSMA ์‚ฌ์šฉ) BS broadcasts CTS(Clear to Send) to sender (CTS๊ฐ€ ๋ชจ๋“  ๋…ธ๋“œ์—๊ฒŒ ์ „๋‹ฌ) sender๊ฐ€ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„ ์ „์†ก, ๋‹ค๋ฅธ station์€ ์ „์†ก ์ง€์—ฐ advanced capabilities Rate adaptation : SNR(์‹ ํ˜ธ๋Œ€ ์žก์Œ๋น„)์™€ BER(๋น„ํŠธ ์˜ค๋ฅ˜์œจ)์„ ์ธก์ •ํ•˜์—ฌ ์ „์†ก๋ฅ ์„ ์กฐ์ ˆ CDMA (Code Division Multiple Access) unique code๊ฐ€ ๊ฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ถ€์—ฌ encoding: ์›๋ณธ ๋ฐ์ดํ„ฐ X chipping ์ˆœ์„œ (๋‚ด์  ์—ฐ์‚ฐ) decodding : encoded ๋ฐ์ดํ„ฐ X chipping ์ˆœ์„œ (๋‚ด์  ์—ฐ์‚ฐ) 4G/5G cellular networks ์ตœ๋Œ€ 100Mbps์˜ ์ „์†ก ์†๋„ ๊ธฐ์ˆ  ํ‘œ์ค€ : 3GPP(3rd Generation Partnership Project) Base station(eNodeB) : wifi AP์™€ ์œ ์‚ฌ HSS(Home Subscriber Server) : ์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ MME(Mobility Management Entity) : ์‚ฌ์šฉ์ž ์œ„์น˜ ์ถ”์  S-GW(Serving Gateway) : ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์ „์†ก P-GW(Packet Data Network Gateway) : ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์ „์†ก GTP : GPRS Tunneling Protocol 5G 10๋ฐฐ ๋น ๋ฅธ ์†๋„, ์ง€์—ฐ ์‹œ๊ฐ„ 10๋ฐฐ ๊ฐ์†Œ, 100๋ฐฐ ๋งŽ์€ ์žฅ์น˜ ์—ฐ๊ฒฐ (4G ๋Œ€๋น„)
new ์ธ๊ฐ„-์ปดํ“จํ„ฐ ์ƒํ˜ธ์ž‘์šฉ
๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€
Design Techniques Contextual Inquiry ์‚ฌ์šฉ์ž์˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ๊ด€์ฐฐ Design Funnel ์•„์ด๋””์–ด๋ฅผ ํ™•์žฅํ•จ๊ณผ ๋™์‹œ์— ์ถ•์†Œ ์‹œํ‚ด์œผ๋กœ์„œ ๊ฒฐ๊ณผ ๋„์ถœ Double Diamond Discover -> Define -> Develop -> Deliver Storyboarding ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ Prototyping ๋””์ž์ธ์„ ํ‘œํ˜„ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๊ตฌํ˜„ ์ข…๋ฅ˜: Low-fidelity(์ถฉ์‹ค๋„๊ฐ€ ๋‚ฎ์Œ), High-fidelity(์ถฉ์‹ค๋„๊ฐ€ ๋†’์Œ) User Testing In-lab vs On-site Moderated vs Unmoderated : Exploratory vs Assessment Presentation & Communication Needfinding (์š”๊ตฌ์‚ฌํ•ญ ๋„์ถœ) ์šฉ์–ด UI (User Interface) ์ œํ’ˆ์˜ ์‹œ๊ฐ์ ์ธ ์š”์†Œ UX (User Experience) ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ผ๋Š” ๊ฒฝํ—˜ CX (Customer Experience) ๊ณ ๊ฐ์ด ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ ๋А๋ผ๋Š” ์ „๋ฐ˜์ ์ธ ๊ฒฝํ—˜, ์ƒํ’ˆ ๋˜๋Š” ์„œ๋น„์Šค์˜ ๊ตฌ๋งค, ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •์ง“๋Š” ์š”์†Œ SD (Service Design) ์„œ๋น„์Šค๋ฅผ ๋””์ž์ธํ•˜๋Š” ๊ฒƒ HCI (Human-Computer Interaction) ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ตœ๊ณ ์˜ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒ, ์ œ์ž‘, ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ SRS (Software Requirement Specification) ์†Œํ”„ํŠธ์›จ์–ด ์š”๊ตฌ์‚ฌํ•ญ ๋ช…์„ธ์„œ User Requirements, Functional Requirements, Interface Requirements, Performance Requirements… SRS๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ธฐ์ „์— ์‚ฌ์šฉ์ž๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ดํ•ด ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž์˜ ํŠน์„ฑ์„ ์ดํ•ด : ์—ญํ• , ๊ฐœ์„ฑ ์ดํ•ด๊ด€๊ณ„์ž(stakeholders)๋ฅผ ๊ณ ๋ ค First degree : ์ง์ ‘์ ์œผ๋กœ ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ Second degree : ์ œํ’ˆ์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์‚ฌ๋žŒ Third degree : ์„œ๋น„์Šค๋ฅผ ์„ค์น˜, ๋ฐฐํฌํ•˜๋Š” ์‚ฌ๋žŒ ๋˜๋Š” ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ ์‚ฌ์šฉ์ž ๋ชฉ์  ํŒŒ์•… Identify the goals involved in the problem Decompose them into subtasks Abstract into goals Contextual Inquiry (์ƒํ™ฉ์  ์กฐ์‚ฌ) Context : ์‚ฌ์šฉ์ž์˜ ํ™˜๊ฒฝ ๊ด€์ฐฐ, ์ถ”์ƒํ™” ๊ธˆ์ง€ Partnership : ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณต๊ฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ ํ–‰๋™๊ณผ ๊ทธ ์ด์œ ๋ฅผ ์งˆ๋ฌธ Interpretation : ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ํ•ด์„์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณต์œ , ์‚ฌ์šฉ์ž์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์Œ Focus : ๋ชฉํ‘œ์— ์ง‘์ค‘ The master-apprentice model (๋„์ œ์‹ ๋ชจ๋ธ) : ์‚ฌ์šฉ์ž(์„ ์ƒ), ๊ด€์ฐฐ์ž(ํ•™์ƒ) Contextual Inquiry๊ฐ€ ์ ์ ˆํ•˜์ง€ ์•Š์„ ๋•Œ Longidual study : ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ์žฅ๊ธฐ๊ฐ„ ๊ด€์ฐฐํ•ด์•ผํ•  ๋•Œ Sporadic behavior : ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์ด ๋ถˆ๊ทœ์น™ํ•  ๋•Œ Large target : ์‚ฌ์šฉ์ž์˜ ๋ฒ”์œ„๊ฐ€ ๊ด‘๋ฒ”์œ„ ํ•  ๋•Œ Diary Study ์‚ฌ์šฉ์ž๊ฐ€ ์ผ์ƒ์ ์œผ๋กœ ํ•˜๋Š” ์ผ์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ ESM (Experience Sampling Method) ์ˆœ๊ฐ„์ ์ธ ํ™œ๋™๊ณผ ๊ฒฝํ—˜์— ์ดˆ์ ์„ ๋งž์ถฐ ๊ธฐ๋ก EMA (Ecological Momentary Assessment) ์‹ฌ๋ฆฌ์  ํ˜„์ƒ์˜ ๊ถค์ , ๋ถ„์‚ฐ, ๋ณ€๋™, ์—ญํ•™์— ์ดˆ์ ์„ ๋งž์ถฐ ๊ธฐ๋ก Survey Participatory Design ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋””์ž์ธ์— ์ฐธ์—ฌํ•˜๋Š” ๊ฒƒ Affinity Diagram (์œ ์‚ฌ๋„ ๋‹ค์ด์–ด๊ทธ๋žจ) ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฒƒ Persona ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๊ฐ€์ƒ์˜ ์ธ๋ฌผ Learnability ์ƒˆ๋กœ์šด UI๋ฅผ ๋ฐฐ์šฐ๋Š” ๋ฐฉ๋ฒ• Learning by Doing Learning by Watching Recognition vs Recall Recognition : ์‹œ๊ฐ์  ์š”์†Œ๋ฅผ ๋ณด๊ณ  ์ธ์ง€ํ•˜๋Š” ๊ฒƒ Recall : ๊ธฐ์–ต์„ ํ†ตํ•ด ์ธ์ง€ํ•˜๋Š” ๊ฒƒ Interaction style Command Language ์ธ๊ณต ์–ธ์–ด์˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅ Self Disclosure (์ž๊ธฐ ๊ณต๊ฐœ) : ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น์–ด๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ Menus and Forms Direct Manipulation ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์‘ ์‹œ๊ฐ์  ํ‘œํ˜„์„ ํ†ตํ•ด ์ƒํ˜ธ์ž‘์šฉ Speech Dialog Mental Model ์‚ฌ๋žŒ๋“ค์ด ์ž๊ธฐ ์ž์‹ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ, ํ™˜๊ฒฝ, ์ž์‹ ์ด ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์‚ฌ๋ฌผ๋“ค์— ๋Œ€ํ•ด ๊ฐ–๋Š” ๋ชจํ˜• ๊ด€์ฐฐ, ์ธํ„ฐ๋ทฐ, ์ž‘์—… ๋ถ„์„์ด ํ•„์š”ํ•˜๋‹ค Conceptual Model ์ œํ’ˆ์ด ์–ด๋– ํ•œ ์›๋ฆฌ๋‚˜ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ดํ•ด Content strategy : ๊ฐ ํŽ˜์ด์ง€์— ๋‚˜ํƒ€๋‚˜๋Š” ๋‚ด์šฉ์˜ ๊ทœ์น™์ด๋‚˜ ๊ฐœ๋…์ด ์กด์žฌํ•˜๋Š”๊ฐ€? Channel starategy : ์ผ๊ด€์ ์ธ ๊ฒฝํ—˜, ์ง€์†์ ์ธ ๊ฒฝํ—˜, ์ƒํ˜ธ ๋ณด์™„์ ์ธ ๊ฒฝํ—˜์„ ๋งŒ๋“ค์–ด๋‚ด๋Š”๊ฐ€? Interaction models : ๋ณดํŽธ์ ์ธ ํŒจํ„ด์„ ์‚ฌ์šฉํ–ˆ๋Š”๊ฐ€?
new Spring - Bean Validation : Annotation์œผ๋กœ Validationํ•˜๊ธฐ
๐Ÿƒ Spring
Bean Validation Annotation์„ ๋‹ฌ์•„์„œ Validation์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฃผ๋กœ jakarta.validation๊ณผ hibernate.validator ๋‘ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Dependency Diagram ๊ตฌ์กฐ spring-boot-starter-validation -> hibernate-validator -> jakarta.validation-api jakarta.validation์—์„œ ์ง€์›ํ•˜๋Š” annotation Annotation Description @NotNull null์ด ์•„๋‹Œ๊ฐ€ ("", " " => ํ†ต๊ณผ) @NotEmpty null์ด ์•„๋‹ˆ๊ณ , size๊ฐ€ 0์ธ๊ฐ€ (" " => ํ†ต๊ณผ) @NotBlank null์ด ์•„๋‹ˆ๊ณ , trimํ•œ ๊ฒฐ๊ณผ๊ฐ€ empty์ธ๊ฐ€ @Size ๋ฌธ์ž์—ด, ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @Min ์ˆซ์ž๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @Max ์ˆซ์ž๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @Email ์ด๋ฉ”์ผ ํ˜•์‹์— ๋งž๋Š”๊ฐ€ @Pattern Regex(์ •๊ทœ์‹)์— ๋งž๋Š”๊ฐ€ @Past ๊ณผ๊ฑฐ์˜ ๋‚ ์งœ์ธ๊ฐ€ @Future ๋ฏธ๋ž˜์˜ ๋‚ ์งœ์ธ๊ฐ€ @Digits ์ •์ˆ˜, ์†Œ์ˆ˜ ์ž๋ฆฟ์ˆ˜๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @DecimalMin, @DecimalMax ์ž๋ฆฟ์ˆ˜๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ (์†Œ์ˆ˜ ์ดํ•˜ ์ž๋ฆฟ์ˆ˜ ํฌํ•จ) @Positive, @PositiveOrZero, @Negative, @NegativeOrZero hibernate.validator์—์„œ ์ง€์›ํ•˜๋Š” annotation Annotation Description @Range ์ˆซ์ž๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ (์†Œ์ˆ˜ ์ดํ•˜ ์ž๋ฆฟ์ˆ˜ ํฌํ•จ) @Length ๋ฌธ์ž์—ด, ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ํ•ด๋‹น ๋ฒ”์œ„์— ์žˆ๋Š”๊ฐ€ @URL URL ํ˜•์‹์— ๋งž๋Š”๊ฐ€ ์–ธ๊ธ‰ํ•œ Annotation๋ง๊ณ  ๋‹ค๋ฅธ Annotation๋„ ์žˆ๋‹ค. Rest Controller์—์„œ ์‚ฌ์šฉ Controller 1public ResponseEntity<Customer> postCustomer(@RequestBody @Valid CustomerDTO customerDTO) {...} @Valid Annotation์„ ๋ถ™์—ฌ์„œ CustomerDTO ๊ฐ์ฒด์— ๋Œ€ํ•œ Validation์„ ์ˆ˜ํ–‰ํ•œ๋‹ค @Valid Annotation์„ ๋ถ™์ด๋Š” ๊ฒƒ์„ ๊นœ๋นกํ•˜์ง€ ๋ง์ž ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์œ„ ์ฝ”๋“œ์˜ Validation์—์„œ ์‹คํŒจํ•˜๋ฉด, MethodArgumentNotValidException์ด ๋ฐœ์ƒํ•œ๋‹ค ํ•ด๋‹น ์˜ˆ์™ธ๋Š” ํ•„๋“œ๋ณ„ ๋ชจ๋“  ์—๋Ÿฌ๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์—„์ฒญ ๊ธธ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณดํ†ต ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ์ถ”์ถœํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค 1processValidationErrors(MethodArgumentNotValidException e) { 2 List<String> errors = e.getBindingResult().getFieldErrors().stream() 3 .map(error -> error.getField() + ": " + error.getDefaultMessage()) 4 .collect(Collectors.toList()); 5 return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST); 6} ์ˆ˜๋™ Validation Controller์—์„œ Validation์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ, ์ˆ˜๋™์œผ๋กœ Validation์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค ์ด๋•Œ, Validator ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์•„์„œ ์‚ฌ์šฉํ•œ๋‹ค 1import jakarta.validation.Validator; 2... 3@Autowired 4private Validator validator; 5... 6var violations = validator.validate(voucher); 7if (!violations.isEmpty()) 8 throw new IllegalArgumentException(violations.stream().findFirst().get().getMessage()); ์ฝ”๋“œ์—์„œ๋Š” voucher ๊ฐ์ฒด์— ๋Œ€ํ•œ Validation์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๊ฐ€ ์žˆ๋‹ค๋ฉด IllegalArgumentException์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค
new DDD(Domain Driven Design)
๐Ÿƒ Spring
๋„๋ฉ”์ธ ํŒจํ„ด์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก  IOC ๊ฐ์ฒด์˜ ์ œ์–ด๊ถŒ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ํ”„๋ ˆ์ž„์›Œํฌ ๋˜๋Š” ์™ธ๋ถ€ ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ๋„˜๊ธฐ๋Š” ๊ฒƒ ๋ชฉ์  ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฐ์†Œ -> ์œ ์—ฐ์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋ฒ• DI(Dependency Injection) Constructor Injection Setter Injection Field Injection DL(Dependency Lookup) Service Locator Event-based callback DI(Dependency Injection) ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ๊ฐ์ฒด ์ž์‹ ์ด ์•„๋‹Œ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ ์žฅ์  ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ์ฆ๊ฐ€ ๊ฐ์ฒด์˜ ์ฑ…์ž„์ด ๋ช…ํ™•ํ•˜๊ณ  ๋‹จ์ˆœํ•จ ๋‹จ์  ์ดˆ๊ธฐ ์„ค์ •, ๊ตฌํ˜„์ด ๋ณต์žกํ•จ ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์ ์— ์˜์กด ๊ฐ์ฒด๊ฐ€ ์—†์œผ๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ DL(Dependency Lookup) ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ๊ฐ์ฒด ์ž์‹ ์ด ์•„๋‹Œ ์™ธ๋ถ€์—์„œ ์ฐพ์•„์˜ค๋Š” ๊ฒƒ ์žฅ์  ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ (DI๋ณด๋‹ค ๋œ ๊ฐ์†Œ) ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์ ์— ์˜์กด ๊ฐ์ฒด๊ฐ€ ์—†์–ด๋„ ์—๋Ÿฌ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•จ ๋‹จ์  ๊ฐ์ฒด์˜ ์ฑ…์ž„์ด ๋ถˆ๋ช…ํ™•ํ•ด์ง ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ๊ฐ์†Œ ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„ ํŒŒ์•…์ด ์–ด๋ ค์›€
new Spring - RESTful API์—์„œ ๋‚ด๋ง˜๋Œ€๋กœ ์—๋Ÿฌ ์‘๋‹ตํ•˜๊ธฐ
๐Ÿƒ Spring
1. ํด๋ž˜์Šค ์ •์˜ 1@Getter 2@RequiredArgsConstructor 3public class ExceptionResponse { 4 private final LocalDateTime timestamp = LocalDateTime.now(); // 2023-08-01T00:00:57.5995502 5 private final int status; // 400 6 private final String error; // MethodArumentNotValidException 7 private final String message; // ์ด๋ฉ”์ผ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค 8 private final String path; // /api/customer 9} ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋ฐฉ์‹๋Œ€๋กœ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค, ์ฃผ์„์—๋Š” ํ•ด๋‹น ํ•„๋“œ์˜ ์˜ˆ์‹œ๋ฅผ ์ ์–ด๋†“์•˜๋‹ค 2. ResponseEntity ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜ ์ •์˜ 1private ResponseEntity<ExceptionResponse> handleException(HttpStatus status, Exception e, HttpServletRequest request) { 2 ExceptionResponse response = new ExceptionResponse( 3 status.value(), e.getClass().getSimpleName(), e.getMessage(), request.getRequestURI()); 4 return new ResponseEntity<>(response, status); 5} ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•  ๋•Œ๋งˆ๋‹ค ExceptionResponse ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์ƒ๊ฒจ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์—ˆ๋‹ค ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ HttpStatus๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋ฐ›์•˜๋‹ค 3. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ 1@ExceptionHandler(NoSuchElementException.class) 2public ResponseEntity<ExceptionResponse> handleNoSuchElementException(NoSuchElementException e, HttpServletRequest request) { 3 return handleException(HttpStatus.NOT_FOUND, e, request); 4} ๋ณธ ํ•จ์ˆ˜๋Š” @RestControllerAdvice๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค์— ์ •์˜๋˜์—ˆ๋‹ค ์ง์ ‘ ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ResponseEntity๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค ์ •๋ฆฌ ์œ„์˜ ์˜ˆ์‹œ๋Š” NoSuchElementException์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, HTTP ์ƒํƒœ์ฝ”๋“œ๋Š” 404, body๋Š” ๋‚ด๊ฐ€ ์ •์˜ํ•œ๋Œ€๋กœ ์‘๋‹ตํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค REST Api์—์„œ ์ผ๊ด€์„ฑ์žˆ๊ณ  ๊ฐ„๊ฒฐํ•œ ์‘๋‹ต์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - n^2 ๋ฐฐ์—ด ์ž๋ฅด๊ธฐ (L2)
๐Ÿง  Algorithm
1def solution(n, left, right): 2 answer = [] 3 start = (left//n, left%n) 4 end = (right//n, right%n) 5 6 for i in range(start[0], end[0]+1): 7 line = [i+1]*(i+1) + [i for i in range(i+2, n+1)] 8 answer += line 9 10 return answer[start[1]:right-(start[0]*n)+1] ๋ฌธ์ œ ์ •์ˆ˜ n, left, right๊ฐ€ ์ฃผ์–ด์ง„๋‹ค n X n ํฌ๊ธฐ์˜ 2์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค i=1,2,3..n์— ๋Œ€ํ•ด์„œ, 1ํ–‰ 1์—ด๋ถ€ํ„ฐ iํ˜• iํ–‰๊นŒ์ง€ ์ˆซ์ž i๋กœ ์ฑ„์šด๋‹ค 1ํ–‰, 2ํ–‰.. nํ–‰์„ ๋ชจ๋‘ ์ด์–ด๋ถ™์ธ ์ƒˆ๋กœ์šด 1์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค ์ƒˆ๋กœ์šด 1์ฐจ์› ๋ฐฐ์—ด์—์„œ left๋ฒˆ์งธ ์ˆซ์ž๋ถ€ํ„ฐ right๋ฒˆ์งธ ์ˆซ์ž๊นŒ์ง€๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๋ผ TC input n : 3, left : 2, right : 5 ouput [3, 2, 2, 3] ํ•ด๊ฒฐ๋ฐฉ๋ฒ• answer์— ํ•„์š”ํ•œ ํ–‰๋งŒ ๊ณ„์‚ฐํ•˜์—ฌ ๋ถ™์ธ๋‹ค ๋ฐ˜ํ™˜ํ• ๋•Œ offset์„ ๊ณ„์‚ฐํ•˜์—ฌ slicingํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ํ”ผ๋กœ๋„ (L2)
๐Ÿง  Algorithm
1def solution(k, dungeons): 2 result = 0 3 length = len(dungeons) 4 def dfs(cur, visited, cnt): 5 nonlocal result 6 visit = False 7 for i in range(length): 8 if not visited[i] and cur >= dungeons[i][0]: 9 visit = True 10 visited[i] = True 11 dfs(cur-dungeons[i][1], visited, cnt+1) 12 visited[i] = False 13 14 if not visit: 15 result = max(result, cnt) 16 17 dfs(k, [False]*length, 0) 18 19 return result ๋ฌธ์ œ ์œ ์ €์˜ ํ˜„์žฌ ํ”ผ๋กœ๋„ k, ๋˜์ „๋ณ„ [“์ตœ์†Œ ํ•„์š” ํ”ผ๋กœ๋„”, “์†Œ๋ชจ ํ”ผ๋กœ๋„”]๋ฅผ ๋‹ด์€ 2์ฐจ์› ๋ฐฐ์—ด dungeons๊ฐ€ ์ฃผ์–ด์ง„๋‹ค ๋˜์ „์„ ํƒํ—˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ ์ €์˜ ํ˜„์žฌ ๋‚จ์€ ํ”ผ๋กœ๋„๊ฐ€ ์ตœ์†Œ ํ•„์š” ํ”ผ๋กœ๋„ ์ด์ƒ์ด์–ด์•ผ ํ•œ๋‹ค ๋˜์ „์„ ํด๋ฆฌ์–ดํ•˜๋ฉด “์†Œ๋ชจ ํ”ผ๋กœ๋„"๋งŒํผ ํ”ผ๋กœ๋„๊ฐ€ ์†Œ๋ชจ๋œ๋‹ค ๋˜์ „์„ ํƒํ—˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋˜์ „ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ TC input k:80, dungeons:[[80,20],[50,40],[30,10]] ouput 3 ํ•ด๊ฒฐ๋ฐฉ๋ฒ• visited์— ๋ฐฉ๋ฌธํ•œ ๋˜์ „์„ ์ฒดํฌํ•˜๋ฉด์„œ DFS ํƒ์ƒ‰ํ•˜์˜€๋‹ค ๋ฐฐ์šด ์  nonlocal ํ‚ค์›Œ๋“œ๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - k์ง„์ˆ˜์—์„œ ์†Œ์ˆ˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ (L2)
๐Ÿง  Algorithm
1def convert10toN(n, k): 2 result = '' 3 while n > 1: 4 result = str(n%k)+ result 5 n = n // k 6 return (str(n)+result).lstrip('0') 7 8def is_prime(n): 9 if n <= 1: 10 return False 11 12 end = int(n**(1/2))+1 13 for i in range(2, end): 14 if n%i == 0: 15 return False 16 return True 17 18 19def solution(n, k): 20 A = convert10toN(n, k) 21 answer = 0 22 for i in A.split('0'): 23 if i == '': continue 24 if is_prime(int(i)): 25 answer += 1 26 27 return answer ๋ฌธ์ œ ์–‘์˜ ์ •์ˆ˜ n๊ณผ k๊ฐ€ ์ฃผ์–ด์ง„๋‹ค n์„ k์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ–ˆ์„ ๋•Œ, ์•„๋ž˜ ์กฐ๊ฑด์— ๋งž๋Š” ์†Œ์ˆ˜๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ ๊ตฌํ•˜๋ผ 0P0, P0, 0P, P TC input n: 437674, k: 3 ouput 3 ํ•ด๊ฒฐ๋ฐฉ๋ฒ• 10์ง„์ˆ˜๋ฅผ k์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜, ์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์„œ ํ•ด๊ฒฐํ•˜์˜€๋‹ค ์†Œ์ˆ˜๋ฅผ ํŒ๋ณ„ํ•  ๋•Œ, ์—๋ผํ† ์Šคํ…Œ๋„ค์Šค์˜ ์ฒด๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๊ฐ€, ๋Ÿฐํƒ€์ž„์—๋Ÿฌ๋ฅผ ๋ณด๊ณ , ์ œ๊ณฑ๊ทผ๊นŒ์ง€ ๋‚˜๋ˆ„์–ด๋ณด๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟจ๋‹ค
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์ฃผ์ฐจ ์š”๊ธˆ ๊ณ„์‚ฐ (L2)
๐Ÿง  Algorithm
1import math 2 3def diff(start, end): 4 sh, sm = map(int, start.split(':')) 5 eh, em = map(int, end.split(':')) 6 7 return (eh*60+em) - (sh*60+sm) 8 9def calc(time, baseTime, baseFee, unitTime, unitFee): 10 if time < baseTime: 11 return baseFee 12 time -= baseTime 13 return baseFee + math.ceil(time/unitTime)*unitFee 14 15def solution(fees, records): 16 cars = {} 17 for i in records: 18 time, car_num, _ = i.split(' ') 19 # ์ƒˆ๋กœ ์ž…์ฐจ ํ•œ ๊ฒฝ์šฐ 20 if not car_num in cars: 21 cars[car_num] = [0, time] 22 else: 23 # ์ถœ์ฐจ ํ›„ ๋‹ค์‹œ ์ž…์ฐจํ•œ ๊ฒฝ์šฐ 24 if cars[car_num][1] == '': 25 cars[car_num][1] = time 26 # ์ถœ์ฐจํ•œ ๊ฒฝ์šฐ 27 else: 28 cars[car_num][0] += diff(cars[car_num][1], time) 29 cars[car_num][1] = '' 30 31 # ์•„์ง ์ถœ์ฐจํ•˜์ง€ ์•Š์€ ์ฐจ๋Ÿ‰๋“ค์— ๋Œ€ํ•ด 23:59์— ์ถœ์ฐจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ 32 for num in cars: 33 if cars[num][1] != '': 34 cars[num][0] += diff(cars[num][1], '23:59') 35 cars[num][1] = '' 36 37 # ์š”๊ธˆ ๊ณ„์‚ฐ 38 for num in cars: 39 cars[num] = calc(cars[num][0], fees[0], fees[1], fees[2], fees[3]) 40 41 # ์ฐจ๋Ÿ‰ ๋ฒˆํ˜ธ ์ˆœ์œผ๋กœ ์ •๋ ฌ 42 sorted_keys = sorted(cars.keys()) 43 # ์š”๊ธˆ๋งŒ ์ถ”์ถœํ•ด์„œ ๋ฐ˜ํ™˜ 44 return [cars[key] for key in sorted_keys] ๋ฌธ์ œ ๊ธฐ๋ณธ ์‹œ๊ฐ„, ๊ธฐ๋ณธ ์š”๊ธˆ, ๋‹จ์œ„ ์‹œ๊ฐ„, ๋‹จ์œ„ ์š”๊ธˆ ์ฐจ๋Ÿ‰์˜ ์ž…์ถœ์ฐจ ๊ธฐ๋ก (์‹œ๊ฐ(HH:MM), ์ฐจ๋Ÿ‰๋ฒˆํ˜ธ(XXXX), ๋‚ด์—ญ(์ž…์ฐจ/์ถœ์ฐจ)) ์œ„ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์งˆ๋•Œ, ๊ฐ ์ฐจ๋Ÿ‰๋ณ„ ์ฃผ์ฐจ ์š”๊ธˆ์„ ๊ณ„์‚ฐํ•ด์„œ ์ฐจ๋Ÿ‰๋ฒˆํ˜ธ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋ผ ์ž…์ฐจ๋งŒ ํ•˜๊ณ  ์ถœ์ฐจํ•˜์ง€ ์•Š์€ ์ฐจ๋Ÿ‰์€, 23:59์— ์ถœ์ฐจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค TC input fees: [180, 5000, 10, 600] records: [“05:34 5961 IN”, “06:00 0000 IN”, “06:34 0000 OUT”, “07:59 5961 OUT”, “07:59 0148 IN”, “18:59 0000 IN”, “19:09 0148 OUT”, “22:59 5961 IN”, “23:00 5961 OUT”] ouput [14600, 34400, 5000] ํ•ด๊ฒฐ๋ฐฉ๋ฒ• cars๋ผ๋Š” dictionary์— ์ฐจ๋Ÿ‰๋ฒˆํ˜ธ๋ฅผ key๋กœ, [์ฃผ์ฐจ์‹œ๊ฐ„, ์ž…์ฐจ์‹œ๊ฐ„]์„ value๋กœ ์ €์žฅํ•œ๋‹ค ๋งˆ์ง€๋ง‰์— ํ•œ๋ฒˆ์— ์š”๊ธˆ์„ ๊ณ„์‚ฐํ•œ๋‹ค
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์–‘๊ถ๋Œ€ํšŒ (L2)
๐Ÿง  Algorithm
1def solution(n, info): 2 # ๊ฐ๊ฐ ๋ช‡ ๋ฒˆ ๋งž์ถฐ์•ผ ์ ์ˆ˜๋ฅผ ์–ป๋Š”์ง€ ์ €์žฅํ•˜์˜€๋‹ค 3 goal_list = [i+1 for i in info] 4 5 cases = [] 6 7 def dfs(score, cnt, case): 8 # ๋ช‡ ๋ฒˆ์งธ ์ ์ˆ˜์ธ์ง€ ๋‚˜ํƒ€๋‚ธ๋‹ค (0:10์ , 1:9์ , ...) 9 length = len(case) 10 if length == 11: 11 # ํ™”์‚ด ๊ฐœ์ˆ˜๊ฐ€ ๋‚จ์•˜๋‹ค๋ฉด 0์ ์— ์ฑ„์›Œ์ค€๋‹ค 12 if cnt != n: 13 case[-1] += n-cnt 14 cases.append((score, case)) 15 return 16 # ํ˜„์žฌ ๋‹จ๊ณ„์—์„œ ๋ช‡ ์  ๋งž์•„์•ผ ์ ์ˆ˜๋ฅผ ๋”ฐ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค 17 goal = goal_list[length] 18 19 # ์ ์ˆ˜๋ฅผ ๋”ฐ๋Š” ๊ฒฝ์šฐ 20 if cnt + goal <= n: 21 # ๋”ด ์ ์ˆ˜๋ฅผ ๋”ํ•ด์ค€๋‹ค 22 dfs(score+(10-length), cnt+goal, case+[goal]) 23 # ์ƒ๋Œ€๊ฐ€ ์ ์ˆ˜๋ฅผ ๋”ฐ๋Š” ๊ฒฝ์šฐ 24 if goal != 1: 25 # ์ƒ๋Œ€๊ฐ€ ๋”ด ์ ์ˆ˜๋ฅผ ๋นผ์ค€๋‹ค 26 dfs(score-(10-length), cnt, case+[0]) 27 # ์•„๋ฌด๋„ ๋ชป ๋งž์ถ”๋Š” ๊ฒฝ์šฐ 28 else: 29 dfs(score, cnt, case+[0]) 30 31 dfs(0, 0, []) 32 # ์ ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด, ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ๋” ๋งŽ์ด ๋งž์ถ˜ ๊ฒฝ์šฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์˜€๋‹ค 33 cases.sort(key= lambda x: (x[0], x[1][::-1])) 34 35 if cases[-1][0] > 0: 36 return cases[-1][1] 37 # ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ case์˜ ์ ์ˆ˜๊ฐ€ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ, ๋ฌด์กฐ๊ฑด ์ง€๋Š” ๊ฒฝ์šฐ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค 38 return [-1] ๋ฌธ์ œ 1๋Œ€1๋กœ ์–‘๊ถ ๊ฒฝ๊ธฐ๋ฅผ ํ•œ๋‹ค, ์ ์ˆ˜๋Š” 10์ ~0์ ๊นŒ์ง€ ์žˆ๋‹ค ์ƒ๋Œ€๋ณด๋‹ค ๊ฐ™์€ ์ ์ˆ˜๋ฅผ ๋งŽ์ด ๋งž์ถฐ์•ผ ์ ์ˆ˜๋ฅผ ์–ป๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒ๋Œ€๊ฐ€ 10์ ์„ 3๋ฒˆ ๋งž์ท„๋‹ค๊ณ ํ•˜์ž, ์ด๋•Œ 10์ ์„ 4๋ฒˆ ๋งž์ถ”๋ฉด 10์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๊ณ , 2๋ฒˆ ๋งž์ถ”๋ฉด ์ƒ๋Œ€๊ฐ€ 10์ ์„ ์–ป๋Š”๋‹ค ํ™”์‚ด์˜ ๊ฐœ์ˆ˜ n, ์ƒ๋Œ€ ์„ ์ˆ˜๊ฐ€ ๋งžํžŒ ๊ณผ๋… ์ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ 10์ ๋ถ€ํ„ฐ 0๊นŒ์ง€ ๋‹ด์€ ์ •์ˆ˜๋ฐฐ์—ด info๊ฐ€ ์ฃผ์–ด์ง„๋‹ค ๊ฐ€์žฅ ํฐ ์ ์ˆ˜ ์ฐจ์ด๋กœ ์ด๊ธฐ๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์ ์ˆ˜๋ฅผ ๋ช‡ ๋ฒˆ ๋งžํ˜€์•ผ ํ•˜๋Š”์ง€ ์ •์ˆ˜ ๋ฐฐ์—ด๋กœ ๊ตฌํ•˜๋ผ ๋งŒ์•ฝ ๋ฌด์กฐ๊ฑด ์ง€๋Š” ๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜ํ•˜๋ผ ๋งŒ์•ฝ ์ ์ˆ˜ ์ฐจ์ด๊ฐ€ ๊ฐ™๋‹ค๋ฉด, ๊ฐ€์žฅ ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ๋” ๋งŽ์ด ๋งžํžŒ ๊ฒฝ์šฐ๋ฅผ return ํ•˜๋ผ TC input 5, [2,1,1,1,0,0,0,0,0,0,0] ouput [0,2,2,0,1,0,0,0,0,0,0] ํ•ด๊ฒฐ๋ฐฉ๋ฒ• DFS๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜์—ฌ ํ•ด๊ฒฐํ•˜์˜€๋‹ค ์ž์„ธํ•œ ์„ค๋ช…์€ ์ฃผ์„์œผ๋กœ ๋Œ€์ฒดํ•˜์˜€๋‹ค
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋‘ ํ ํ•ฉ ๊ฐ™๊ฒŒ ๋งŒ๋“ค๊ธฐ (L2)
๐Ÿง  Algorithm
1from collections import deque 2 3def solution(queue1, queue2): 4 sum1, sum2 = sum(queue1), sum(queue2) 5 dq1 = deque(queue1) 6 dq2 = deque(queue2) 7 cnt = 0 8 9 while cnt <= len(queue1)*2+1 and sum1 != sum2: 10 if sum1 > sum2: 11 tmp = dq1.popleft() 12 dq2.append(tmp) 13 sum1 -= tmp 14 sum2 += tmp 15 elif sum1 < sum2: 16 tmp = dq2.popleft() 17 dq1.append(tmp) 18 sum1 += tmp 19 sum2 -= tmp 20 cnt += 1 21 22 return cnt if sum1 == sum2 else -1 ๋ฌธ์ œ ๊ธธ์ด๊ฐ€ ๊ฐ™์€ ๋‘ ํ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค ๋‘ ํ์˜ ํ•ฉ์ด ๊ฐ™์•„์ง€๋„๋ก ํ์˜ ์›์†Œ๋ฅผ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ ํ์˜ pop์€ ์™ผ์ชฝ์—์„œ, push๋Š” ์˜ค๋ฅธ์ชฝ์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค TC input queue1 : [3, 2, 7, 2], queue2 : [4 ,6, 5, 1] ouput 2 ํ•ด๊ฒฐ๋ฐฉ๋ฒ• deque๋ฅผ ์ด์š”ํ•ด์„œ ํ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค ๋‘ ํ์˜ ํ•ฉ์ด ๊ฐ™์•„์งˆ๋•Œ๊นŒ์ง€, ํ•ฉ์ด ํฐ ํ์—์„œ ์ž‘์€ ํ๋กœ ์›์†Œ๋ฅผ ์ด๋™์‹œํ‚จ๋‹ค ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฌดํ•œ๋ฃจํ”„๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, (ํ์˜ ๊ธธ์ด)*2+1 ๋งŒํผ๋งŒ ๋ฐ˜๋ณตํ•œ๋‹ค
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ํ• ์ธ ํ–‰์‚ฌ (L2)
๐Ÿง  Algorithm
1from collections import deque 2 3def solution(want, number, discount): 4 want_dict = dict() 5 answer = 0 6 7 for i in range(len(want)): 8 want_dict[want[i]] = number[i] 9 10 for i in discount[:10]: 11 if i in want_dict: 12 want_dict[i] -= 1 13 14 for i in range(0, len(discount)-9): 15 if all(map(lambda x: x <= 0, want_dict.values())): 16 answer += 1 17 18 if discount[i] in want_dict: 19 want_dict[discount[i]] += 1 20 if i+10 < len(discount) and discount[i+10] in want_dict: 21 want_dict[discount[i+10]] -= 1 22 23 return answer ๋ฌธ์ œ XYZ๋งˆํŠธ์—์„œ๋Š” ํšŒ์›์— ๊ฐ€์ž…ํ•˜๋ฉด 10์ผ๋™์•ˆ ํ• ์ธํ˜œํƒ์„ ๋ฐ›๋Š”๋‹ค ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์€ ํ•˜๋ฃจ์— ํ•˜๋‚˜์”ฉ๋งŒ ๊ตฌ๋งคํ•  ์ˆ˜ ์žˆ๋‹ค ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ ๋ฆฌ์ŠคํŠธ, ์›ํ•˜๋Š” ์ œํ’ˆ์˜ ์ˆ˜๋Ÿ‰ ๋ฆฌ์ŠคํŠธ, ๋งˆํŠธ์—์„œ ํ• ์ธํ•˜๋Š” ์ œํ’ˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค ์ •ํ˜„์ด๊ฐ€ ์›ํ•˜๋Š” ์ œํ’ˆ์„ ๋ชจ๋‘ ํ• ์ธ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํšŒ์› ๋“ฑ๋ก ๋‚ ์งœ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ TC input want: [“banana”, “apple”, “rice”, “pork”, “pot”] number: [3, 2, 2, 2, 1] discount: [“chicken”, “apple”, “apple”, “banana”, “rice”, “apple”, “pork”, “banana”, “pork”, “rice”, “pot”, “banana”, “apple”, “banana”] ouput 5 ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์›ํ•˜๋Š” ์ œํ’ˆ์„ dict๋กœ ๋งŒ๋“ ๋‹ค (key: ์ œํ’ˆ์ด๋ฆ„, value: ์ˆ˜๋Ÿ‰) ์›ํ•˜๋Š” ์ œํ’ˆ - ์ฒซ๋‚ ์— ๊ฐ€์ž…ํ–ˆ์„ ๋•Œ ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์„ ๊ณ„์‚ฐํ•œ๋‹ค ๋ฐ˜๋ณต๋ฌธ์„ ์ˆœํšŒํ•˜๋ฉด์„œ ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์„ ๋นผ๊ณ , ํ• ์ธํ•˜๋Š” ์ œํ’ˆ์„ ๋”ํ•œ๋‹ค (์ œํ’ˆ์ด ๋” ํ•„์š”ํ•˜๋ฉด ์–‘์ˆ˜, ๋œ ํ•„์š”ํ•˜๋ฉด ์Œ์ˆ˜) 0๋ณด๋‹ค ํฐ ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด answer์— 1์„ ๋”ํ•œ๋‹ค
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ํ˜ผ์ž ๋†€๊ธฐ์˜ ๋‹ฌ์ธ (L2)
๐Ÿง  Algorithm
1def solution(cards): 2 length = len(cards) 3 visited = [False] * length 4 answer = [] 5 6 for i in range(length): 7 cnt = 0 8 cur = i 9 while not visited[cur-1]: 10 visited[cur-1] = True 11 cur = cards[cur-1] 12 cnt += 1 13 if cnt != 0: 14 answer.append(cnt) 15 16 if len(answer) <= 1: 17 return 0 18 answer.sort(reverse=True) 19 return answer[0]*answer[1] ๋ฌธ์ œ ์ฃผ์–ด์ง„ ๋ฐฐ์—ด cards๋ฅผ ์ˆœํšŒํ•œ๋‹ค cards[i]๋ฒˆ์งธ ์›์†Œ๋ฅผ ๋ฐฉ๋ฌธํ•œ๋‹ค, ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ์›์†Œ์ธ ๊ฒฝ์šฐ ๊ทธ๋งŒํ•œ๋‹ค ํ•œ๋ฒˆ ์ด์–ด์„œ ๋ฐฉ๋ฌธํ•œ ์›์†Œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•œ๋‹ค๊ณ  ํ•  ๋•Œ, ๋‘ ๊ทธ๋ฃน์˜ ์›์†Œ๊ฐœ์ˆ˜์˜ ๊ณฑ์˜ ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๋ผ TC input [8,6,3,7,2,5,1,4] ouput 12 ํ•ด๊ฒฐ๋ฐฉ๋ฒ• while๋ฌธ์„ ํ•œ๋ฒˆ ๋Œ๋ฉด์„œ, ์›์†Œ์˜ ๋ฐฉ๋ฌธ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๊ณ , ๋ฐฉ๋ฌธํ•œ ์›์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ผ๋‹ค ๊ทธ๋ฃนํ™”๋œ ์›์†Œ๋ฅผ answer์— ์ถ”๊ฐ€ํ•œ๋‹ค answer๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ , ์ฒซ๋ฒˆ์งธ ๋‘๋ฒˆ์งธ ์›์†Œ์˜ ๊ณฑ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์—ฐ์† ์ˆ˜์—ด ํ•ฉ์˜ ๊ฐœ์ˆ˜ (L2)
๐Ÿง  Algorithm
์ฒซ๋ฒˆ์งธ ํ’€์ด 1def solution(elements): 2 result = set() 3 length = len(elements) 4 elements = elements*2 5 for i in range(length): 6 temp = 0 7 for j in range(length): 8 temp += elements[i+j] 9 result.add(temp) 10 11 return len(result) ๊ฐœ์„ ํ•œ ํ’€์ด 1def solution(elements): 2result = set() 3length = len(elements) 4for i in range(length): 5 temp = 0 6 for j in range(length): 7 temp += elements[(i+j)%length] 8 result.add(temp) 9 10return len(result) ๋ฌธ์ œ ์ฃผ์–ด์ง„ ์ •์ˆ˜ ๋ฐฐ์—ด๋กœ ์›ํ˜• ์ˆ˜์—ด์„ ๋งŒ๋“ ๋‹ค ์›ํ˜• ์ˆ˜์—ด์˜ ์—ฐ์†๋œ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜์—ฌ๋ผ TC input [7,9,1,1,4] ouput 18 ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ฒซ๋ฒˆ์งธ ํ’€์ด์—์„œ๋Š” ๋ฐฐ์—ด์„ 2๋ฐฐ๋กœ ๋Š˜๋ ค์„œ ์›ํ˜• ์ˆ˜์—ด์„ ๋งŒ๋“ค์—ˆ๋‹ค ๊ฐœ์„ ํ•œ ํ’€์ด์—์„œ๋Š” mod ์—ฐ์‚ฐ์„ ์ด์šฉํ•ด์„œ ์›ํ˜• ์ˆ˜์—ด์„ ๋งŒ๋“ค์—ˆ๋‹ค set๋ฅผ ์ด์šฉํ•ด์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ์›์†Œ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์˜€๋‹ค
new ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ํƒ๋ฐฐ์ƒ์ž (L2)
๐Ÿง  Algorithm
1def solution(order): 2 answer = 0 3 length = len(order) 4 stackA = [i for i in range(length, 0, -1)] 5 stackB = [] 6 7 for i in order: 8 while True: 9 if stackA and stackA[-1] == i: 10 stackA.pop() 11 break 12 if stackB and stackB[-1] == i: 13 stackB.pop() 14 break 15 16 if stackB and stackB[-1] > i: 17 return answer 18 19 stackB.append(stackA.pop()) 20 answer += 1 21 22 return answer ๋ฌธ์ œ ์›ํ•˜๋Š” ์ƒ์ž ์ˆœ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๋ฐฐ์—ด order๊ฐ€ ์ฃผ์–ด์ง„๋‹ค ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ์— [N… 3, 2, 1]์™€ ๊ฐ™์ด ๋ฐ•์Šค๊ฐ€ ๋†“์—ฌ์žˆ๋‹ค ๋ฐ•์Šค๋Š” 1๋ฒˆ ์ƒ์ž๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ๋บ„ ์ˆ˜ ์žˆ๋‹ค ๋บ€ ์ƒ์ž๋ฅผ ์ž ๊น ๋ณด์กฐ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ์— ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋‹ค ๋ณด์กฐ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๋Š” ์Šคํƒ๊ณผ ๊ฐ™์ด FILO๊ฐ€ ์ ์šฉ๋œ๋‹ค ์ˆœ์„œ๋Œ€๋กœ ์ƒ์ž๋ฅผ ์‹ฃ์ง€ ๋ชปํ•˜๋ฉด, ๊ทธ๋งŒ๋‘”๋‹ค ๋ฐ•์Šค๋ฅผ order์— ๋งž๊ฒŒ ๋ช‡ ๊ฐœ๊นŒ์ง€ ์‹ค์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋ผ TC input [4, 3, 1, 2, 5] ouput 2 ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ง๊ด€์ ์œผ๋กœ stackA, stackB๋ฅผ ์„ ์–ธํ•˜์˜€๋‹ค stackA๊ฐ€ ์ฃผ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ, stackB๊ฐ€ ๋ณด์กฐ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ์—ญํ• ์„ ํ•œ๋‹ค order๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์ˆœ์„œ์— ๋งž๋Š” ์ƒ์ž๊ฐ€ ๋‚˜์˜ฌ ๋•Œ ๊นŒ์ง€, ๋ณด์กฐ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๋กœ ๋ณด๋‚ด๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค ๋ณด์กฐ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ์˜ top์ด ๊บผ๋‚ด์•ผ ํ•  ์š”์†Œ๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ, ๊บผ๋‚ผ ์ƒ์ž๊ฐ€ ๋ณด์กฐ ์ปจ๋ฒ ์ด์–ด ๋’ค์ชฝ์— ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ๋น ์ ธ๋‚˜์˜จ๋‹ค
  • ««
  • «
  • 19
  • 20
  • 21
  • 22
  • 23
  • »
  • »»
๐Ÿง  Algorithm (104) ๐ŸŒŠ C/CPP (2) โ˜• Java (8) ๐ŸŒ Javascript (9) ๐Ÿ Python (9) ๐Ÿƒ Spring (30) ๐Ÿ”จ ๊ฐœ๋ฐœ ๋„๊ตฌ (2) ๐ŸŽธ ๊ธฐํƒ€ (7) ๐Ÿ‘จโ€๐Ÿ’ป ๋ชจ๊ฐ์ฝ” (38) ๐Ÿค– ์ธ๊ณต์ง€๋Šฅ (2) ๐Ÿซ ํ•™๊ณผ ๊ณต๋ถ€ (28)
๐Ÿท๏ธ boj (53) ๐Ÿท๏ธ c (5) ๐Ÿท๏ธ c++ (4) ๐Ÿท๏ธ celery (2) ๐Ÿท๏ธ cs (18) ๐Ÿท๏ธ django (3) ๐Ÿท๏ธ docker (2) ๐Ÿท๏ธ docker compose (1) ๐Ÿท๏ธ elk (1) ๐Ÿท๏ธ fastapi (4) ๐Ÿท๏ธ git (2) ๐Ÿท๏ธ github actions (5) ๐Ÿท๏ธ hackerrank (3) ๐Ÿท๏ธ https (2) ๐Ÿท๏ธ java (37) ๐Ÿท๏ธ javascript (2) ๐Ÿท๏ธ jwt (1) ๐Ÿท๏ธ kubernetes (4) ๐Ÿท๏ธ nginx (2) ๐Ÿท๏ธ ocaml (1) ๐Ÿท๏ธ open source (2) ๐Ÿท๏ธ programmers (48) ๐Ÿท๏ธ pytest (1) ๐Ÿท๏ธ python (111) ๐Ÿท๏ธ rabbitmq (2) ๐Ÿท๏ธ rag (3) ๐Ÿท๏ธ react (6) ๐Ÿท๏ธ security (3) ๐Ÿท๏ธ software-engineering (3) ๐Ÿท๏ธ spring (31) ๐Ÿท๏ธ sql (5) ๐Ÿท๏ธ ssl (1) ๐Ÿท๏ธ testing (4) ๐Ÿท๏ธ typescript (1) ๐Ÿท๏ธ vercel (1) ๐Ÿท๏ธ websocket (1)