Avatar
๐Ÿ˜‰

Organizations

  • 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
  • @Component ๋‚ด์— static method ์—์„œ ์“ฐ๋Š” member ๊ฐ์ฒด๊ฐ€ null ์ผ๋–„

    @Component ๋‚ด์— static method์—์„œ ์‚ฌ์šฉํ•˜๋Š” static member

    @Component
    @RequiredArgsConstructor
    public class SomeComponentClass {
    
        private final ObjectMapper objectMapper;
    
        private static void staticMethod() {
            objectMapper.convertValue() // objectMapper NullPointerException ๋ฐœ์ƒ
        } 
    }
    

    -> ์ด๋ ‡๊ฒŒ ๋ฐ”๊พธ์„ธ์š”.

    @Component
    @RequiredArgsConstructor
    public class SomeComponentClass {
    
        private static ObjectMapper objectMapper;
    
        // Autowired๋กœ constructor ์ƒ์„ฑ
        @Autowired
        public SomeComponentClass(ObjectMapper objectMapper) {
            SomeComponentClass.objectMapper = objectMapper;
        }
    
        private static void staticMethod() {
            objectMapper ~~~
        }
    }
    
    Created Sat, 25 Jan 2025 17:14:05 +0900
  • ์„œ๋ก 

    • GitHub์—์„œ **ํƒœ๊ทธ(Tag)**๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ **๋ฆด๋ฆฌ์ฆˆ(Release)**๋ฅผ ๋งŒ๋“ค๋ฉด,
    • ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ(zip, tar.gz ๋“ฑ)์„ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ฐฐํฌ์— ์•„์ฃผ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค..
    • ์•„๋ž˜์— GitHub ๋ฆด๋ฆฌ์ฆˆ ์ƒ์„ฑ ๋ฐ ์—ฐ๋™ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘‡

    ๐ŸŽ GitHub ๋ฆด๋ฆฌ์ฆˆ๋ž€?

    • ํŠน์ • ํƒœ๊ทธ์— ๋Œ€ํ•œ ๋ฆด๋ฆฌ์ฆˆ ์ •๋ณด๋ฅผ ์‹œ๊ฐํ™”ํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š” GitHub์˜ ๊ธฐ๋Šฅ
    • ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ ์ž‘์„ฑ ๊ฐ€๋Šฅ
    • ์‹คํ–‰ ํŒŒ์ผ, ์•„ํ‹ฐํŒฉํŠธ(.zip, .jar ๋“ฑ) ์ฒจ๋ถ€ ๊ฐ€๋Šฅ
    • GitHub Actions ๊ฐ™์€ CI ๋„๊ตฌ์™€ ์‰ฝ๊ฒŒ ์—ฐ๋™ ๊ฐ€๋Šฅ

    ๐Ÿ› ๏ธ GitHub ๋ฆด๋ฆฌ์ฆˆ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

    1. Git ํƒœ๊ทธ ๋งŒ๋“ค๊ธฐ (๋กœ์ปฌ or GitHub์—์„œ)

    # ๋กœ์ปฌ์—์„œ annotated tag ๋งŒ๋“ค๊ธฐ
    git tag -a v1.0.0 -m "Release version 1.0.0"
    
    # ์›๊ฒฉ ํ‘ธ์‹œ
    git push origin v1.0.0
    

    ๋˜๋Š” GitHub ์›น UI์—์„œ ์ƒˆ ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Œ.

    Created Sat, 11 Jan 2025 16:11:03 +0900
  • git ์—์„œ tag๋Š” ์–ธ์ œ ์“ฐ๊ณ  ์–ด๋–ป๊ฒŒ ์“ธ๊นŒ?

    • Git์—์„œ **tag(ํƒœ๊ทธ)**๋Š” ํŠน์ • ์ปค๋ฐ‹์— ์ด๋ฆ„์„ ๋ถ™์—ฌ์„œ ์‹๋ณ„ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฆด๋ฆฌ์ฆˆ ๋ฒ„์ „์„ ํ‘œ์‹œํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ํŠน์ • ์‹œ์ ์˜ ์Šค๋ƒ…์ƒท์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

    ๐ŸŽฏ ํƒœ๊ทธ์˜ ์ฃผ์š” ์—ญํ• 

    1. ๋ฆด๋ฆฌ์ฆˆ ๋งˆํ‚น

      • ์˜ˆ: v1.0.0, v2.1.3
      • ๋ฐฐํฌํ•œ ๋ฒ„์ „์ด ์–ด๋–ค ์ปค๋ฐ‹์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    2. ์Šค๋ƒ…์ƒท ์ €์žฅ

      • ํŠน์ • ์ปค๋ฐ‹์— ์ค‘์š”ํ•œ ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ (์˜ˆ: ์ฒซ ๋ฐฐํฌ, ํ…Œ์ŠคํŠธ ์™„๋ฃŒ ์ง€์  ๋“ฑ)
    3. CI/CD ํŠธ๋ฆฌ๊ฑฐ์šฉ

      • ํƒœ๊ทธ๊ฐ€ push๋  ๋•Œ ์ž๋™ ๋ฐฐํฌ๋˜๋„๋ก CI ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ •์ด ๊ฐ€๋Šฅ

    ๐Ÿ› ๏ธ ํƒœ๊ทธ์˜ ์ข…๋ฅ˜

    1. Lightweight Tag (๊ฐ€๋ฒผ์šด ํƒœ๊ทธ)
      • ๋‹จ์ˆœํžˆ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
      • Git ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋ธŒ๋žœ์น˜์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ
      git tag v1.0.0
      
    2. Annotated Tag (์ฃผ์„์ด ์žˆ๋Š” ํƒœ๊ทธ)
      • ํƒœ๊ทธ ์ƒ์„ฑ์ž ์ •๋ณด, ๋‚ ์งœ, ๋ฉ”์‹œ์ง€ ๋“ฑ์„ ํฌํ•จ
      • ๋ฆด๋ฆฌ์ฆˆ์—๋Š” ๋ณดํ†ต ์ด๊ฑธ ์‚ฌ์šฉ
      git tag -a v1.0.0 -m "Release version 1.0.0"
      

    ๐Ÿ“ค ํƒœ๊ทธ ํ‘ธ์‹œ ๋ฐ ๊ณต์œ 

    • ํƒœ๊ทธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ git push๋กœ ์ž๋™ ํ‘ธ์‹œ๋˜์ง€ ์•Š์Œ. ๋ช…์‹œ์ ์œผ๋กœ ํ‘ธ์‹œํ•ด์•ผ ํ•จ:
      # ํŠน์ • ํƒœ๊ทธ ํ‘ธ์‹œ
      git push origin v1.0.0
      
      # ๋ชจ๋“  ํƒœ๊ทธ ํ‘ธ์‹œ
      git push origin --tags
      

    ๐Ÿ” ํƒœ๊ทธ ํ™•์ธ

    # ๋กœ์ปฌ ํƒœ๊ทธ ๋ชฉ๋ก
    git tag
    
    # ํŠน์ • ํƒœ๊ทธ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹ ๋ณด๊ธฐ
    git show v1.0.0
    

    ๐Ÿงฝ ํƒœ๊ทธ ์‚ญ์ œ

    # ๋กœ์ปฌ ํƒœ๊ทธ ์‚ญ์ œ
    git tag -d v1.0.0
    
    # ์›๊ฒฉ ํƒœ๊ทธ ์‚ญ์ œ
    git push origin --delete v1.0.0
    

    ๐Ÿ“ฆ ํ™œ์šฉ ์˜ˆ์‹œ (๋ฆด๋ฆฌ์ฆˆ ๊ด€๋ฆฌ)

    # ์ฝ”๋“œ๊ฐ€ ์•ˆ์ •ํ™”๋œ ์‹œ์ 
    git checkout main
    git pull
    git tag -a v1.0.0 -m "First stable release"
    git push origin v1.0.0
    
    • CI/CD ๋„๊ตฌ(GitHub Actions, Jenkins ๋“ฑ)๋Š” ์ด ํƒœ๊ทธ๋ฅผ ๊ฐ์ง€ํ•ด์„œ v1.0.0์„ ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    Created Sat, 04 Jan 2025 13:18:03 +0900