[Day 31 | Spring] Spring Web MVC - ์ฟ ํ‚ค(Cookie)

yโ™กdingยท2024๋…„ 11์›” 25์ผ

๋ฐ๋ธŒ์ฝ”์Šค TIL - Spring

๋ชฉ๋ก ๋ณด๊ธฐ
31/46

๐Ÿช

1. ์ฟ ํ‚ค๋ž€?

  • ์ฟ ํ‚ค(Cookie)๋Š” ์›น ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์— ์ €์žฅํ•˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„ ์ƒํƒœ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์—์„œ ์„ค์ •ํ•œ ์ฟ ํ‚ค๋ฅผ ์ €์žฅํ•˜๊ณ , ์ดํ›„ ๋™์ผํ•œ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ฟ ํ‚ค๋ฅผ ํ•จ๊ป˜ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

2. ์ฟ ํ‚ค์˜ ์ฃผ์š” ํŠน์ง•

  • ์ €์žฅ ์œ„์น˜: ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €).
  • ์ „์†ก ๋ฐฉ์‹: HTTP ์š”์ฒญ ํ—ค๋”(Cookie)์™€ ์‘๋‹ต ํ—ค๋”(Set-Cookie)๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์™€ ์ฃผ๊ณ ๋ฐ›์Œ.
  • ์ˆ˜๋ช…:
    • ์„ธ์…˜ ์ฟ ํ‚ค: ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ์œผ๋ฉด ์‚ญ์ œ.
    • ์˜๊ตฌ ์ฟ ํ‚ค: ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์„ค์ •ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ์•„๋„ ์œ ์ง€๋จ.
  • ๋ณด์•ˆ:
    • ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋˜๋ฏ€๋กœ ์กฐ์ž‘ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ(HTTPS, HttpOnly๋กœ ๋ณด์•ˆ ๊ฐ•ํ™” ๊ฐ€๋Šฅ).
  • ์šฉ๋Ÿ‰ ์ œํ•œ:
    • ํ•˜๋‚˜์˜ ์ฟ ํ‚ค ํฌ๊ธฐ๋Š” ์ตœ๋Œ€ 4KB.
    • ๋„๋ฉ”์ธ๋‹น ์ตœ๋Œ€ 20~50๊ฐœ(๋ธŒ๋ผ์šฐ์ €์— ๋”ฐ๋ผ ๋‹ค๋ฆ„).

3. ์ฟ ํ‚ค์˜ ๋™์ž‘ ๋ฐฉ์‹

3.1 ๋ฐ์ดํ„ฐ ํ๋ฆ„

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ.
  2. ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต ํ—ค๋”์— Set-Cookie๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฟ ํ‚ค ์ „๋‹ฌ.
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ์ฟ ํ‚ค๋ฅผ ์ €์žฅ.
  4. ์ดํ›„ ์š”์ฒญ ์‹œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ €์žฅ๋œ ์ฟ ํ‚ค๋ฅผ HTTP ์š”์ฒญ ํ—ค๋”์— ์ถ”๊ฐ€.


4. ์ฟ ํ‚ค ์„ค์ •

4.1 ์ฟ ํ‚ค ์„ค์ • ํ—ค๋”

Set-Cookie: sessionId=abc123; Max-Age=3600; Path=/; HttpOnly; Secure
  • sessionId=abc123: ์ฟ ํ‚ค ์ด๋ฆ„๊ณผ ๊ฐ’.
  • Max-Age=3600: ์ฟ ํ‚ค์˜ ์ˆ˜๋ช…(์ดˆ ๋‹จ์œ„).
  • Path=/: ์ฟ ํ‚ค๊ฐ€ ์ ์šฉ๋  ๊ฒฝ๋กœ.
  • HttpOnly: JavaScript๋กœ ์ ‘๊ทผ ๋ถˆ๊ฐ€, XSS ๊ณต๊ฒฉ ๋ฐฉ์ง€.
  • Secure: HTTPS ์—ฐ๊ฒฐ์—์„œ๋งŒ ์ „์†ก.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญํ•  ๋•Œ ์ฟ ํ‚ค๋ฅผ ํ•จ๊ป˜ ์ „์†ก.
Cookie: sessionId=abc123

4.2 Spring MVC์—์„œ ์ฟ ํ‚ค ์„ค์ •

์ฟ ํ‚ค ์ƒ์„ฑ

@GetMapping("/set-cookie")
public ResponseEntity<String> setCookie(HttpServletResponse response) {
    Cookie cookie = new Cookie("username", "ํ™๊ธธ๋™");
    cookie.setMaxAge(7 * 24 * 60 * 60); // 7์ผ ์œ ์ง€
    cookie.setPath("/"); // ๋ชจ๋“  ๊ฒฝ๋กœ์—์„œ ์œ ํšจ
    cookie.setHttpOnly(true); // JavaScript ์ ‘๊ทผ ๋ถˆ๊ฐ€
    cookie.setSecure(true); // HTTPS์—์„œ๋งŒ ์ „์†ก
    response.addCookie(cookie);
    return ResponseEntity.ok("Cookie set!");
}

์ฟ ํ‚ค ์ฝ๊ธฐ

@GetMapping("/get-cookie")
public ResponseEntity<String> getCookie(@CookieValue(value = "username", defaultValue = "Guest") String username) {
    return ResponseEntity.ok("Hello, " + username);
}

๋ชจ๋“  ์ฟ ํ‚ค ์ฝ๊ธฐ

@GetMapping("/get-all-cookies")
public ResponseEntity<String> getAllCookies(HttpServletRequest request) {
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            System.out.println(cookie.getName() + " = " + cookie.getValue());
        }
    }
    return ResponseEntity.ok("Cookies printed in server logs.");
}

์ฟ ํ‚ค ์‚ญ์ œ


์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ ์‚ญ์ œํ•˜๋ ค๋ฉด ์ฟ ํ‚ค์˜ ์ˆ˜๋ช…์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ์„œ๋ฒ„์—์„œ ๋™์ผํ•œ ์ด๋ฆ„๊ณผ ๊ฒฝ๋กœ๋กœ ๋งŒ๋ฃŒ๋œ ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ญ์ œ ๋ฐฉ๋ฒ•

  1. ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ •:
    • Max-Age๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ์ฆ‰์‹œ ์ฟ ํ‚ค๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
    • Expires๋ฅผ ๊ณผ๊ฑฐ ์‹œ๊ฐ„์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  2. ์ฟ ํ‚ค ๊ฒฝ๋กœ์™€ ๋„๋ฉ”์ธ ์ผ์น˜:
    • ์‚ญ์ œํ•˜๋ ค๋Š” ์ฟ ํ‚ค์™€ ๋™์ผํ•œ ๊ฒฝ๋กœ์™€ ๋„๋ฉ”์ธ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4.2. Spring์—์„œ ์ฟ ํ‚ค ์‚ญ์ œํ•˜๊ธฐ

4.2.1 HttpServletResponse๋กœ ์ฟ ํ‚ค ์‚ญ์ œ

  • ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋งŒ๋ฃŒ๋œ ์ฟ ํ‚ค๋ฅผ ๋ณด๋‚ด๋„๋ก ์„ค์ •.
@GetMapping("/delete-cookie")
public ResponseEntity<String> deleteCookie(HttpServletResponse response) {
    Cookie cookie = new Cookie("username", null); // ๊ฐ’์€ null๋กœ ์„ค์ •
    cookie.setMaxAge(0); // ์ฆ‰์‹œ ๋งŒ๋ฃŒ
    cookie.setPath("/"); // ๊ฒฝ๋กœ ์ผ์น˜
    response.addCookie(cookie);
    return ResponseEntity.ok("Cookie deleted");
}

๋™์ž‘ ์›๋ฆฌ

  • ๋™์ผํ•œ ์ด๋ฆ„, ๊ฒฝ๋กœ, ๋„๋ฉ”์ธ์˜ ์ฟ ํ‚ค๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋งŒ๋ฃŒ๋˜์–ด ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

4.2.2 HttpServletRequest๋กœ ์ฟ ํ‚ค ํ™•์ธ ํ›„ ์‚ญ์ œ

  • ์š”์ฒญ์—์„œ ํŠน์ • ์ฟ ํ‚ค๋ฅผ ๊ฒ€์ƒ‰ํ•œ ํ›„ ์‚ญ์ œ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
@GetMapping("/delete-specific-cookie")
public ResponseEntity<String> deleteSpecificCookie(HttpServletRequest request, HttpServletResponse response) {
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if ("username".equals(cookie.getName())) {
                Cookie deleteCookie = new Cookie("username", null);
                deleteCookie.setMaxAge(0); // ์ฆ‰์‹œ ๋งŒ๋ฃŒ
                deleteCookie.setPath("/");
                response.addCookie(deleteCookie);
            }
        }
    }
    return ResponseEntity.ok("Specific cookie deleted");
}

4.3. JavaScript๋กœ ์ฟ ํ‚ค ์‚ญ์ œ

ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ JavaScript๋ฅผ ์‚ฌ์šฉํ•ด ์ฟ ํ‚ค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, HttpOnly๊ฐ€ ์„ค์ •๋œ ์ฟ ํ‚ค๋Š” JavaScript๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

// ์ฟ ํ‚ค ์‚ญ์ œ
document.cookie = "username=; Max-Age=0; path=/;";

์ฟ ํ‚ค ์‚ญ์ œ ์‹œ ์ฃผ์˜ ์‚ฌํ•ญ

  1. ๊ฒฝ๋กœ(Path)์™€ ๋„๋ฉ”์ธ(Domain):
    • ์‚ญ์ œํ•˜๋ ค๋Š” ์ฟ ํ‚ค์™€ ๋™์ผํ•œ ๊ฒฝ๋กœ์™€ ๋„๋ฉ”์ธ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  2. ๋ณด์•ˆ ์†์„ฑ:
    • HttpOnly, Secure ์†์„ฑ์ด ์„ค์ •๋œ ์ฟ ํ‚ค๋Š” ์„œ๋ฒ„์—์„œ๋งŒ ์‚ญ์ œ ๊ฐ€๋Šฅํ•˜๋ฉฐ, JavaScript๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  3. ์ฟ ํ‚ค ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ:
    • ์‚ญ์ œํ•˜๋ ค๋Š” ์ฟ ํ‚ค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋„ ์„œ๋ฒ„๊ฐ€ ๋งŒ๋ฃŒ๋œ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

  • ์ฟ ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด:
    1. Max-Age=0 ๋˜๋Š” Expires๋ฅผ ๊ณผ๊ฑฐ๋กœ ์„ค์ •.
    2. ๋™์ผํ•œ ์ด๋ฆ„, ๊ฒฝ๋กœ, ๋„๋ฉ”์ธ์œผ๋กœ ์„ค์ •.
  • ๋ณด์•ˆ ์ฟ ํ‚ค ์‚ญ์ œ:
    • HttpOnly, Secure ์†์„ฑ์ด ์„ค์ •๋œ ์ฟ ํ‚ค๋Š” ์„œ๋ฒ„์—์„œ๋งŒ ์‚ญ์ œ ๊ฐ€๋Šฅ.
  • ๋ชจ๋“  ์ฟ ํ‚ค ์‚ญ์ œ:
    • ์„œ๋ฒ„๋Š” ๋ชจ๋“  ์ฟ ํ‚ค ์ด๋ฆ„์„ ํ™•์ธ ํ›„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์‚ญ์ œํ•ด์•ผ ํ•จ.

5. ์ฟ ํ‚ค์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€

  1. ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€: ์„ธ์…˜ ID๋ฅผ ์ฟ ํ‚ค์— ์ €์žฅ.
  2. ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ ์„ค์ •: ํ…Œ๋งˆ, ์–ธ์–ด, ๊ธ€๊ผด ํฌ๊ธฐ ๋“ฑ.
  3. ๊ด‘๊ณ  ์ถ”์ : ์‚ฌ์šฉ์ž ๋ฐฉ๋ฌธ ๊ธฐ๋ก ์ €์žฅ.
  4. ์žฅ๋ฐ”๊ตฌ๋‹ˆ: ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ฐ์ดํ„ฐ ์ž„์‹œ ์ €์žฅ.

6. ์ฟ ํ‚ค์˜ ๋ณด์•ˆ ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ

6.1 ๋ณด์•ˆ ๋ฌธ์ œ

  1. ๊ฐ€๋กœ์ฑ„๊ธฐ:
    • HTTP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฟ ํ‚ค๊ฐ€ ํ‰๋ฌธ์œผ๋กœ ์ „์†ก๋˜์–ด ๋„์ฒญ ๊ฐ€๋Šฅ.
  2. ์กฐ์ž‘ ๊ฐ€๋Šฅ์„ฑ:
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฟ ํ‚ค ๊ฐ’์„ ์ž„์˜๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ.
  3. XSS ๊ณต๊ฒฉ:
    • ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฟ ํ‚ค ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์Œ.

6.2 ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐฉ๋ฒ•

  1. HTTPS ์‚ฌ์šฉ:
    • HTTPS๋ฅผ ํ†ตํ•ด ์ฟ ํ‚ค ์ „์†ก ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”.
  2. HttpOnly ์„ค์ •:
    • JavaScript๋กœ ์ฟ ํ‚ค ์ ‘๊ทผ์„ ์ฐจ๋‹จ.
  3. Secure ์„ค์ •:
    • HTTPS ์—ฐ๊ฒฐ์—์„œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†ก.
  4. SameSite ์„ค์ •:
    • ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์œ„์กฐ(CSRF) ๋ฐฉ์ง€.
    • ๊ฐ’:
      • Strict: ์ฟ ํ‚ค๋Š” ๋™์ผํ•œ ์‚ฌ์ดํŠธ์—์„œ๋งŒ ์ „์†ก.
      • Lax: ๋Œ€๋ถ€๋ถ„์˜ ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ์—์„œ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š์Œ.
      • None: ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ์—์„œ๋„ ์ฟ ํ‚ค ์ „์†ก(๋‹จ, Secure ํ•„์š”).
Cookie cookie = new Cookie("sessionId", "abc123");
cookie.setHttpOnly(true);
cookie.setSecure(true);
cookie.setPath("/");
cookie.setMaxAge(3600); // 1์‹œ๊ฐ„
response.addCookie(cookie);

7. ์ฟ ํ‚ค์˜ ๋‹จ์ 

  1. ํฌ๊ธฐ ์ œํ•œ: 4KB ์ œํ•œ์œผ๋กœ ์ธํ•ด ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์Œ.
  2. ํด๋ผ์ด์–ธํŠธ ์˜์กด์„ฑ: ์ฟ ํ‚ค๊ฐ€ ์†์ƒ๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋  ๊ฐ€๋Šฅ์„ฑ.
  3. ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ: ์ž˜๋ชป ์„ค์ •๋œ ์ฟ ํ‚ค๋Š” ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜.

8. ์š”์•ฝ: ์ฟ ํ‚ค์˜ ์žฅ๋‹จ์ 

์žฅ์ ๋‹จ์ 
ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ ์ •๋ณด๋ฅผ ์‰ฝ๊ฒŒ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ ๊ฐ€๋Šฅ์šฉ๋Ÿ‰ ์ œํ•œ(4KB)
์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฐ์†Œ (์ƒํƒœ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜์ง€ ์•Š์Œ)ํด๋ผ์ด์–ธํŠธ์—์„œ ์กฐ์ž‘ ๊ฐ€๋Šฅ (๋ณด์•ˆ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ)
์ˆ˜๋ช… ์„ค์ • ๊ฐ€๋Šฅ (์งง๊ฑฐ๋‚˜ ๊ธด ์‹œ๊ฐ„ ๋™์•ˆ ์œ ์ง€ ๊ฐ€๋Šฅ)HTTP๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜๋ฏ€๋กœ ๋„์ฒญ ์œ„ํ—˜ (HTTPS ํ•„์š”)
๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ํ˜ธํ™˜์„ฑ ๋†’์Œ์ฟ ํ‚ค์˜ ์ž˜๋ชป๋œ ์„ค์ •์œผ๋กœ ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ

1.3 ์ฟ ํ‚ค์™€ ์„ธ์…˜์˜ ์ฐจ์ด์ 

ํ•ญ๋ชฉ์ฟ ํ‚ค(Cookie)์„ธ์…˜(Session)
์ €์žฅ ์œ„์น˜ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์„œ๋ฒ„
๋ฐ์ดํ„ฐ ์šฉ๋Ÿ‰4KB ์ œํ•œ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜์กด
๋ณด์•ˆํด๋ผ์ด์–ธํŠธ์—์„œ ์‰ฝ๊ฒŒ ์กฐ์ž‘ ๊ฐ€๋Šฅ (HTTPS๋กœ ์ „์†ก ์•”ํ˜ธํ™” ํ•„์š”)ํด๋ผ์ด์–ธํŠธ์—์„œ ์ง์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€, ์„œ๋ฒ„๊ฐ€ ๊ด€๋ฆฌ
์†๋„๋น ๋ฆ„ (ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ)์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ (๋งค ์š”์ฒญ๋งˆ๋‹ค ์„œ๋ฒ„ ํ™•์ธ ํ•„์š”)
์œ ์ง€ ์‹œ๊ฐ„๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์„ค์ • ๊ฐ€๋Šฅ, ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ ์‹œ ์‚ญ์ œ ๊ฐ€๋Šฅ์„ธ์…˜ ํƒ€์ž„์•„์›ƒ ์„ค์ • ๊ฐ€๋Šฅ
์‚ฌ์šฉ ์‚ฌ๋ก€์‚ฌ์šฉ์ž์˜ ๊ธฐ๋ณธ ์„ค์ • ์ €์žฅ, ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€์‚ฌ์šฉ์ž ์ธ์ฆ, ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ฐ์ดํ„ฐ, ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

์ฟ ํ‚ค๋ฅผ ํ†ตํ•œ ๋กœ๊ทธ์ธ ๊ณผ์ •

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