-
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)); }CreatedThu, 20 Mar 2025 16:18:45 +0900 -
๋ด ์ฐ๋ถํฌ ์๋ฒ์ SSL ๋ฌด๋ฃ ์ค์นํ๊ธฐ
- SSL ๋ฐ๊ธ ์ฌ์ดํธ : https://zerossl.com/ ๋ค๋ฅธ ๋ฌด๋ฃ ์ฌ์ดํธ๋ ๋ง์ด ์์ต๋๋ค๋ง ์ฌ๊ธฐ์ ๋ค ๋์ดํ ํ์๋ ์์ ๋ฏ ํฉ๋๋ค..
- ๋ด๊ฐ ์ฐ๋ ๋๋ฉ์ธ ์๋น์ค ์ ์ฒด : whois
SSL ์ค์น ์ ์ฐจ
- ๋ฌด๋ฃ SSL์ ์ ์ฝ์ฌํญ์ ๋ณ๋๋ก ์์๋ณด๊ธฐ๋ก ํ๊ณ
- ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋จผ์ ์ธ์ฆ๊ธฐ๊ด์ผ๋ก ๋ถํฐ ํด๋น ๋๋ฉ์ธ์ ์์ ์ฃผ๊ฐ ๋ง๋์ง ํ์ธ์ ๋ฐ๊ณ ์ธ์ฆ๊ธฐ๊ด์ผ๋ก๋ถํฐ SSL์ธ์ฆ์์ key๋ฅผ ๋ฐ์์ ์๋ฒ์ ์ค์นํ์์ ๊ฒ์ฆ๋ฐ์ผ๋ฉด SSL๋ฐ๊ธ์ ์๋ฃํ๋ค๊ณ ํ ์ ์์ต๋๋ค..
- ์ด๋ฅผ DV(Domain Validation) ์ด๋ผ๊ณ ํ๋๋ฐ, ์๊ท๋ชจ ์ฌ์ดํธ๋ ๊ฐ๋ฐ์๋ฒ์์ ๊ฐ๋ตํ๊ฒ ๋ฌด๋ฃ๋ก ๋ฐ๊ธ๋ฐ์ ์ฌ์ฉ์์ ์ฌ์ฉํฉ๋๋ค.
๋๋ฉ์ธ ์์ ์ฃผ์์ ํ์ธ ๋ฐ๊ธฐ
- ZeroSSL์ ํ์๊ฐ์
- SSL Certificate Setup ์์ ๊ฐ ํญ๋ชฉ ์ฑ์์ค๋๋ค.
- Domains
- Validity : 90-Day Certificate ๋ก ํด์ผ ๋ฌด๋ฃ
- Add-Ons : ์๋ฌด๊ฒ๋ ์ ํํ์ง ์์์ผ ๋ฌด๋ฃ ๊ฐ๋ฅ
- CSR & Contact : Auto-Generate CSR ํ์ฑํ
- Finalize Your Order: Free ์ ํ
CreatedSat, 01 Mar 2025 15:19:58 +0900 -
Restdoc Swagger Ui Sample
์๋ก
-
๊ฐ๋ฐ์์ ํ ์คํธ ์ฝ๋์ ์ค์์ฑ์ ๋ํด์๋ ๋ฐ๋ก ํฌ์คํ ์์ ์ ๋๋ค.
-
๋ฐฑ์๋์์ api ๊ฐ๋ฐ์ ํด๋น api์ ์ฌ์ฉ๋ฒ์ ๋ํ ๋ฌธ์ํ๋ ํ์ ์์ ํ์์ ๋๋ค.
-
๊ฐ์ฅ ๋ฌด์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ confluence๊ฐ ๋์๋ wiki๊ฐ ๋์๋ , ์์ ์ด ๋์๋ api ๊ฐ๋ฐ์ด ์์๋ ๋ง๋ค ์์์ ์ผ๋ก ๋ฌธ์ํํ๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ api๊ฐ ์์ ๋ ๋๋ง๋ค ๋ฌธ์๋ฅผ ์์ ํด์ค์ผ ํ๋ ๋จ์ ์ด ์์ต๋๋ค. ๊น๋นกํ๊ณ ๋ฌธ์ ์ ๋ฐ์ดํธ๊ฐ ์๋๋ ์ผ์ด์ค๊ฐ ํ์ ์์ ์ผ๋ง๋ ์์ฃผ ๋ฐ์ํ๋ ์ง๋ฅผ ์๊ฐํ๋ฉด ์ ๋ ๋น์ถ.
CreatedSat, 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 ~~~ } }CreatedSat, 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์์ ์ ํ๊ทธ๋ฅผ ๋ง๋ค ์๋ ์์.
CreatedSat, 11 Jan 2025 16:11:03 +0900 -
git ์์ tag๋ ์ธ์ ์ฐ๊ณ ์ด๋ป๊ฒ ์ธ๊น?
- Git์์ **tag(ํ๊ทธ)**๋ ํน์ ์ปค๋ฐ์ ์ด๋ฆ์ ๋ถ์ฌ์ ์๋ณํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๊ธฐ๋ฅ์ ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๋ฆด๋ฆฌ์ฆ ๋ฒ์ ์ ํ์ํ ๋ ๋ง์ด ์ฌ์ฉ๋๋ฉฐ, ํน์ ์์ ์ ์ค๋ ์ท์ ์๋ฏธํฉ๋๋ค.
๐ฏ ํ๊ทธ์ ์ฃผ์ ์ญํ
-
๋ฆด๋ฆฌ์ฆ ๋งํน
- ์: v1.0.0, v2.1.3
- ๋ฐฐํฌํ ๋ฒ์ ์ด ์ด๋ค ์ปค๋ฐ์ธ์ง ๋ช ํํ๊ฒ ์ถ์ ํ ์ ์์ต๋๋ค.
-
์ค๋ ์ท ์ ์ฅ
- ํน์ ์ปค๋ฐ์ ์ค์ํ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๊ณ ์ถ์ ๋ (์: ์ฒซ ๋ฐฐํฌ, ํ ์คํธ ์๋ฃ ์ง์ ๋ฑ)
-
CI/CD ํธ๋ฆฌ๊ฑฐ์ฉ
- ํ๊ทธ๊ฐ push๋ ๋ ์๋ ๋ฐฐํฌ๋๋๋ก CI ํ์ดํ๋ผ์ธ ์ค์ ์ด ๊ฐ๋ฅ
๐ ๏ธ ํ๊ทธ์ ์ข ๋ฅ
- Lightweight Tag (๊ฐ๋ฒผ์ด ํ๊ทธ)
- ๋จ์ํ ์ปค๋ฐ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
- Git ๋ด๋ถ์ ์ผ๋ก๋ ๋ธ๋์น์ ์ ์ฌํ ๊ตฌ์กฐ
git tag v1.0.0 - 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์ ์๋์ผ๋ก ๋ฐฐํฌํ๊ฒ ํ ์ ์์ต๋๋ค.
CreatedSat, 04 Jan 2025 13:18:03 +0900