Bibi's DevLog ๐Ÿค“๐ŸŽ

[Codesquad] ๋„คํŠธ์›Œํฌ - ์ƒํƒœ&๋ฌด์ƒํƒœ, ์ฟ ํ‚ค, ์„ธ์…˜, ๋กœ๊ทธ์ธ ๊ณผ์ •, ์Šคํ”„๋ง์œผ๋กœ ๋กœ๊ทธ์ธ ๊ตฌํ˜„, ์„ธ์…˜DB, ์›น์†Œ์ผ“ ๋ณธ๋ฌธ

๐Ÿ–ฅ BE ๋ฐฑ์—”๋“œ/Network ๋„คํŠธ์›Œํฌ

[Codesquad] ๋„คํŠธ์›Œํฌ - ์ƒํƒœ&๋ฌด์ƒํƒœ, ์ฟ ํ‚ค, ์„ธ์…˜, ๋กœ๊ทธ์ธ ๊ณผ์ •, ์Šคํ”„๋ง์œผ๋กœ ๋กœ๊ทธ์ธ ๊ตฌํ˜„, ์„ธ์…˜DB, ์›น์†Œ์ผ“

๋น„๋น„ bibi 2021. 3. 18. 23:50

์˜ค๋Š˜์˜ ํ˜ธ๋ˆ…์Šค ์ˆ˜์—…

์ƒํƒœ(stateful)์™€ ๋ฌด์ƒํƒœ(stateless)์˜ ์ฐจ์ด?

๋ฌด์ƒํƒœ : ์ฃผ๋ฌธํ•˜์‹œ๊ฒ ์–ด์š”? - ์ œ์œก๋ฎ๋ฐฅ ํ•˜๋‚˜ ์ฃผ์„ธ์š”.

์ƒํƒœ ์œ ์ง€ : ์ฃผ๋ฌธํ•˜์‹œ๊ฒ ์–ด์š”? - ๋Š˜ ๋จน๋˜ ๊ฑธ๋กœ ์ฃผ์„ธ์š”.

์ฟ ํ‚ค Cookie

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด, ์›น ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์ปดํ“จํ„ฐ์— ์„ค์น˜ํ•˜๋Š” ์ž‘์€ ์ •๋ณด ํŒŒ์ผ.

''์ฟ ํ‚ค''๋Š” ํ—จ์ ค๊ณผ ๊ทธ๋ ˆํ…”์—์„œ ์œ ๋ž˜ํ•œ ํ‘œํ˜„์ด๋‹ค.

์›น ์„œ๋ฒ„๋Š” ๋ฌด์ƒํƒœ(stateless)์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ˜„์žฌ ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์ด์ „์— ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž์ธ์ง€ ์•„๋‹Œ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

  • ๋กœ๊ทธ์ธ๊ณผ ๊ฐ™์ด, ํ•œ ๋ฒˆ ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ๊ฐ’์„ ์œ ์ง€ํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ž˜์„œ ์„œ๋ฒ„๋Š”..

  • ์„œ๋ฒ„ : ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›์•˜์„ ๋•Œ, Set - Cookie header๊ฐ’์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์€ ๊ฐ’์„ ํด๋ผ์ด์–ธํŠธ์— ์ „์†ก(response)ํ•œ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ : ์ดํ›„ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์— ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ Cookie header๊ฐ’์„ ํ•จ๊ป˜ ๋ณด๋‚ธ๋‹ค.

  • ์„œ๋ฒ„ : ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์š”์ฒญ์˜ Cookie header๊ฐ’์„ ๋ณด๊ณ  ์ด์ „์— ์ ‘์†ํ•œ ์‚ฌ์šฉ์ž์ธ์ง€ ์‹๋ณ„ํ•œ๋‹ค.

img

์„ธ์…˜ Session

: ๋ฐฉ๋ฌธ์ž๊ฐ€ ์›น ์„œ๋ฒ„์— ์ ‘์†ํ•ด ์žˆ๋Š” ์ƒํƒœ(state)๋ฅผ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ณด๊ณ , ๊ทธ ๋‹จ์œ„๋ฅผ ์„ธ์…˜์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ๊ฐ™์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ด๋Š” ์š”์ฒญ์„ ํ•˜๋‚˜์˜ ์ƒํƒœ๋กœ ๋ณด๊ณ , ๊ทธ ์ƒํƒœ๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€์‹œํ‚ค๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

(์ผ์ • ์‹œ๊ฐ„ : ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ์›น ์„œ๋ฒ„์— ์ ‘์†ํ•œ ์‹œ๊ฐ„๋ถ€ํ„ฐ - ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ข…๋ฃŒํ•ด ์—ฐ๊ฒฐ์„ ๋๋‚ด๋Š” ์‹œ๊ฐ„๊นŒ์ง€)

์„ธ์…˜ = ์ž„์‹œ์ €์žฅ์†Œ.

๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž 1๋ช…๋‹น 1๊ฐœ์”ฉ ์ƒ๊ธฐ๋ฉฐ, ๊ทธ ์‚ฌ์šฉ์ž ์ „์šฉ ์ €์žฅ์†Œ์ด๋‹ค.

  • ์„ธ์…˜์€ Map์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ‚ค, ๊ฐ’์œผ๋กœ ์œ ์ €๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ํ‚ค = sessionedUser, ๊ฐ’ = User
  • ์„ธ์…˜์—๋Š” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ํ•„์ˆ˜์ ์ธ ์ •๋ณด๋งŒ ๋‹ด๋Š”๋‹ค. id(ํ•„์ˆ˜), name, ๋“ฑ๋“ฑ

โ€ป ์„ธ์…˜์„ ๊ฑฐ์น˜๋ฉด ๋ณดํ†ต redirect:/main ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ์„ธ์…˜์€ ์„œ๋ฒ„ ์ค‘์—์„œ๋„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค (๊ธฐ๋ณธ์ ์œผ๋กœ). ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์„ธ์…˜DB๋ฅผ ๋งŒ๋“ค์–ด ์ €์žฅํ•œ๋‹ค(Redis).

์„ธ์…˜์—๋Š” ๋งŒ๋ฃŒ์‹œ๊ฐ„์ด ์žˆ๋‹ค.

  • ๋งŒ์•ฝ ์—†๋‹ค๋ฉด? - ๋ฉ”๋ชจ๋ฆฌ ํญ๋ฐœ ๋ฐ ํ•ดํ‚น ๊ฐ€๋Šฅ.

  • ์„ธ์…˜์ด ๋งŒ๋ฃŒ๋˜๋ฉด ๋กœ๊ทธ์•„์›ƒ๋œ๋‹ค.

  • ์š”์ฆ˜์€ ์„ธ์…˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„ ๋Œ€์‹  refreshํ† ํฐ, Authํ† ํฐ์„ ๋งŒ๋“ค์–ด refreshํ† ํฐ์€ ๊ธธ๊ฒŒ, Authํ† ํฐ์€ ์งง๊ฒŒ ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ์ •ํ•œ๋‹ค.


โœ… ๋” ๊ณต๋ถ€ํ•˜๊ธฐ : ์ฟ ํ‚ค์™€ ์„ธ์…˜ ๋ฐ ์ฐจ์ด์ . ์—ฌ๊ธฐ ์—„์ฒญ๋‚˜๊ฒŒ ์ •๋ฆฌ๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ๋‹ค! ๐Ÿ‘๐Ÿ‘


์Šคํ”„๋ง์œผ๋กœ ๋กœ๊ทธ์ธ ๊ตฌํ˜„ํ•˜๊ธฐ

UserController

@RestController
@RequestMapping("/login")
public class UserController {

    //์„ธ์…˜. <sessionId, userId>
    private Map<String, String> session = new HashMap<>();

    @GetMapping
    public MyResponse welcome() {
        return new MyResponse("ok", "Kite");
    }
    //์ด ์ƒํƒœ์—์„œ ์•ฑ์„ ์‹คํ–‰ ํ›„ `localhost:8080`์— ์ ‘์†ํ•˜๋ฉด `{"status" : "ok", "message" : "Kite"}` ์™€ ๊ฐ™์€ JSONํ˜•์‹(์ •ํ™•ํžˆ๋Š” Jackson)์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

    @GetMapping("/check")
    public MyResponse check(HttpServletRequest req) {
        // Cookie๊ฐ’์€ Http ์š”์ฒญ์— ๋“ค์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ HttpServletRequest
        String key = "sid";
        String uid = "Null";
        Cookie[] cookies = req.getCookies();
        for(Cookie c : cookies) {
            if (c.getName().equals(key)) {
                uid = session.getOrDefault(c.getValue(), "Null");
                sout("chcek: " + c.getValue() + ": " + uid);
            }
        }
        return new MyResponse("ok", "login id: " + uid);
    }

    @PostMapping
    public MyResponse login(String id, HttpServletResponse response) {
        sout(id);
        Random r = new Random(); 
        String sid = Integer.toString(r.nextInt());// ์„ธ์…˜ID : ํ•ด์‰ฌ๊ฐ’ ๋Œ€์‹  ๊ฐ„๋‹จํžˆ ๋žœ๋ค์ˆซ์ž๋กœ ๋„ฃ๋Š”๋‹ค
        session.put(sid, id);
        sout("login: " + sid + ": " + session.get(sid));
        response.addCookie(new Cookie("sid", sid)); // ์ฟ ํ‚ค๋ฅผ ์…‹ํŒ…ํ•œ๋‹ค
        return new MyResponse("ok", "sid : " + sid)
    }
}

MyResponse

public class MyResponse{
    private String status;
    private String message;

    public MyResponse(String status, String message){
        this.status = status;
        this.message = message;
    }
}

๋กœ๊ทธ์ธ ๊ณผ์ • ์„ค๋ช…

๋กœ๊ทธ์ธ ์ „ ๋กœ๊ทธ์ธ ํ›„

โ‘ ์ด ๋กœ๊ทธ์ธ ๊ณผ์ •, โ‘ก๊ฐ€ ๋กœ๊ทธ์ธ ์ดํ›„ ์ƒํƒœ์ด๋‹ค.

โ‘  ๋กœ๊ทธ์ธ

POST / login (DTO๋กœ ์ „๋‹ฌ)

Controller : @PostMapping("/login")

  • ์›๋ž˜ id, pw๋Š” HTTP Request์— ๋“ค์–ด์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ œ์–ดํ•˜์ง€ ์•Š๊ณ  ์ถ”์ƒํ™”๋œ ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • DB์— ์žˆ๋Š” ํ•ด๋‹น ์œ ์ €์™€ ๋น„๊ตํ•œ๋‹ค.

  • id, pw ๋“ฑ์„ ์ „๋‹ฌํ•  ๋•Œ DTO๊ฐ์ฒด์— ๋„ฃ์–ด ์ „๋‹ฌํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.

์„ธ์…˜ ์•„์ด๋”” sessionId

  • ๋กœ๊ทธ์ธ ๊ณผ์ •์—์„œ ๋ธŒ๋ผ์šฐ์ €์™€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ตํ™˜ํ•˜๋Š” ๊ฒƒ์€ 'sessionId'๋ฟ์ด๋‹ค. (๋ฏผ๊ฐ์ •๋ณด๊ฐ€ ์—†์–ด ๋ณด์•ˆ์— ์œ ๋ฆฌํ•˜๋‹ค)

  • ์‹ค์ œ sessionId๋Š” ๋งค์šฐ ๊ธธ๊ณ  ๋ณต์žกํ•œ ๊ฐ’(4byte์ •๋„). sessionId๋ฅผ ๋ฐ”๊ฟ”์„œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์žˆ์ง€๋งŒ ๊ทธ๋Ÿฌ๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค(๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅ)

โ‘ก ๋กœ๊ทธ์ธ ์ดํ›„

๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž๋Š” ์„ธ์…˜ ์•„์ด๋”” (sessionId, sid)๋ฅผ ์ €์žฅํ•ด ๋ณด๋‚ด์„œ ๊ตฌ๋ณ„ํ•œ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋Š” ์„ธ์…˜ ์ •๋ณด ์ „์ฒด๊ฐ€ ์•„๋‹Œ ์„ธ์…˜ ์•„์ด๋””๋งŒ ์ €์žฅํ•œ๋‹ค. (๋ณด์•ˆ, ์„ฑ๋Šฅ ๋•Œ๋ฌธ์—) - ์ฟ ํ‚ค์— ์ €์žฅํ•œ๋‹ค!

โ‘ข ๋กœ๊ทธ์•„์›ƒ

๋กœ๊ทธ์•„์›ƒ = ์„ธ์…˜ ์ •๋ณด ์‚ญ์ œ.

๋กœ๊ทธ์•„์›ƒ์€ ๋ณดํ†ต POST /logout๋กœ ์š”์ฒญํ•œ๋‹ค. (์ •๋‹ต์€ ์—†์ง€๋งŒ ์Šต๊ด€์ ์œผ๋กœ)

  • ํด๋ผ์ด์–ธํŠธ : ์ฟ ํ‚ค์— ์„ธ์…˜์•„์ด๋””๋ฅผ ๋‹ด์•„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ธ๋‹ค.
    • ์„ธ์…˜id๊ฐ€ ์œ ํšจ(valid)ํ•˜๋ฉด ๋กœ๊ทธ์•„์›ƒ์ด ๋˜๊ณ , ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด HTTP Status Code๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. (๋ณดํ†ต 401 - Unauthorized)

๋กœ๊ทธ์•„์›ƒ๊ณผ์ • :

  • ์„ธ์…˜ ์‚ญ์ œ
  • ์ฟ ํ‚ค์— ๋งŒ๋ฃŒ์‹œ๊ฐ„=ํ˜„์žฌ์‹œ๊ฐ„์œผ๋กœ ๋‹ด์•„์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๊ธฐ
  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์ฟ ํ‚ค๊ฐ€ ๋งŒ๋ฃŒ๋˜๋ฏ€๋กœ ์‚ญ์ œ๋จ

HTTP session์€ ์ž๋ฐ” ์„œ๋ธ”๋ฆฟ์— ์†ํ•ด ์žˆ๋‹ค.

ํ˜„์—…์—์„œ๋Š” ์„œ๋ธ”๋ฆฟ ๋Œ€์‹  Spring Security๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค - ๋งค์šฐ ์–ด๋ ค์šฐ๋‹ˆ ๋‚˜์ค‘์— ๊ณผ์ • ๋๋‚˜๊ณ  ํ•ด๋ณด๊ธฐ

์˜›๋‚ ์—๋Š”..

์˜›๋‚  ์ฟ ํ‚ค ๋ฐฉ์‹

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฟ ํ‚ค์— id, pw๋ฅผ ๋‹ด์•„? ์„œ๋ฒ„์— ๋ณด๋‚ธ๋‹ค.
    • ์ฟ ํ‚ค๋Š” ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค
  • ์ฟ ํ‚ค์— ๋‹ด๊ฒจ์ง„ id, pw๋ฅผ ๋ณด๊ณ  ์„œ๋ฒ„๊ฐ€ DB์™€ ๋น„๊ตํ•ด ๋กœ๊ทธ์ธ์„ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.
  • ์ค‘์š”ํ•œ ์ •๋ณด๋Š” ์ ˆ๋Œ€๋กœ ํด๋ผ์ด์–ธํŠธ์— ๋„ฃ์œผ๋ฉด ์•ˆ ๋˜๋Š”๋ฐ, id pw๋ฅผ ๋‹ค ๋„ฃ์–ด ๋ณด๋ƒˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์— ๋งค์šฐ ์ทจ์•ฝํ–ˆ๋‹ค.

์„ธ์…˜DB (Session DB, SDB)

์„ธ์…˜DB

์„ธ์…˜์€ ์„œ๋ฒ„ ์ค‘์—์„œ๋„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค (๊ธฐ๋ณธ์ ์œผ๋กœ).

ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์„ธ์…˜๋„ ๋งŽ์•„์ง€๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ„ฐ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์„ธ์…˜DB๋ฅผ ๋งŒ๋“ค์–ด ์ €์žฅํ•œ๋‹ค(Redis ๊ฐ™์€).

์„ธ์…˜์ •๋ณด๊ฐ€ ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋ฉด, ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ๋Œ€์ผ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์„œ๋ฒ„์™€ ์„ธ์…˜ ์ •๋ณด๋ฅผ ๋‚˜๋ˆ„๊ธฐ ํž˜๋“ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ ์„ธ์…˜ ๋””๋น„๋ฅผ ์“ฐ๋Š”๊ฑด๊ฐ€์š”? -> YES.

  • ์„ธ์…˜DB๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๊ฑธ ์‚ฌ์šฉํ•˜๊ณ , (์„ธ์…˜DB๋ฐฉ์‹)

  • ์„ธ์…˜DB๊ฐ€ ์—†์œผ๋ฉด ๋ณ„๋„์˜ ์ฑ„๋„channel์„ ๋งŒ๋“ค์–ด ๋ชจ๋“  ์„œ๋ฒ„๋“ค๋ผ๋ฆฌ ์„ธ์…˜์ •๋ณด๋ฅผ ๊ณต์œ ํ•œ๋‹ค.

Case1. Sticky session

๋กœ๋“œ๋ฐธ๋Ÿฐ์„œL7 - SessionDB๊ฐ€ ํ•„์š”์—†๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ถ”๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๊ฐ ์‚ฌ์šฉ์ž๋งˆ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ์ „์šฉ ์„œ๋ฒ„?๊ฐ€ ์žˆ๋‹ค.

Case2. SDB (์„ธ์…˜DB)

๋กœ๋“œ๋ฐธ๋Ÿฐ์„œL4 - ์„ธ์…˜DB

๋ชจ๋“  ์„ธ์…˜์ •๋ณด๋Š” ์„ธ์…˜DB์—์„œ ๊ด€๋ฆฌ๋œ๋‹ค.

Redis๊ฐ™์€ DB๋Š” LRU (Least Recently Used)๋ผ๋Š” ๋งŒ๋ฃŒ์ˆ˜๋ช…์ด ์žˆ๋‹ค.

(SDB์šฉ๋Ÿ‰๋ณด๋‹ค ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘์†ํ•  ๊ฒฝ์šฐ ๊ฐ€์žฅ ์˜›๋‚ ์— ์ ‘์†ํ–ˆ๋˜ ์„ธ์…˜์„ ๋งŒ๋ฃŒ์‹œํ‚จ๋‹ค=๋กœ๊ทธ์•„์›ƒ๋œ๋‹ค)

๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋Š” HTTPํ—ค๋”๋ฅผ ์ฝ๋Š” ๋Šฅ๋ ฅ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ์š”์ฒญ์„ ์•Œ์•„๋ณด๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ๋ชฉ์ ์ง€๋กœ ๋ถ„์‚ฐํ•ด ์ค€๋‹ค (L7 ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋Š” ์ด ๋Šฅ๋ ฅ์ด ์žˆ๊ณ , L4๋Š” ์—†๋‹ค. ๊ทธ๋ž˜์„œ L7์ด ๋” ๋น„์‹ธ๋‹ค)

์›น์†Œ์ผ“ WebSocket

HTTP๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค (๋ฌด์ƒํƒœ ํ”„๋กœํ† ์ฝœ์ด๋‹ค.) (=์ปค๋„ฅ์…˜์ด ์—†๋‹ค?)

ํ•˜์ง€๋งŒ ์š”์ฆ˜์€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ฒŒ ํ•˜๊ณ  ์‹ถ์–ด์„œ(์ปค๋„ฅ์…˜์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์–ด์„œ) ์›น์†Œ์ผ“WebSocket์ด๋ผ๋Š” ๊ฒƒ์ด ๋‚˜์™”๋‹ค.

์›น์†Œ์ผ“์€ ์‹œ์ž‘์€ HTTP๋กœ ํ•˜์ง€๋งŒ, TCP/IP์œ„์—์„œ ๋Œ์•„๊ฐ„๋‹ค. (์„ฑ๋Šฅ์„ ์œ„ํ•ด)

๊ถ๊ธˆํ•œ๊ฒŒ ์ €๋Š” stateless ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด, ํ•œ์ •๋œ connection pool ๋กœ๋„ ๊ต‰์žฅํžˆ ๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ด๋ผ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋‹ค์‹œ ์›น ์†Œ์ผ“์œผ๋กœ ์ปค๋„ฅ์…˜ ์œ ์ง€ํ•˜๋ฉด ๋Œ€๊ทœ๋ชจ ์ปค๋„ฅ์…˜์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋‚˜์š”?

๊ทธ๋ž˜์„œ ์š”์ฆ˜์€ ์„œ๋ฒ„๊ฐ€ ๊ต‰์žฅํžˆ ๋ฌด๊ฑฐ์›Œ์กŒ๋‹ค. ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์€ ์„œ๋น„์Šค๋Š” ์„œ๋ฒ„๊ฐ€ ์˜ค์ฒœ๋Œ€.

โ— ์˜ค๋Š˜ ๋‚ด์šฉ์ด ์–ด๋ ค์› ๋‹ค๋ฉด HTTP, TCP/IP ํ‚ค์›Œ๋“œ ์ค‘์‹ฌ์œผ๋กœ ๊ณต๋ถ€ํ•˜๋ฉด ๋œ๋‹ค. (์–‡์€ ์ฑ…๋ถ€ํ„ฐ ๋ณด์ž)