Avatar
๐Ÿ˜‰

Organizations

  • git history ์ „๋ถ€ ์—†์• ๊ณ  reset ํ•˜๋Š” ๋ฐฉ๋ฒ•

    • git history ๋ฅผ ์™œ ์—†์• ์•ผ ํ• ๊นŒ?
      • ์ž์ฃผ์žˆ๋Š” ์ผ์€ ์•„๋‹ˆ์ง€๋งŒ, git history๋ฅผ ์ „๋ถ€ ๋‚ ๋ฆฌ๊ณ  reset ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค..
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋ฒ„์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ์•”๋ณตํ˜ธํ™” key, ๊ฐœ์ธ์ •๋ณด ๋“ฑ ๋…ธ์ถœ๋˜๋ฉด ๋ฏผ๊ฐ์ •๋ณด๋‚˜ ํŒŒ์ผ๋“ฑ์ด git์— ์˜ฌ๋ผ๊ฐ€ ๋ฒ„๋ ธ๋‹ค๋ฉด?
      • ํ•ด๋‹น ๋‚ด์šฉ์„ ์ง€์šฐ๊ณ  ๋‹ค์‹œ commit & push๋ฅผ ํ–ˆ์ง€๋งŒ, history๋ฅผ ๋ณด๊ณ  ์ด์ „ commit์„ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๊ทธ๋งŒ์ด๋ฏ€๋กœ, ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์—†์ง€์š”.
      • ์•„์˜ˆ history๊นŒ์ง€ ๋‚ ๋ ค๋ฒ„๋ ค์„œ ์ด์ „์˜ ์‹ค์ˆ˜(๊ผญ ์‹ค์ˆ˜ํ–ˆ์„๋•Œ๋งŒ reset ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ)๋ฅผ ์ด๋ ฅ๊นŒ์ง€ ์ง€์›์‹œ๋‹ค.

    main ํ˜น์€ develop๋“ฑ ๋‚จ๊ฒจ๋†“์„ ๋ธŒ๋žœ์น˜์—์„œ (์—ฌ๊ธฐ์„  main)

    • –orphan ์€ ๊ธฐ์กด์ปค๋ฐ‹ ์ด๋ ฅ์—†์ด…์˜ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ธฐ์กด ์ด๋ ฅ์—†์ด ์‹œ์ž‘ํ•˜๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
      git checkout --orphan latest_branch
      

    ์ƒˆ๋กœ ์ปค๋ฐ‹

    git add .
    git commit -m "initial commit after reset"
    

    ๊ธฐ์กด ๋ธŒ๋žœ์น˜ ๋‚ ๋ฆฌ๊ณ  ์ƒˆ๋กœ ๋งŒ๋“ฆ

    git branch -D main
    git branch -m main
    

    main์— force pushํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ๋‚ด์šฉ ์ •๋ฆฌํ•ด์„œ repo ์ตœ์ ํ™”

    git push -f origin main
    git gc --aggressive --prune=all
    

    image

    Created Mon, 24 Mar 2025 20:18:45 +0900
  • Clean Code 1์žฅ

    ํด๋ฆฐ ์ฝ”๋“œ์˜ ์กฐ๊ฑด- ๋‚ด ๋‚˜๋ฆ„์˜ ์ •๋ฆฌ

    • 1์žฅ์—์„œ๋Š” ์ž๋ฐ”๋‚˜ C ์ฐฝ์‹œ์ž๋“ฑ ๊ฐœ๋ฐœ๊ณ„์˜ ๊ฑฐ์žฅ๋“ค์ด ์ƒ๊ฐํ•˜๋Š” ์ข‹์€ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ฒฌํ•ด๋ฅผ ๋ชจ์•„๋†“์€ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
    • ๋‹ค์Œ์€ ์ด ๋ถ„๋“ค์˜ ์˜๊ฒฌ์—์„œ ๋‚˜๋ฆ„ ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„์„ ์ถ”๋ ค์„œ ๋‚ด ๋‚˜๋ฆ„๋Œ€๋กœ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
    • ์‚ฌ์‹ค์ƒ ์ฑ… ์ „์ฒด์— ๋…น์•„ ์žˆ๋Š” ๋‚ด์šฉ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

    SARAM

    • S : Simple

      • ๋‚ด ์˜๊ฒฌ : ์ฝ”๋“œ๋Š” ๋‹จ์ˆœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ฝ”๋“œ์— ๋…น์•„๋“ค๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ์ž์ฒด๋Š” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ์ฝ”๋“œ(ํด๋ž˜์Šค, ๋ฉ”์†Œ๋“œ ์ฐจ์›)์ด๋ผ๋„ ์‹ฌํ”Œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • A : Atomic

    Created Sat, 22 Mar 2025 20:16:08 +0900
  • AES ์•”๋ณตํ˜ธํ™”๋ฅผ ์œ„ํ•œ key์ƒ์„ฑ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค๊ธฐ

    Contents

    AES ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•˜์—ฌ.

    • ์•”๋ณตํ˜ธํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋Œ€ํ‘œ์ ์ธ ์–‘๋ฐฉํ–ฅ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
    • ์ž๋ฃŒ์ƒ์œผ๋กœ ์ฐพ์•„๋ณด๋ฉด AES(Advanced Encryption Standard)๋Š” ๋Œ€์นญ ํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹์˜ ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๋ฏธ๊ตญ ๊ตญ๋ฆฝํ‘œ์ค€๊ธฐ์ˆ ์—ฐ๊ตฌ์†Œ(NIST)์— ์˜ํ•ด 2001๋…„ ํ‘œ์ค€์œผ๋กœ ์ฑ„ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Rijndael ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ๋†’์€ ๋ณด์•ˆ์„ฑ๊ณผ ๋น ๋ฅธ ์„ฑ๋Šฅ ๋•๋ถ„์— ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    AES ํŠน์ง•

    • ๋Œ€์นญ ํ‚ค ์•”ํ˜ธํ™”: ๋™์ผํ•œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ๊ณ ์ •๋œ ๋ธ”๋ก ํฌ๊ธฐ: AES๋Š” 128๋น„ํŠธ ๋ธ”๋ก ํฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹ค์–‘ํ•œ ํ‚ค ๊ธธ์ด ์ง€์›: 128๋น„ํŠธ, 192๋น„ํŠธ, 256๋น„ํŠธ ํ‚ค ๊ธธ์ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ๋ณด์•ˆ์„ฑ: ๊ธฐ์กด์˜ DES(Data Encryption Standard)๋ณด๋‹ค ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ์„ฑ์„ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • ๋น ๋ฅธ ์†๋„: ์†Œํ”„ํŠธ์›จ์–ด ๋ฐ ํ•˜๋“œ์›จ์–ด์—์„œ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

    AES ์•”ํ˜ธํ™” ๊ณผ์ •

    • AES ์•”ํ˜ธํ™”๋Š” ์—ฌ๋Ÿฌ ๋ผ์šด๋“œ(Round)์˜ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋˜๋Š” ํ‚ค ๊ธธ์ด์— ๋”ฐ๋ผ ๋ผ์šด๋“œ ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

    Created Thu, 20 Mar 2025 16:18:45 +0900
  • Java์—์„œ AES๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด key, iv ๋“ฑ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ

    • ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ AES-128, AES-192, AES-256 ์–ด๋–ค ๊ฑธ ์‚ฌ์šฉํ•˜๋А๋ƒ์— ๋”ฐ๋ผ key, iv์ž์ฒด์˜ size๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
    • ๋ณธ ๊ธ€์—์„œ๋Š” AES/CBC/PKCS5Padding 256 ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

    Java์—์„œ ์•”๋ณตํ˜ธํ™”์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ key, iv ๋Š” ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค๊นŒ?

    • ํ˜„์—…์—์„œ๋Š” key, iv๋ฅผ ๋ฐ์ดํ„ฐ ์ œ๊ณต ์ธก๊ณผ ์†Œ๋น„์ธก์—์„œ ์–‘์ชฝ์—์„œ key, iv๋ฅผ ๊ณต์œ ํ•˜๋Š”๋ฐ key, iv๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๋„ ๋‹ค์–‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ๋ณธ ๊ธ€์—์„œ ๋‹ค์–‘ํ•œ ์ผ€์ด์Šค๋ฅผ ์ฝ”๋“œ๋กœ ์ฒ˜๋ฆฌํ•œ ๋‚ด์šฉ์„ ์ ์–ด๋ด…๋‹ˆ๋‹ค.
    • ๋Œ€์ฒด๋กœ key,iv๋Š” base64ํ˜น์€ hex๋“ฑ์œผ๋กœ encodeํ•ด์„œ ์ €์žฅํ•˜๊ณ , runtime์— decodeํ•ด์„œ ์“ฐ๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

    key ๋งŒ๋“ค๊ธฐ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•

    • base64๋“ฑ encode ์—†์ด ๊ทธ๋ƒฅ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค๊ธฐ
        public String generateRandomString() {
            String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+";
            SecureRandom random = new SecureRandom();
            StringBuilder sb = new StringBuilder(32);
    
            for (int i = 0; i < 32; i++) {
                sb.append(CHARACTERS.charAt(random.nextInt(CHARACTERS.length())));
            }
    
            return sb.toString();
        }
    
    • base64๋Š” java.util ์„ ์“ฐ๊ธฐ๋„ ํ•˜๊ณ  apache.commons.codec.binary๋“ฑ์„ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        public void keyGenerator() throws NoSuchAlgorithmException {
            // 1. Secret Key ์ƒ์„ฑ (AES-256)
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(256); // AES-256 ์‚ฌ์šฉ
            SecretKey secretKey = keyGenerator.generateKey();
    
            // 2. IV ์ƒ์„ฑ (AES CBC ๋ชจ๋“œ์—์„œ๋Š” 16๋ฐ”์ดํŠธ IV ํ•„์š”)
            byte[] iv = new byte[16];
            SecureRandom secureRandom = new SecureRandom();
            secureRandom.nextBytes(iv);
    
            // 3. Base64๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ถœ๋ ฅ
            System.out.println("Secret Key (Base64): " + Base64.getEncoder().encodeToString(secretKey.getEncoded()));
            System.out.println("IV (Base64): " + Base64.getEncoder().encodeToString(iv));
        }
    
    • base64
        public void generateBase64RandomKey() {
            int AES_KEY_SIZE = 32; //256 bit
            int IV_SIZE = 16;
    
            byte[] secretKeyBytes = new byte[AES_KEY_SIZE];
            byte[] ivBytes = new byte[IV_SIZE];
    
            new SecureRandom().nextBytes(secretKeyBytes);
            new SecureRandom().nextBytes(ivBytes);
    
            log.info("secretKeyBytes: {}", Base64.getEncoder().encodeToString(secretKeyBytes));
            log.info("ivBytes: {}", Base64.getEncoder().encodeToString(ivBytes));
        }
    
    • hex
        public void generateHexRandomKey() {
            int AES_KEY_SIZE = 32; //256 bit
            int IV_SIZE = 16;
    
            byte[] secretKeyBytes = new byte[AES_KEY_SIZE];
            byte[] ivBytes = new byte[IV_SIZE];
    
            new SecureRandom().nextBytes(secretKeyBytes);
            new SecureRandom().nextBytes(ivBytes);
    
            log.info("secretKeyBytes: {}", bytesToHex(secretKeyBytes));
            log.info("ivBytes: {}", bytesToHex(ivBytes));
        }
    
    • 32byte(256bit) ๋žœ๋ค ๋ฌธ์ž์—ด ๋งŒ๋“ค๊ณ , base64 encode ํ•˜๊ธฐ
        public void generateRandomStringAndGenerateKey() {
            int size = 32;
            String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+";
            SecureRandom random = new SecureRandom();
            StringBuilder sb = new StringBuilder(size);
    
            for (int i = 0; i < size; i++) {
                sb.append(CHARACTERS.charAt(random.nextInt(CHARACTERS.length())));
            }
    
            String secretKeyBase64 = Base64.getEncoder().encodeToString(sb.toString().getBytes());
            String ivBase64 = Base64.getEncoder().encodeToString(sb.substring(0,16).getBytes());
        }
    
    • 32byte ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•ด์„œ base64 encode ํ•˜๊ธฐ
        public void generateKeyWithString() {
            String input = "YOUR 32์ž๋ฆฌ ๋ฌธ์ž์—ด";
            String secretKeyBase64 = Base64.getEncoder().encodeToString(input.getBytes());
            String ivBase64 = Base64.getEncoder().encodeToString(input.substring(0,16).getBytes());
            String decoded = new String(Base64.getDecoder().decode(secretKeyBase64));
        }
    
    Created Thu, 20 Mar 2025 16:18:45 +0900
  • GoDoc

    ๋‚ด ์šฐ๋ถ„ํˆฌ ์„œ๋ฒ„์— SSL ๋ฌด๋ฃŒ ์„ค์น˜ํ•˜๊ธฐ

    • SSL ๋ฐœ๊ธ‰ ์‚ฌ์ดํŠธ : https://zerossl.com/ ๋‹ค๋ฅธ ๋ฌด๋ฃŒ ์‚ฌ์ดํŠธ๋„ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ ์—ฌ๊ธฐ์„œ ๋‹ค ๋‚˜์—ดํ•  ํ•„์š”๋Š” ์—†์„ ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค..
    • ๋‚ด๊ฐ€ ์“ฐ๋Š” ๋„๋ฉ”์ธ ์„œ๋น„์Šค ์—…์ฒด : whois

    SSL ์„ค์น˜ ์ ˆ์ฐจ

    • ๋ฌด๋ฃŒ SSL์˜ ์ œ์•ฝ์‚ฌํ•ญ์€ ๋ณ„๋„๋กœ ์•Œ์•„๋ณด๊ธฐ๋กœ ํ•˜๊ณ 
    • ๊ธฐ๋ณธ ๊ฐœ๋…์€ ๋จผ์ € ์ธ์ฆ๊ธฐ๊ด€์œผ๋กœ ๋ถ€ํ„ฐ ํ•ด๋‹น ๋„๋ฉ”์ธ์˜ ์†Œ์œ ์ฃผ๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธ์„ ๋ฐ›๊ณ  ์ธ์ฆ๊ธฐ๊ด€์œผ๋กœ๋ถ€ํ„ฐ SSL์ธ์ฆ์„œ์™€ key๋ฅผ ๋ฐ›์•„์„œ ์„œ๋ฒ„์— ์„ค์น˜ํ–ˆ์Œ์„ ๊ฒ€์ฆ๋ฐ›์œผ๋ฉด SSL๋ฐœ๊ธ‰์„ ์™„๋ฃŒํ–ˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค..
    • ์ด๋ฅผ DV(Domain Validation) ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์†Œ๊ทœ๋ชจ ์‚ฌ์ดํŠธ๋‚˜ ๊ฐœ๋ฐœ์„œ๋ฒ„์—์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ๋ฌด๋ฃŒ๋กœ ๋ฐœ๊ธ‰๋ฐ›์•„ ์‚ฌ์šฉ์‹œ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ๋„๋ฉ”์ธ ์†Œ์œ ์ฃผ์ž„์„ ํ™•์ธ ๋ฐ›๊ธฐ

    1. ZeroSSL์— ํšŒ์›๊ฐ€์ž… image
    2. SSL Certificate Setup ์—์„œ ๊ฐ ํ•ญ๋ชฉ ์ฑ„์›Œ์ค๋‹ˆ๋‹ค.
    • Domains
    • Validity : 90-Day Certificate ๋กœ ํ•ด์•ผ ๋ฌด๋ฃŒ
    • Add-Ons : ์•„๋ฌด๊ฒƒ๋„ ์„ ํƒํ•˜์ง€ ์•Š์•„์•ผ ๋ฌด๋ฃŒ ๊ฐ€๋Šฅ
    • CSR & Contact : Auto-Generate CSR ํ™œ์„ฑํ™”
    • Finalize Your Order: Free ์„ ํƒ

    image

    Created Sat, 01 Mar 2025 15:19:58 +0900
  • Restdoc Swagger Ui Sample

    ์„œ๋ก 

    • ๊ฐœ๋ฐœ์—์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ค‘์š”์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ๋”ฐ๋กœ ํฌ์ŠคํŒ… ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

    • ๋ฐฑ์—”๋“œ์—์„œ api ๊ฐœ๋ฐœ์‹œ ํ•ด๋‹น api์˜ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•œ ๋ฌธ์„œํ™”๋Š” ํ˜‘์—…์—์„œ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

    • ๊ฐ€์žฅ ๋ฌด์‹ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” confluence๊ฐ€ ๋˜์—ˆ๋“  wiki๊ฐ€ ๋˜์—ˆ๋“ , ์—‘์…€์ด ๋˜์—ˆ๋“  api ๊ฐœ๋ฐœ์ด ์žˆ์„๋•Œ ๋งˆ๋‹ค ์ˆ˜์ž‘์—…์œผ๋กœ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ api๊ฐ€ ์ˆ˜์ •๋  ๋•Œ๋งˆ๋‹ค ๋ฌธ์„œ๋ฅผ ์ˆ˜์ •ํ•ด์ค˜์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊นœ๋นกํ•˜๊ณ  ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์•ˆ๋˜๋Š” ์ผ€์ด์Šค๊ฐ€ ํ˜„์—…์—์„œ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์ง€๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ์ ˆ๋Œ€ ๋น„์ถ”.

    Created Sat, 01 Feb 2025 20:18:03 +0900