์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ์ž ๋“ฑ๋ก ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์œ„ํ•œ Rutoken ๊ธฐ์ˆ  ์‚ฌ์šฉ ๊ฒฝํ—˜(2๋ถ€)

์ข‹์€ ์˜คํ›„์—์š” ์ด ์ฃผ์ œ๋ฅผ ๊ณ„์†ํ•˜์ž์ด์ „ํŽธ์€ ๋งํฌ์—์„œ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ์‹ค์šฉ์ ์ธ ๋ถ€๋ถ„์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ๋ณธ๊ฒฉ์ ์ธ ์˜คํ”ˆ ์†Œ์Šค ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ openSSL์„ ๊ธฐ๋ฐ˜์œผ๋กœ CA๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Windows 7์„ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

openSSL์„ ์„ค์น˜ํ•˜๋ฉด ๋ช…๋ น์ค„์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์•”ํ˜ธํ™” ์ž‘์—…(์˜ˆ: ํ‚ค ๋ฐ ์ธ์ฆ์„œ ์ƒ์„ฑ)์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์„ค์น˜ ๋ฐฐํฌํŒ openssl-1.1.1g๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
    openSSL์—๋Š” ๋‹ค์–‘ํ•œ ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค. Rutoken ๋ฌธ์„œ์—๋Š” openSSL ๋ฒ„์ „ 1.1.0 ์ด์ƒ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. openssl-1.1.1g ๋ฒ„์ „์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. openSSL์€ ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณด๋‹ค ์‰ฝ๊ฒŒ โ€‹โ€‹์„ค์น˜ํ•˜๋ ค๋ฉด ์ธํ„ฐ๋„ท์—์„œ Windows์šฉ ์„ค์น˜ ํŒŒ์ผ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์„ ์œ„ํ•ด ์ด๊ฒƒ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค: slproweb.com/products/Win32OpenSSL.html
    ํŽ˜์ด์ง€๋ฅผ ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•˜์—ฌ Win64 OpenSSL v1.1.1g EXE 63MB ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  2. ์ปดํ“จํ„ฐ์— openssl-1.1.1g๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
    ์„ค์น˜๋Š” ๋ฐ˜๋“œ์‹œ C:Program Files ํด๋”์— ์ž๋™์œผ๋กœ ์ง€์ •๋˜๋Š” ํ‘œ์ค€ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ์ง„ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์€ OpenSSL-Win64 ํด๋”์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
  3. ํ•„์š”ํ•œ ๋ฐฉ์‹์œผ๋กœ openSSL์„ ์„ค์ •ํ•˜๋ ค๋ฉด openssl.cfg ํŒŒ์ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋‹จ๋ฝ์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ openSSL์„ ์„ค์น˜ํ•œ ๊ฒฝ์šฐ ์ด ํŒŒ์ผ์€ C:\Program Files\OpenSSL-Win64bin ๊ฒฝ๋กœ์— ์žˆ์Šต๋‹ˆ๋‹ค. openssl.cfg๊ฐ€ ์ €์žฅ๋œ ํด๋”๋กœ ์ด๋™ํ•˜๊ณ  Notepad++ ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค.
  4. openssl.cfg ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ธ์ฆ ๊ธฐ๊ด€์ด ์–ด๋–ป๊ฒŒ๋“  ๊ตฌ์„ฑ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ง์ž‘ํ•˜์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ƒ๊ฐ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ์˜ณ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” [ ca ] ๋ช…๋ น์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. openssl.cfg ํŒŒ์ผ์—์„œ ๋ณ€๊ฒฝํ•  ํ…์ŠคํŠธ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์€ [ ca ]๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ์ด์ œ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ ์„ค์ •์˜ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
    [ ca ]
    default_ca	= CA_default		
    
     [ CA_default ]
    dir		= /Users/username/bin/openSSLca/demoCA		 
    certs		= $dir/certs		
    crl_dir		= $dir/crl		
    database	= $dir/index.txt	
    new_certs_dir	= $dir/newcerts	
    certificate	= $dir/ca.crt 	
    serial		= $dir/private/serial 		
    crlnumber	= $dir/crlnumber	
    					
    crl		= $dir/crl.pem 		
    private_key	= $dir/private/ca.key
    x509_extensions	= usr_cert
    

    ์ด์ œ ์œ„์˜ ์˜ˆ์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ decoCA ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  dir์— ์ง€์ •๋œ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ ์ด ๋””๋ ‰ํ† ๋ฆฌ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค(/Users/username/bin/openSSLca/demoCA๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค).

    dir์˜ ์ฒ ์ž๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ธ์ฆ ์„ผํ„ฐ๊ฐ€ ์œ„์น˜ํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” /Users(์ฆ‰, ์ผ๋ถ€ ์‚ฌ์šฉ์ž์˜ ๊ณ„์ •)์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ C: Program Files์— ๋ฐฐ์น˜ํ•˜๋ฉด ์‹œ์Šคํ…œ์€ openssl.cfg ์„ค์ •์ด ์žˆ๋Š” ํŒŒ์ผ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์ ์–ด๋„ ์ €์—๊ฒŒ๋Š” ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค).

    $dir - dir์— ์ง€์ •๋œ ๊ฒฝ๋กœ๊ฐ€ ์—ฌ๊ธฐ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.

    ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ ์€ ๋นˆ index.txt ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์ด ์—†์œผ๋ฉด โ€œopenSSL ca โ€ฆโ€ ๋ช…๋ น์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ๋˜ํ•œ ์ง๋ ฌ ํŒŒ์ผ, ๋ฃจํŠธ ๊ฐœ์ธ ํ‚ค(ca.key), ๋ฃจํŠธ ์ธ์ฆ์„œ(ca.crt)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ์–ป๋Š” ๊ณผ์ •์€ ์•„๋ž˜์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  6. Rutoken์—์„œ ์ œ๊ณตํ•˜๋Š” ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
    ์ด ์—ฐ๊ฒฐ์€ openssl.cfg ํŒŒ์ผ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    • ์šฐ์„ , ํ•„์š”ํ•œ Rutoken ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. rtengine.dll, rtpkcs11ecp.dll ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
      ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด Rutoken SDK๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์„ธ์š”. www.rutoken.ru/developers/sdk.

      Rutoken SDK๋Š” Rutoken์„ ์‹œํ—˜ํ•ด๋ณด๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ Rutoken์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ์˜ˆ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ rtengine.dll ๋ฐ rtpkcs11ecp.dll์€ ๊ฐ๊ฐ Rutoken SDK์˜ ๋‹ค์Œ ์œ„์น˜์— ์žˆ์Šต๋‹ˆ๋‹ค.

      SDK/openssl/rtengine/bin/windows-x86_64/lib/rtengine.dll
      SDK/pkcs11/lib/windows-x86_64/rtpkcs11ecp.dll

      ๋งค์šฐ ์ค‘์š”ํ•œ ์ ์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ rtengine.dll, rtpkcs11ecp.dll์€ Rutoken์šฉ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Rutoken์ด ์ปดํ“จํ„ฐ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (Rutoken์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์„ค์น˜ํ•˜๋ ค๋ฉด ๊ธฐ์‚ฌ์˜ ์ด์ „ ๋ถ€๋ถ„์„ ์ฐธ์กฐํ•˜์„ธ์š”. habr.com/en/post/506450)

    • rtengine.dll ๋ฐ rtpkcs11ecp.dll ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž ๊ณ„์ •์˜ ์–ด๋Š ์œ„์น˜์—๋‚˜ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • openssl.cfg์— ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด openssl.cfg ํŒŒ์ผ์„ ์—ด๊ณ  ์ด ํŒŒ์ผ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
      openssl_conf = openssl_def

      ํŒŒ์ผ ๋์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

      [ openssl_def ]
      engines = engine_section
      [ engine_section ]
      rtengine = gost_section
      [ gost_section ]
      dynamic_path = /Users/username/bin/sdk-rutoken/openssl/rtengine/bin/windows-x86_64/lib/rtengine.dll
      MODULE_PATH = /Users/username/bin/sdk-rutoken/pkcs11/lib/windows-x86_64/rtpkcs11ecp.dll
      RAND_TOKEN = pkcs11:manufacturer=Aktiv%20Co.;model=Rutoken%20ECP
      default_algorithms = CIPHERS, DIGEST, PKEY, RAND
      

      Dynamic_path - rtengine.dll ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      MODULE_PATH - rtpkcs11ecp.dll ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  7. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    openssl.cfg ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” OPENSSL_CONF ๋ณ€์ˆ˜๊ฐ€ C:Program FilesOpenSSL-Win64binopenssl.cfg ๊ฒฝ๋กœ๋กœ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    ๊ฒฝ๋กœ ๋ณ€์ˆ˜์—์„œ openssl.exe๊ฐ€ ์žˆ๋Š” ํด๋”์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” C: Program FilesOpenSSL-Win64bin์ž…๋‹ˆ๋‹ค.

  8. ์ด์ œ 5๋‹จ๊ณ„๋กœ ๋Œ์•„๊ฐ€์„œ ๋ฐ๋ชจCA ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•ด ๋ˆ„๋ฝ๋œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    1. ์—†์ด๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ฒซ ๋ฒˆ์งธ ์ค‘์š”ํ•œ ํŒŒ์ผ์€ ์ง๋ ฌ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ํ™•์žฅ์ž๊ฐ€ ์—†๋Š” ํŒŒ์ผ์ด๋ฉฐ ๊ฐ’์€ 01์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์„ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ๋‚ด๋ถ€์— 01์„ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ sdk/openssl/rtengine/samples/tool/demoCA ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ Rutoken SDK์—์„œ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. /.
      DemoCA ๋””๋ ‰ํ„ฐ๋ฆฌ์—๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๊ผญ ํ•„์š”ํ•œ ์ง๋ ฌ ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    2. ๋ฃจํŠธ ๊ฐœ์ธ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      ์ด๋ฅผ ์œ„ํ•ด ๋ช…๋ น์ค„์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” openSSL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

      openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:A -out ca.key

    3. ๋ฃจํŠธ ์ธ์ฆ์„œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
      ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค์Œ openSSL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

      openssl req -utf8 -x509 -key ca.key -out ca.crt

      ๋ฃจํŠธ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๋œ ๋ฃจํŠธ ๊ฐœ์ธ ํ‚ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ช…๋ น์ค„์€ ๋™์ผํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ์ด์ œ ๋ชจ๋“  ํ•ญ๋ชฉ์—๋Š” ๋ฐ๋ชจCA ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ „์ฒด ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ๋ˆ„๋ฝ๋œ ํŒŒ์ผ์ด ๋ชจ๋‘ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ 5๋ฒˆ ํ•ญ๋ชฉ์— ํ‘œ์‹œ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

8๊ฐ€์ง€ ํ•ญ๋ชฉ์„ ๋ชจ๋‘ ์™„๋ฃŒํ•œ ํ›„ ์ธ์ฆ ์„ผํ„ฐ๊ฐ€ ์™„์ „ํžˆ ๊ตฌ์„ฑ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ถ€๋ถ„์—์„œ๋Š” ์„ค๋ช…๋œ ๋‚ด์šฉ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ฆ ๊ธฐ๊ด€๊ณผ ์–ด๋–ป๊ฒŒ ํ˜‘๋ ฅํ•  ๊ฒƒ์ธ์ง€ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ์˜ ์ด์ „ ๋ถ€๋ถ„.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€