๐ŸŒต[NW]๋„คํŠธ์›Œํฌ ๊ฐ•์˜๋ฅผ ๋“ฃ๋‹ค

๋‹ฅ๊ฐœยท2024๋…„ 6์›” 21์ผ

๊ณต๋ถ€

๋ชฉ๋ก ๋ณด๊ธฐ
4/23

์‹ ์ž…๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์ด์ •๋„๋Š” ์•Œ์•„์•ผ ํ•œ๋‹ค!
๊ฐœ๋ฐœ์ž๋ผ๋ฉด ํ•„์ˆ˜๋กœ ์•Œ์•„์•ผ ํ•  ๊ธฐ์ดˆ ๋„คํŠธ์›Œํฌ ์ง€์‹

๊ธฐ์ดˆ์ ์ธ HTTP ์Šต๋“
๊ฐœ๋ฐœ์ž๋กœ์„œ ์„ฑ์žฅ์„ ์œ„ํ•ด
์›ํ™œํ•œ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์œ„ํ•ด
API๋ฅผ ์ œ์ž‘ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด
์„ฑ๋Šฅ ์ตœ์ ํ™”๋‚˜ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด

๊ฐ•์˜ ์‹ค์Šต ํ™˜๊ฒฝ: VSC <- ๋ณธ์ธ์€ IntelliJ๋กœ ์ง„ํ–‰

1.์›น๊ณผ

์›น> ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์„œ๋น„์Šค
์›นํŽ˜์ด์ง€= ๋ฌธ์„œ๋“ค์˜ ๋ชจ์Œ
	ํ•˜์ดํผํ…์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ์—ฐ๊ฒฐ

์ธํ„ฐ๋„ท: ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ธ€๋กœ๋ฒŒ ๋„คํŠธ์›Œํฌ ์‹œ์Šคํ…œ
์›น
URL: ์ธํ„ฐ๋„ท์— ์›น ํŽ˜์ด์ง€, ์ด๋ฏธ์ง€ ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€์‹œ์ž(์ด๋ฆ„) ๋˜๋Š” ๊ฒฝ๋กœ
		์›น ์ƒ์˜ ์ž์› ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ฃผ์†Œ
IP: ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐ๋œ ์žฅ์น˜๋“ค์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์ˆซ์ž ์ฃผ์†Œ
PORT: ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ์—์„œ IP ์ฃผ์†Œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด, ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ์—์„œ ๋™์ž‘ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋น„์Šค๋‚˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์—ญํ• 
DNS(Domain Name System): ๋„๋ฉ”์ธ ์ด๋ฆ„์„ IP ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์‹œ์Šคํ…œ
HTTP(Hypertext Transfer Protocol): ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹  ๊ทœ์•ฝ(ํ†ต์‹  ์•ฝ์†)

Client (ํœด๋Œ€ํฐ, ๋…ธํŠธ๋ถ, ๋ฐ์ŠคํŠธํƒ‘)์„ ์ด์šฉํ•ด domain,URL ๋กœ ์ ‘์† (Request)
๊ณต์œ ๊ธฐ/์Šค์œ„์น˜๋ฅผ ํ†ตํ•ด ๋ผ์šฐํ„ฐ๋กœ โ† ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋ฅผ ์ฐพ์•„๊ฐ€๋ ค๋ฉด ์ฃผ์†Œ(IP)๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ ์ฃผ์†Œ๋Š” DNS์— ์žˆ์Šต๋‹ˆ๋‹ค
๋ผ์šฐํ„ฐ๋Š” DNS์—์„œ IP ์ฃผ์†Œ๋ฅผ ์ฐพ์•„์˜ด
๊ฐ์ข… ๋ณด์•ˆ์žฅ๋น„ ๋ฐ ๋„คํŠธ์›Œํฌ ์žฅ๋น„๋ฅผ ๊ฑฐ์ณ ์„œ๋ฒ„์— ์ ‘์†

www.naver.com๋„๋ฉ”์ธ, URL์ด๋ฆ„
105.209.222.141IP์ฃผ์†Œ
22,23,80, 443Port๋ฌธ

์š”์ฒญ์„ ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋กœ ๋งŒ๋“ฌ(ํŒจํ‚ท)

์›น ์ƒ์—์„œ HTML,CSS,JS,Python ์˜ ์—ญํ• 

HTML:๋ผˆ๋Œ€ (๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐํ™”- ์›น ์ฝ˜ํ…์ธ ์˜ ์˜๋ฏธ์™€ ๊ตฌ์กฐ๋ฅผ ์ •์˜)
CSS: ์‚ด (์Šคํƒ€์ผ ์‹œํŠธ)
JS: ๊ทผ์œก(์›น ํŽ˜์ด์ง€์˜ ๊ธฐ๋Šฅ, ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉ/ ๋ฐ์ดํ„ฐ ์ปจํŠธ๋กค)
Python: ๋‘๋‡Œ ๋ฐ ์žฅ๊ธฐ(๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ)

์šฉ์–ด

ํด๋ผ์ด์–ธํŠธ: ์„œ๋น„์Šค๋ฅผ ์š”์ฒญํ•˜๋Š” ์ปดํ“จํ„ฐ(ํ”„๋กœ๊ทธ๋žจ), 
	์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์— ์ ‘์†ํ•˜๋Š” ์‚ฌ์šฉ์ž์˜ ๋””๋ฐ”์ด์Šค๋ฅผ ์˜๋ฏธ
์„œ๋ฒ„: ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ปดํ“จํ„ฐ(ํ”„๋กœ๊ทธ๋žจ)
#001.py

from http.server import BaseHTTPRequestHandler, HTTPServer
import os

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/': #๊ธฐ๋ณธํŽ˜์ด์ง€๋กœ ์ ‘์†๋˜์—ˆ์„ ๋•Œ
            #self.path = '/index.html'
            self.path = '/001.html'

        try:
            file_to_open = open(self.path[1:]).read() #self.path๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ open
            self.send_response(200)
        except:
            file_to_open = "File not found"
            self.send_response(404)

        self.end_headers()
        self.wfile.write(bytes(file_to_open, 'utf-8'))#์‹ค์ œ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’(utf๋กœ~)

def run(port=8080):
    server_address = ('', port)
    httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
    print(f'Server running on port {port}')
    httpd.serve_forever()

if __name__ == '__main__':
    run()

URL, URN

Uniform Resource Identifier : ํ†ตํ•ฉ ์ž์› ์‹๋ณ„์ž
	Uniform: ๋ฆฌ์†Œ์Šค ์‹๋ณ„ํ•˜๋Š” ํ†ต์ผ๋œ ๋ฐฉ์‹
    Identifier: ๋‹ค๋ฅธ ํ•ญ๋ชฉ๊ณผ ๊ตฌ๋ถ„ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ •๋ณด
URI๋Š” ์œ„์น˜, ์ด๋ฆ„ ๋˜๋Š” ๋‘˜ ๋‹ค๋กœ ์ถ”๊ฐ€๋ถ„๋ฅ˜
  • URL: Resource Locator โ†’ ๋ฆฌ์†Œ์Šค์˜ ์œ„์น˜๋ฅผ ์ง€์ •
  • URN: Resource Name โ†’ ๋ฆฌ์†Œ์Šค์— ์ด๋ฆ„์„ ๋ถ€์—ฌ (์ฃผ์†Œ๋Š” ๋ณ€ํ•ด๋„ URN์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค)

URL: ์›น ์‚ฌ์ดํŠธ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ž…๋ ฅํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ๋งํ•จ
โ€โ€์›น ์ƒ์—์„œ๋Š” ์‹ค์งˆ์ ์œผ๋กœ ์ฃผ์†Œ๊ฐ€ ์•„๋‹Œ ์ด๋ฆ„ ์—ญํ• 

/001.html๋กœ ์ ‘์†ํ–ˆ๋‹ค๊ณ  ์‹ค์ œ๋กœ ๋ถˆ๋Ÿฌ์˜จ ๊ฐ’์ด 001.html์ž„์„ ๋ณด์žฅX
โ€โ€โ† ๋ณด์•ˆ์œผ๋กœ ์ ‘์† ์ฃผ์†Œ๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ

        if self.path == '/001.html': #001์ ‘์†์š”์ฒญ
         self.path = '/index.html' #index ํŽ˜์ด์ง€ ๋ฐ˜ํ™˜

์›น ์‚ฌ์ดํŠธ ๋ฟ๋งŒ์•„๋‹Œ ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ์ƒ์˜ ์ž์›์„ ๋ชจ๋‘ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Œ
(ex. 001.html ํŒŒ์ผ์˜ ๋ฌผ๋ฆฌ์  ์ฃผ์†Œ๋ฅผ ์›นํŽ˜์ด์ง€์— ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ ์ถœ๋ ฅ๋จ)

URL ํ†ต์‹ ์€ ๋„์ฒญ(์Šค๋‹ˆํ•‘)์ด ๊ฐ€๋Šฅํ•ด //user id์™€ pw ๋Š” ๋„ฃ์ง€ ์•Š๋Š”๋‹ค
port(ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ฅธ ์•ฝ์†๋œ num์ด ์žˆ์Œ) : https=443 / http=80
#hash : ํŽ˜์ด์ง€์˜ id๊ฐ’

flagment(hash)์— ๋”ฐ๋ฅธ ์ด๋™

get ๋ฐฉ์‹: url๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก

input์˜ name์ด query string์˜ key๊ฐ’์œผ๋กœ ๋“ค์–ด๊ฐ€๊ณ  
(name = 'username'์ด๋ผ๋ฉด username์ด ํ‚ค๊ฐ’์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค)
      <input type="text" name="username" value="helloget">
      <input type="password" name="password" value="worldget">
      <input type="submit" value="Login">
	```
  ๋‹ค์Œ์˜ ๊ฒฝ์šฐ username=helloget&password=worldget ์œผ๋กœ ๊ฐ’์ด ๋„˜์–ด๊ฐ„๋‹ค
	์‹ค์ œ๋กœ username๊ณผ pw๋Š” get ๋ฐฉ์‹์œผ๋กœ ๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค!! ๋ณด์•ˆ๋ฌธ์ œ
  
#### serve์—์„œ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 

`004.html`
```html
  <h1>login</h1>
  <form action="http://127.0.0.1:8000" method="get">
      <input type="text" name="username" value="helloget">
      <input type="password" name="password" value="worldget">
      <input type="submit" value="Login">
  </form>
http://127.0.0.1:8000์— GET ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๊ฒƒ

002.py

from http.server import (
    HTTPServer,
    BaseHTTPRequestHandler,
)  # ๊ฐ„๋‹จํ•œ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ
from urllib.parse import urlparse, parse_qs


class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):  # get ์š”์ฒญ ์ฒ˜๋ฆฌ
        print(self.path)
        parsed_url = urlparse(self.path)  # URL ํŒŒ์‹ฑ
        print(parsed_url)
        query_params = parse_qs(parsed_url.query)  # ์ฟผ๋ฆฌ ํŒŒ์‹ฑ-๋”•์…”๋„ˆ๋ฆฌ๋กœ ๊ฐ€์ ธ์˜ด
        print(query_params)

        username = query_params.get("username", [None])[
            0
        ]  # username๊ณผ password ๊ฐ’์„ ๊ฐ€์ ธ์˜ด. ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ None์ด ๊ธฐ๋ณธ๊ฐ’.
        password = query_params.get("password", [None])[0]

        if username and password:  # 2๊ฐœ ๋ชจ๋‘ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ
            response = f"Username: {username}, Password: {password}"
        else:  # ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” form
            response = """
            <p>์•„์ด๋””๋‚˜ ํŒจ์Šค์›Œ๋“œ๊ฐ€ ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค.</p>
            <form action="" method="get">
                <input type="text" name="username" placeholder="Username">
                <input type="password" name="password" placeholder="Password">
                <input type="submit" value="Login">
            </form>
            """

        self.send_response(
            200
        )  # HTTP ์ƒํƒœ์ฝ”๋“œ ์ƒ์„ฑ(200์€ ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ)
        self.send_header("Content-type", "text/html")  # ์‘๋‹ต์€ HTML๋กœ ์†ก์‹ 
        self.end_headers()  # ํ—ค๋” ์ •๋ณด๋Š” ์—ฌ๊ธฐ๊นŒ์ง€ ๋งˆ๋ฌด๋ฆฌ ํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ
        self.wfile.write(response.encode("utf-8"))  # ์‘๋‹ต ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ


if __name__ == "__main__":
    server_address = ("", 8000)
    httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
    print(f"Server running on port {server_address[1]}")
    httpd.serve_forever()

JS URL ํŒŒ์‹ฑ

const url = new URL(
  'https://www.example.com/path/to/page?key1=value1&key2=value2#section',
);
 
console.log(url.protocol); // "https:"
console.log(url.hostname); // "www.example.com"
console.log(url.pathname); // "/path/to/page"
console.log(url.search); // "?key1=value1&key2=value2"
console.log(url.hash); // "#section"
๋นˆ about:blank์˜ ๋นˆ ํŽ˜์ด์ง€์—์„œ ์ง„ํ–‰

JS ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

๋ฐ›์•„์„œ ์‡ผํ•‘๋ชฐ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

const url = 'https://eduapi.weniv.co.kr/723/product';
 
fetch(`${url}`)
  .then((response) => {
    console.log(response.status);
    return response.json();
  })
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error('Error:', error);
  });
const url = 'https://eduapi.weniv.co.kr/753/product/search';
const params = new URLSearchParams({ keyword: 'keyring' });
 
fetch(`${url}?${params}`)
  .then((response) => {
    console.log(response.status);
    return response.json();
  })
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error('Error:', error);
  });
GET ์š”์ฒญ์œผ๋กœ ํ‚ค์›Œ๋“œ๋ฅผ ๋ณด๋‚ด๋ฉด ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์„œ ๊ฒ€์ƒ‰

PYTHON URL parsing

ํ„ฐ๋ฏธ๋„์—์„œ ์‹ค์Šตํ•˜๋Š” ๊ฒฝ์šฐ - pip install requests ํ•˜์—ฌ ๋ชจ๋“ˆ ์„ค์น˜

005.py
006.py

URL ์ธ์ฝ”๋”ฉ

ํ•ด๋‹น๋ฌธ์ž์˜ ASCII ์ฝ”๋“œ์— ํ•ด๋‹นํ•˜๋Š” 16์ง„์ˆ˜ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด


HTTP

ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ์•ฝ์† (ํ”„๋กœํ† ์ฝœ)

self.send_header("Content-type", "text/plain")
- html ํŒŒ์ผ์„ ์ „์†กํ•˜๋Š”๋ฐ "text/plain"๋กœ ์ž‘์„ฑํ•˜๋ฉด ์ผ๋‹จ text๋กœ ๋ณด์ž„
๋•Œ๋ฌธ์— Content-type์„ ์•„๋Š”๊ฒƒ์ด ์ค‘์š”<< ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋‚˜ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์‹ ํ•  ๋•Œ ์ž…๋ ฅ
1) text/html
2) text/css
3) application/javascript
์œ„ ์„ธ๊ฐ€์ง€ ํƒœ๊ทธ๊ฐ€ ์žˆ์œผ๋ฉฐ ์‘๋‹ต ๋ณธ๋ฌธ์ด html, css, JS ๋ฌธ์„œ์ž„์„ ๋‚˜ํƒ€๋ƒ„

ํ˜„์žฌ๋Š” HTTP/1.1์ด ๋งŽ์ด ์‚ฌ์šฉ์ค‘~ ๊ณ„์† ๋ฐœ์ „์ค‘~

HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ

GET /index.html HTTP/1.1 <!--์š”์ฒญ๋ผ์ธ, ํ”„๋กœํ† ์ฝœ์€ HTTP/1.1-->
Host: www.hojun.com <!--ํ—ค๋”-->
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ

HTTP/1.1 200 OK <!--์š”์ฒญ์„ฑ๊ณต-->
Date: Fri, 29 Mar 2023 10:30:00 GMT
Server: Apache/2.4.41 (Ubuntu)
Last-Modified: Thu, 28 Mar 2023 12:00:00 GMT
Content-Type: text/html
Content-Length: 1234
Connection: keep-alive

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>์ œ์ฃผ์ฝ”๋”ฉ๋ฒ ์ด์Šค์บ ํ”„</title>
</head>
<body>
    <h1>Welcome to ์ œ์ฃผ์ฝ”๋”ฉ๋ฒ ์ด์Šค์บ ํ”„</h1>
    <p>์ œ์ฃผ์ฝ”๋”ฉ๋ฒ ์ด์Šค์บ ํ”„์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!</p>
</body>
</html>

Python ์„œ๋ฒ„ ๊ตฌ๋™

008.py

** ์ค‘์š”ํ•œ ๊ฒƒ
1) ๋“ค์–ด์˜จ ๋ฉ”์„œ๋“œ ํ™•์ธ
2) GET์—์„œ๋Š” self.path, POST์—์„œ๋Š” body ํ™•์ธ
3) Content-Type

HTML/JavaScript ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์š”์ฒญ(request)

๋นˆ about:blank์˜ ๋นˆ ํŽ˜์ด์ง€์—์„œ ์ง„ํ–‰

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋ฐฑ์—”๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ํ™”๋ฉด์— ๋ Œ๋”๋ง(๋ฟŒ๋ฆผ)์„ ํ˜•์‹์„ ์‹ค๋ฌด์—์„œ ๋งŽ์ด ์‚ฌ์šฉ
์•„๋ž˜ JavaScript ์ฝ”๋“œ๋กœ GET์„ ๋ณด๋‚ด๋Š” ๊ฒƒ ํ™•์ธ

fetch('http://127.0.0.1:8000/')
    .then(response => response.json())
    .then(json => console.log(json))
    .catch(error => console.error(error));

์•„๋ž˜ JavaScript ์ฝ”๋“œ๋กœ POST๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ ํ™•์ธ

fetch('http://127.0.0.1:8000/', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        title: 'test',
        content: 'test',
    }),
})
    .then(response => response.json())
    .then(json => console.log(json))
    .catch(error => console.error(error));

002.js - ์‡ผํ•‘๋ชฐ ํŽ˜์ด์ง€ ์ด๋ฏธ์ง€ ๋ Œ๋”๋ง
ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ์˜ ํ˜‘์—…
๋ฐฑ์—”๋“œ์—์„œ๋Š” Content-Type์„ Json์œผ๋กœ ํ•˜๊ณ - Json๋ฐ์ดํ„ฐ๋กœ URL์„ ์š”์ฒญํ–ˆ์„ ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ด์คŒ
<- ์ด ๋•Œ, ์–ด๋–ค URL๋กœ ์š”์ฒญํ•ด์•ผ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€๋Š” API ๋ช…์„ธ์„œ์™€ ๊ฐ™์€ ๋ฌธ์„œ๋กœ ์ž‘์—…

005.htmlpost๋ฐฉ์‹๊ณผ get ๋ฐฉ์‹ ์‹ค์Šต

> GET: Path์— ์ •๋ณด๊ฐ€ ๋‹ด๊น€ **๊ฒ€์ƒ‰์ฐฝ ๊ตฌํ˜„ ๋“ฑ**
	POST: Body์— ์ •๋ณด๊ฐ€ ๋‹ด๊น€ **๊ทธ๋Ÿฌ๋ฏ€๋กœ login์ฐฝ์€ post๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•จ (์Šค๋‹ˆํ•‘ ๋ฐฉ์ง€ ๊ฐ€๋Šฅ)**

HTTP ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ

์ˆ˜์—…์—์„œ๋Š” ์‹ค์Šตํ•˜์ง„ ์•Š์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ํˆด๋กœ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ์™”๋‹ค ๊ฐ”๋‹ค ํ•˜๋Š” Request์™€ Response๋ฅผ ์ „๋ถ€ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๋ถ€๋ก) ์™€์ด์–ด์ƒคํฌ(Wireshark)

Source: ์ถœ๋ฐœ์ง€ IP (์š”์ฒญ์ž IP)

์ด๋ฏธ์ง€ ์ถœ๋ ฅํ•  ๋•Œ ๊ผญ ์ตœ์ ํ™”๋œ ์ด๋ฏธ์ง€๋ฅผ ์˜ฌ๋ฆฌ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก!! ์„œ๋กœ ๋ถ€๋‹ด๋˜๋‹ˆ๊นŒ..

Request

GET /index.html HTTP/1.1
user-agent: MSIE 6.0; Windows NT 5.0
accept: text/html; */*
cookie: name = value
referer: http://www.naver.com
host: www.paullab.co.kr

1)
host: www.paullab.co.kr
์‹ค์ œ ์šฐ๋ฆฌ๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ•  ํŽ˜์ด์ง€๊ฐ€ www.paullab.co.kr/a/b/c/index.html ์ด๋ผ๋ฉด

>> GET /a/b/c/index.html HTTP/1.1	//	์š”์ฒญ๋ผ์ธ= ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹(์š”์ฒญ๋ฉ”์„œ๋“œ), ์š”์ฒญ ํŽ˜์ด์ง€, ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „
	www.paullab.co.kr 

2) Header
์š”์ฒญ:
Accept: text/html
๋Œ€์‘๋˜๋Š” ์‘๋‹ต : Content-Type:text/html

Cookie: HTTP ํ”„๋กœํ† ์ฝœ ์ž์ฒด๊ฐ€ ์„ธ์…˜์„ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” State-less(์ ‘์†์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”) ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊ทธ์ธ ์ธ์ฆ์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜๋ ค๊ณ  ๋งŒ๋“  ์ธ์œ„์ ์ธ ๊ฐ’. ์ฆ‰ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์ƒ์ ์ธ ๋กœ๊ทธ์ธ ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํŒ๋‹จํ•˜๊ณ ์ž ์‚ฌ์šฉ.

Referer: ํ˜„์žฌ ํŽ˜์ด์ง€ ์ ‘์† ์ „์— ์–ด๋А ์‚ฌ์ดํŠธ๋ฅผ ๊ฒฝ์œ ํ–ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ๋„๋ฉ”์ธ ํ˜น์€ URL ์ •๋ณด
host: ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ๋„๋ฉ”์ธ ์ •๋ณด

HTTP ์š”์ฒญ ๋ฉ”์„œ๋“œ

GET
POST
PUT
DELETE
PATCH

GET: ์„œ๋ฒ„! ๋„ค๊ฐ€ ๊ฐ€์ง„ ์ •๋ณด๋ฅผ ์ค˜!

JavaScript์˜ Fetch API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GET ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ

fetch('https://eduapi.weniv.co.kr/753/product', {
  method: 'GET' //์ƒ๋žต๊ฐ€๋Šฅ
})
.then(response => response.json())
.then(data => {
  console.log('์„ฑ๊ณต:', data);
})
.catch(error => {
  console.error('์‹คํŒจ:', error);
});

POST: ์„œ๋ฒ„! ์ƒˆ๋กœ์šด ์ƒํ’ˆ ์ •๋ณด๋ฅผ ์ค„๊ฒŒ! ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ด์ค˜!

POST ๋ฉ”์„œ๋“œ๋Š” ์„œ๋ฒ„์— ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์š”์ฒญ ํŒจํ‚ท์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

POST /753/product HTTP/1.1
Host: https://eduapi.weniv.co.kr/
Content-Type: application/json
Content-Length: 1560

{
    "id": 8,
    "productName": "hello world keyring",
    "price": 12500,
    ... ์ƒ๋žต ...
}
const data = {
        "id": 8,
        "productName": "hello world keyring",
        "price": 12500,
        "stockCount": 100,
        "thumbnailImg": "asset/products/img/1/thumbnailImg.jpg",
        "option": [],
        "discountRate": 0,
        "shippingFee": 1500,
        "detailInfoImage": [
            "asset/products/detail/2/detail1.png",
            "asset/products/detail/2/detail2.png",
        ],
        "viewCount": 0,
        "pubDate": "2222-02-28",
        "modDate": "2222-02-28",
    }

fetch("https://eduapi.weniv.co.kr/753/product", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(data),//๋ฐ์ดํ„ฐ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝํ•ด์„œ ์ƒ์„ฑ
})
.then(response => response.json())
.then(data => {
    console.log("์„ฑ๊ณต:", data);
})
.catch(error => {
    console.error("์‹คํŒจ:", error);
});

๋ฐ์ดํ„ฐ ์ƒ์„ฑ ํ™•์ธ์„ GET ์š”์ฒญ์œผ๋กœ ํ™•์ธ

fetch('https://eduapi.weniv.co.kr/753/product', {
  method: 'GET'
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));

PUT: ์„œ๋ฒ„์•ผ ์œ ์ € ์ •๋ณด๋ฅผ ๋ฎ์–ด์”Œ์›Œ ์ค˜!

์„œ๋ฒ„์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉ
์ด ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ์ธ์ฆ ๊ฐ’๊นŒ์ง€ ํ•จ๊ป˜ ๋“ค์–ด๊ฐ€ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ธ์ฆ์„ ์ฃผ์„์ฒ˜๋ฆฌ

PUT /753/product HTTP/1.1
Host: https://eduapi.weniv.co.kr/
Content-Type: application/json
Content-Length: 1559
Authorization: ํ† ํฐ๊ฐ’

{
    "id": 1,
    "productName": "test put data",
    "price": 999999,
    ... ์ƒ๋žต ...
}
const data =  {
        "id": 1,
        "productName": "test put data",
        "price": 999999,
        "stockCount": 100,
        "thumbnailImg": "asset/products/img/1/thumbnailImg.jpg",
        "option": [],
        "discountRate": 0,
        "shippingFee": 1500,
        "detailInfoImage": [
            "asset/products/detail/2/detail1.png",
            "asset/products/detail/2/detail2.png",
        ],
        "viewCount": 0,
        "pubDate": "2022-02-28",
        "modDate": "2022-02-28",
    }

// const token = "your_bearer_token_here";
    
fetch("https://eduapi.weniv.co.kr/753/product/1", {
    method: "PUT",
    headers: {
        "Content-Type": "application/json",
        // "Authorization": `Bearer ${token}`,
    },
    body: JSON.stringify(data),
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));

DELETE: ์„œ๋ฒ„์•ผ ์žˆ๋˜ ์ •๋ณด๋ฅผ ์‚ญ์ œํ•ด์ค˜!

DELETE /753/product/1 HTTP/1.1
Host: https://eduapi.weniv.co.kr/
Authorization: ํ† ํฐ๊ฐ’
const productId = 1;
// const token = "your_bearer_token_here";

fetch(`https://eduapi.weniv.co.kr/753/product/${productId}`, {
    method: "DELETE",
    // headers: {
    //     "Authorization": `Bearer ${token}`,
    // },
})

๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ์˜ ์›๋ณธ ๋ณด๊ธฐ

009.py
006.html post ๋ฐฉ์‹์œผ๋กœ username๊ณผ pw ์ „์†ก

vsc์—์„œ live server ์„ค์น˜ํ•ด์„œ ๊ตฌ๋™ํ™•์ธํ•˜๊ธฐ

Response

MIME ; ์ด๋ฉ”์ผ์„ ์œ„ํ•ด ๊ฐœ๋ฐœ๋œ

์ƒํƒœ์ฝ”๋“œ

์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ
์ฃผ์š” ์ƒํƒœ์ฝ”๋“œ๋งŒ ์•Œ์•„๋‘๊ธฐ
์Šค์บ๋‹ ๊ณต๊ฒฉ // ํ•ด์ปค์˜ ํ’‹ํ”„๋ฆฐํŒ…์„ ๋ฐฉํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์‹œ์ง€์˜ ํ˜ผ๋ž€์„ ์ฃผ๊ธฐ๋„ ํ•จ (๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž„์˜๋กœ ์ƒํƒœ์ฝ”๋“œ๋ฅผ custom ๊ฐ€๋Šฅ) --> ์ˆซ์ž๋Š” ์ˆซ์ž์ผ ๋ฟ ! ์ด๋‹ค! ํ•˜์ง€๋งŒ ์ƒํƒœ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋„ ์•Œ์•„์•ผ ํ•จ
401 ์ธ์ฆ์ •๋ณด๊ฐ€ ์ž˜๋ชป ๋์„ ๋•Œ

5XX err = ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ค‘์š”ํ•œ ์˜ค๋ฅ˜
์„œ๋ฒ„ ์˜ค๋ฅ˜

์‹ค์Šต 10.py

๊ณผ์ œ ํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Œ..!

TCP/IP

์ธํ„ฐ๋„ท ํ†ต์‹ ์„ ์œ„ํ•œ ๊ธฐ๋ณธ ํ”„๋กœํ† ์ฝœ ์Šค์œ„ํŠธ
๋ฐ์ดํ„ฐ๋ฅผ ํŒจํ‚ท์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ „์†กํ•˜๊ณ  ์ˆ˜์‹ ์ธก์—์„œ ์žฌ์กฐ๋ฆฝ
์ฒ˜์Œ๋ถ€ํ„ฐ ํ”„๋กœํ† ์ฝœ์ด ์žˆ์—ˆ์ŒXX, ํšŒ์‚ฌ๊ฐ€ ๋‹ค๋ฅธ ์žฅ๋น„๊ฐ„์— ํ˜ธํ™˜๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ
	4๊ณ„์ธต๊ณผ OSI7๋ ˆ์ด์–ด๋Š” ํ‘œํ˜„๋ฐฉ์‹์˜ ์ฐจ์ด์ผ ๋ฟ ํ†ต์‹  ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ™์Œ

TCP/IP 4๊ณ„์ธต...
1)๋„คํŠธ์›ŒํŠธ
2)์ธํ„ฐํŽ˜์ด์Šค,์ธํ„ฐ๋„ท
3)์ „์†ก
4)์‘์šฉ

7๊ณ„์ธต) ๋ฌผ๋ฐ๋„ค์ „์„ธํ‘œ์‘

์†ก์‹ ์ธก --๊ฐ ๊ณ„์ธต์—์„œ ํ—ค๋”๊ฐ€ ์ถ”๊ฐ€๋จ
1) APP ๊ณ„์ธต (ํŽธ์ง€์ž‘์„ฑ)
2) ํŠธ๋žœ์ŠคํฌํŠธ ๊ณ„์ธต (ํŽธ์ง€๋ฅผ ํŽ˜์ด์ง€๋กœ ๋‚˜๋ˆ”)
TCP : 3-way handshake๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ ์„ค์ •
ํ๋ฆ„์ œ์–ด, ํ˜ผ์žก์ œ์–ด, ์˜ค๋ฅ˜์ œ์–ด
UDP : ์‹ ๋ขฐ์„ฑ ๋ณด์žฅX, ๋น ๋ฆ„
3) ์ธํ„ฐ๋„ท ๊ณ„์ธต
4) ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ๊ณ„์ธต
์ˆ˜์‹ ์ธก -- ๊ฐ ๊ณ„์ธต์—์„œ ํ—ค๋”๋ฅผ ๋ฒ—๊ฒจ๋ƒ„
1) ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ๊ณ„์ธต (ํŽธ์ง€ ์ˆ˜์‹ )
2) ์ธํ„ฐ๋„ท ๊ณ„์ธต (๋ด‰ํˆฌ์—์„œ ํŽ˜์ด์ง€ ๊บผ๋‚ด๊ธฐ)
3) ํŠธ๋žœ์ŠคํฌํŠธ ๊ณ„์ธต (ํŽ˜์ด์ง€ ์žฌ์กฐ๋ฆฝ)
4) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต (ํŽธ์ง€ ์ฝ๊ธฐ)

์†ก์‹ ์ธก

  • ์›๋ณธ: APP ๊ณ„์ธต์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ
  • ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ์ „์†ก์ด ์•„๋‹Œ ์ž˜๋ผ๋‚ด์„œ ์ „์†ก

Response(์‘๋‹ต)๊ณผ Request(์š”์ฒญ) ๊ณผ์ •

์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅ <-- ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€๋กœ ์ž‘์„ฑ๋จ
ํŠธ๋žœ์ŠคํฌํŠธ๊ณ„์ธต์—์„œ ๋ฉ”์‹œ์ง€๊ฐ€ ์ž˜๋ฆผ (ํŒจํ‚ท์œผ๋กœ ๋ถ„ํ•ด)

ํ”„๋กœํ† ์ฝœ์˜ ํŠน์ง•

์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ(์ƒํƒœ) / ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ (๋ฌด์ƒํƒœ)

์ƒํƒœ

์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์™€์˜ ํ†ต์‹ ์—์„œ ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๋Š”์ง€ ์—ฌ๋ถ€

Stateful(์ƒํƒœ์œ ์ง€)
HTTP: ์ƒํƒœ์œ ์ง€ ์•ˆํ•จ
์ด๊ฑธ ์–ด๋–ป๊ฒŒ ์ƒํƒœ ์œ ์ง€์‹œํ‚ค๋Š”์ง€?
Stateless(๋ฌด์ƒํƒœ)
๋‚ด์šฉ ๊ณต์œ  <-- ์„œ๋ฒ„ ๋ณ€๊ฒฝํ•ด๋„ ๊ฐ€๋Šฅ
HTTP: ์ƒํƒœ์œ ์ง€ ์•ˆํ•จ -- ์ฟ ํ‚ค, ์„ธ์…˜, ํ† ํฐ ๋“ฑ์˜ ๋งค์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ด ์ƒํƒœ์ •๋ณด๋ฅผ ์œ ์ง€

token์— ๋Œ€ํ•œ ๊ณต๋ถ€..

์ƒํƒœ์œ ์ง€์˜ ์ ˆ์ฐจ ~ JWT๊ณต๋ถ€ํ•˜๋Š”๊ฒƒ๋„ ์ข‹์„ ๋“ฏ!

์ƒํƒœ์ €์žฅ

1) ํด๋ผ์ด์–ธํŠธ ๋ฐฉ๋ฒ•:์ฟ ํ‚ค, ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ 2)์„œ๋ฒ„: ์„ธ์…˜

ํ•œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ์„ mixํ•ด ์‚ฌ์šฉ
๊ฐ ๋ฐฉ๋ฒ•์ด ์™„๋ฒฝํ•˜์ง€ ์•Š์Œ
์• ํ”Œ์ผ€์ด์…˜์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ, ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ถŒ์žฅ ๋ฐฉ๋ฒ•์— ๋งž๊ฒŒ ์‚ฌ์šฉ

์ฟ ํ‚ค

์›น๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜๋Š” ์ž‘์€ ํ…์ŠคํŠธ ํŒŒ์ผ
ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
ํด๋ผ์ด์–ธํŠธ์—์„œ id/pw ์ „๋‹ฌํ•˜๋ฉด ์„œ๋ฒ„์—์„œ ์ฟ ํ‚ค ์ „๋‹ฌ
	ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ ์‹œ ์ฟ ํ‚ค๊ฐ’๊ณผ ํ•จ๊ป˜ ์ „๋‹ฌ (์š”์ฒญ+์ฟ ํ‚ค)
    id/pw ์žฌ์ž…๋ ฅ ํ•„์š” ์—†์Œ!

์ฟ ํ‚ค์‚ญ์ œ ์‹œ ์ด๋ฆ„๊ณผ ๊ฒฝ๋กœ๋ฅผ ์ •ํ™•ํžˆ ์ง€์ •ํ•ด์•ผ ํ•จ
๋ณด์•ˆ์ƒ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ์ฟ ํ‚ค์— ์ €์žฅํ•˜์ง€ ์•Š๋Š”๊ฒŒ ์ข‹์Œ

๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ Local Storage

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” ์ €์žฅ์†Œ
๋งŒ๋ฃŒ๊ธฐ๊ฐ„์ด ์—†์Œ
ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…(XSS) ๊ณต๊ฒฉ์— ์ทจ์•ฝ

์„ธ์…˜

์„œ๋ฒ„์ธก์—์„œ ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ ‘์† ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค!

HTTPS

SSL/TLS ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด ํ†ต์‹  ๋‚ด์šฉ์„ ์•”ํ˜ธํ™”

์ค‘๊ฐ„์ž ๊ณต๊ฒฉ

RESTful API

์‹ค๋ฌด์—์„œ๋Š” API ๋ช…์„ธ๋ฅผ ๊ฐ€์ง€๊ณ  ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์™€ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘์—…
-- ๋ฌธ์„œ์ž‘์—…์€ ๋ฐฑ์—”๋“œ์—์„œ

์Šค์›จ๊ฑฐ

--
๋ฐ์ดํ„ฐ, ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๋‹ค.
๋ถ€๋„๋Ÿฝ๊ฒŒ๋„ ์ง€๊ธˆ๊นŒ์ง€ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ์ฝ”๋“œ์—๋งŒ ์‹ ๊ฒฝ์ผ์ง€ ์‹คํ–‰๋กœ์ง์— ๋Œ€ํ•ด์„œ๋Š” ๋ฐฐ์›Œ์•ผ๊ฒ ๋‹ค ๊ด€์‹ฌ๋‘์ง€ ์•Š์•˜๋Š”๋ฐ ์ธํ”„๋Ÿฐ์—์„œ ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉฐ CS๊ณต๋ถ€์˜ ์ค‘์š”์„ฑ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์ •๋ฆฌํ•˜๋Š” ๊ธฐํšŒ๊ฐ€ ๋˜์—ˆ๋‹ค.
ํŠนํžˆ ์›น๊ฐœ๋ฐœ์„ ๊ฐœ์ธ์œผ๋กœ๋งŒ ๊ณต๋ถ€ํ–ˆ์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” ํ˜‘์—…์„ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์œ„ํ•œ ๊ณต๋ถ€๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

profile
๋ฐœ๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”๋”ฉ๊ณต๋ถ€

0๊ฐœ์˜ ๋Œ“๊ธ€