\ud604\ub300\uc758 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c \ud658\uacbd\uc5d0\uc11c \ub370\uc774\ud130 \ubcf4\uc548\uc740 \uadf8 \uc5b4\ub290 \ub54c\ubcf4\ub2e4 \uc911\uc694\ud574\uc84c\uc2b5\ub2c8\ub2e4. \ud2b9\ud788, Spring Boot\uc640 \uac19\uc740 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud560 \ub54c\ub294 \ub370\uc774\ud130 \uc554\ud638\ud654\uc640 \ubcf4\uc548 \uc811\uadfc \uc804\ub7b5\uc744 \uc801\uc808\ud788 \uad6c\ud604\ud558\ub294 \uac83\uc774 \ud544\uc218\uc801\uc785\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 Spring Boot\uc5d0\uc11c \ub370\uc774\ud130 \uc554\ud638\ud654\uc640 \ubcf4\uc548 \uc811\uadfc \uc804\ub7b5\uc744 \ub2e4\ub8e8\uba70, \uc774\ub97c \ud1b5\ud574 \uc548\uc804\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n
\ub370\uc774\ud130 \uc554\ud638\ud654\ub294 \uc815\ubcf4\uc758 \uae30\ubc00\uc131\uc744 \uc720\uc9c0\ud558\uae30 \uc704\ud574 \ud544\uc218\uc801\uc778 \uacfc\uc815\uc785\ub2c8\ub2e4. \ub370\uc774\ud130\uac00 \uc804\uc1a1\ub418\uac70\ub098 \uc800\uc7a5\ub420 \ub54c, \ud574\ucee4\ub098 \uc545\uc758\uc801\uc778 \uc0ac\uc6a9\uc790\ub85c\ubd80\ud130 \ubcf4\ud638\ud558\uae30 \uc704\ud574 \uc554\ud638\ud654\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \ub370\uc774\ud130 \uc720\ucd9c \uc0ac\uac74\uc774 \ube48\ubc88\ud558\uac8c \ubc1c\uc0dd\ud558\ub294 \ud604\ub300 \uc0ac\ud68c\uc5d0\uc11c, \uae30\uc5c5\uacfc \uac1c\uc778 \ubaa8\ub450 \ub370\uc774\ud130 \ubcf4\ud638\uc5d0 \ub300\ud55c \ucc45\uc784\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
\uc608\ub97c \ub4e4\uc5b4, 2020\ub144\uc5d0\ub294 \uc5ec\ub7ec \ub300\ud615 \uae30\uc5c5\ub4e4\uc774 \ub370\uc774\ud130 \uc720\ucd9c \uc0ac\uac74\uc5d0 \uc5f0\ub8e8\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc0ac\uac74\ub4e4\uc740 \uace0\uac1d\uc758 \uc2e0\ub8b0\ub97c \uc783\uac8c \ud558\uace0, \ubc95\uc801 \ucc45\uc784\uc744 \ucd08\ub798\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \ub370\uc774\ud130 \uc554\ud638\ud654\ub294 \ub2e8\uc21c\ud55c \uc120\ud0dd\uc774 \uc544\ub2c8\ub77c \ud544\uc218\uc801\uc778 \uc694\uc18c\ub85c \uc790\ub9ac \uc7a1\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
\uc554\ud638\ud654\ub294 \ub370\uc774\ud130\ub97c \uc77d\uc744 \uc218 \uc5c6\ub294 \ud615\ud0dc\ub85c \ubcc0\ud658\ud558\uc5ec, \uc778\uac00\ub418\uc9c0 \uc54a\uc740 \uc0ac\uc6a9\uc790\uac00 \uc811\uadfc\ud560 \uc218 \uc5c6\ub3c4\ub85d \ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub370\uc774\ud130\uc758 \uae30\ubc00\uc131\uc744 \ubcf4\uc7a5\ud558\uace0, \ubb34\ub2e8 \uc811\uadfc\uc744 \ubc29\uc9c0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
\ub610\ud55c, \ub370\uc774\ud130 \uc554\ud638\ud654\ub294 \ubc95\uc801 \uc694\uad6c\uc0ac\ud56d\uc744 \ucda9\uc871\ud558\ub294 \ub370\uc5d0\ub3c4 \uc911\uc694\ud55c \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4. \ub9ce\uc740 \uad6d\uac00\uc5d0\uc11c\ub294 \uac1c\uc778\uc815\ubcf4 \ubcf4\ud638\ubc95\uc744 \uc81c\uc815\ud558\uc5ec \uae30\uc5c5\uc774 \uace0\uac1d\uc758 \ub370\uc774\ud130\ub97c \uc548\uc804\ud558\uac8c \ucc98\ub9ac\ud558\ub3c4\ub85d \uc694\uad6c\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ubc95\uc801 \uc694\uad6c\uc0ac\ud56d\uc744 \uc900\uc218\ud558\uae30 \uc704\ud574\uc11c\ub294 \ub370\uc774\ud130 \uc554\ud638\ud654\uac00 \ud544\uc218\uc801\uc785\ub2c8\ub2e4.<\/p>\n
\uacb0\ub860\uc801\uc73c\ub85c, \ub370\uc774\ud130 \uc554\ud638\ud654\ub294 \uc815\ubcf4 \ubcf4\ud638\uc758 \uccab \ubc88\uc9f8 \ubc29\uc5b4\uc120\uc774\uba70, \uc774\ub97c \ud1b5\ud574 \uae30\uc5c5\uc740 \uace0\uac1d\uc758 \uc2e0\ub8b0\ub97c \uc5bb\uace0 \ubc95\uc801 \ucc45\uc784\uc744 \ud68c\ud53c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
Spring Boot\uc5d0\uc11c\ub294 \ub2e4\uc591\ud55c \ubc29\ubc95\uc73c\ub85c \ub370\uc774\ud130 \uc554\ud638\ud654\ub97c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uac00\uc7a5 \uc77c\ubc18\uc801\uc778 \ubc29\ubc95\uc740 \ub300\uce6d\ud0a4 \uc554\ud638\ud654\uc640 \ube44\ub300\uce6d\ud0a4 \uc554\ud638\ud654\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \ub300\uce6d\ud0a4 \uc554\ud638\ud654\ub294 \ub3d9\uc77c\ud55c \ud0a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ub97c \uc554\ud638\ud654\ud558\uace0 \ubcf5\ud638\ud654\ud558\ub294 \ubc29\uc2dd\uc774\uba70, \ube44\ub300\uce6d\ud0a4 \uc554\ud638\ud654\ub294 \uc11c\ub85c \ub2e4\ub978 \ud0a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\uc2dd\uc785\ub2c8\ub2e4.<\/p>\n
\ub300\uce6d\ud0a4 \uc554\ud638\ud654\uc758 \uc608\ub85c\ub294 AES(Advanced Encryption Standard)\uac00 \uc788\uc2b5\ub2c8\ub2e4. AES\ub294 \ube60\ub974\uace0 \uc548\uc804\ud55c \uc554\ud638\ud654 \uc54c\uace0\ub9ac\uc998\uc73c\ub85c, \ub9ce\uc740 \uae30\uc5c5\uc5d0\uc11c \uc0ac\uc6a9\ub418\uace0 \uc788\uc2b5\ub2c8\ub2e4. Spring Boot\uc5d0\uc11c\ub294 JCE(Java Cryptography Extension)\ub97c \uc0ac\uc6a9\ud558\uc5ec AES \uc554\ud638\ud654\ub97c \uc27d\uac8c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
import javax.crypto.Cipher;\nimport javax.crypto.KeyGenerator;\nimport javax.crypto.SecretKey;\nimport javax.crypto.spec.SecretKeySpec;\n\npublic class AESCrypto {\n private static final String ALGORITHM = \"AES\";\n\n public static byte[] encrypt(String data, SecretKey key) throws Exception {\n Cipher cipher = Cipher.getInstance(ALGORITHM);\n cipher.init(Cipher.ENCRYPT_MODE, key);\n return cipher.doFinal(data.getBytes());\n }\n\n public static String decrypt(byte[] encryptedData, SecretKey key) throws Exception {\n Cipher cipher = Cipher.getInstance(ALGORITHM);\n cipher.init(Cipher.DECRYPT_MODE, key);\n return new String(cipher.doFinal(encryptedData));\n }\n\n public static SecretKey generateKey() throws Exception {\n KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);\n keyGen.init(128); \/\/ 128-bit AES\n return keyGen.generateKey();\n }\n}\n<\/code><\/pre>\n\uc704\uc758 \ucf54\ub4dc\ub294 AES \uc554\ud638\ud654\ub97c \uad6c\ud604\ud55c \uac04\ub2e8\ud55c \uc608\uc81c\uc785\ub2c8\ub2e4. \uc774 \ucf54\ub4dc\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ub97c \uc554\ud638\ud654\ud558\uace0 \ubcf5\ud638\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. SecretKey\ub97c \uc0dd\uc131\ud558\uace0 \uc774\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ub97c \uc548\uc804\ud558\uac8c \ubcf4\ud638\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
\ube44\ub300\uce6d\ud0a4 \uc554\ud638\ud654\uc758 \uacbd\uc6b0 RSA(Rivest-Shamir-Adleman) \uc54c\uace0\ub9ac\uc998\uc774 \ub110\ub9ac \uc0ac\uc6a9\ub429\ub2c8\ub2e4. RSA\ub294 \uacf5\uac1c\ud0a4\uc640 \uac1c\uc778\ud0a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ub97c \uc554\ud638\ud654\ud569\ub2c8\ub2e4. Spring Boot\uc5d0\uc11c\ub294 Bouncy Castle \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud558\uc5ec RSA \uc554\ud638\ud654\ub97c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
import org.bouncycastle.jce.provider.BouncyCastleProvider;\nimport java.security.KeyPair;\nimport java.security.KeyPairGenerator;\nimport java.security.PublicKey;\nimport java.security.PrivateKey;\nimport java.security.Security;\nimport javax.crypto.Cipher;\n\npublic class RSACrypto {\n static {\n Security.addProvider(new BouncyCastleProvider());\n }\n\n public static KeyPair generateKeyPair() throws Exception {\n KeyPairGenerator keyGen = KeyPairGenerator.getInstance(\"RSA\");\n keyGen.initialize(2048);\n return keyGen.generateKeyPair();\n }\n\n public static byte[] encrypt(String data, PublicKey publicKey) throws Exception {\n Cipher cipher = Cipher.getInstance(\"RSA\");\n cipher.init(Cipher.ENCRYPT_MODE, publicKey);\n return cipher.doFinal(data.getBytes());\n }\n\n public static String decrypt(byte[] encryptedData, PrivateKey privateKey) throws Exception {\n Cipher cipher = Cipher.getInstance(\"RSA\");\n cipher.init(Cipher.DECRYPT_MODE, privateKey);\n return new String(cipher.doFinal(encryptedData));\n }\n}\n<\/code><\/pre>\n\uc704\uc758 \ucf54\ub4dc\ub294 RSA \uc554\ud638\ud654\ub97c \uad6c\ud604\ud55c \uc608\uc81c\uc785\ub2c8\ub2e4. \uacf5\uac1c\ud0a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ub97c \uc554\ud638\ud654\ud558\uace0, \uac1c\uc778\ud0a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubcf5\ud638\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ubc29\uc2dd\uc740 \ub370\uc774\ud130 \uc804\uc1a1 \uc2dc \uc548\uc804\uc131\uc744 \ub192\uc774\ub294 \ub370 \uc720\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n
3. Spring Security\ub97c \ud1b5\ud55c \uc811\uadfc \uc81c\uc5b4<\/h2>\n
Spring Security\ub294 Spring Boot \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ubcf4\uc548\uc744 \uac15\ud654\ud558\ub294 \ub370 \ud544\uc218\uc801\uc778 \ud504\ub808\uc784\uc6cc\ud06c\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc778\uc99d \ubc0f \uc778\uac00\ub97c \uc27d\uac8c \uad6c\ud604\ud560 \uc218 \uc788\uc73c\uba70, \ub370\uc774\ud130 \uc811\uadfc\uc744 \uc81c\uc5b4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
Spring Security\ub97c \uc0ac\uc6a9\ud558\uba74 \uc0ac\uc6a9\uc790 \uc778\uc99d\uc744 \uc704\ud55c \ub2e4\uc591\ud55c \ubc29\ubc95\uc744 \uc81c\uacf5\ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uae30\ubcf8\uc801\uc778 \uc0ac\uc6a9\uc790 \uc774\ub984\uacfc \ube44\ubc00\ubc88\ud638 \uc778\uc99d \uc678\uc5d0\ub3c4 OAuth2, JWT(JSON Web Token) \ub4f1\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc778\uc99d \ubc29\ubc95\uc740 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubcf4\uc548\uc744 \uac15\ud654\ud558\ub294 \ub370 \ud070 \ub3c4\uc6c0\uc774 \ub429\ub2c8\ub2e4.<\/p>\n
\uc608\ub97c \ub4e4\uc5b4, JWT\ub97c \uc0ac\uc6a9\ud558\uba74 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \uac04\uc758 \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud558\uc9c0 \uc54a\uace0\ub3c4 \uc548\uc804\ud55c \uc778\uc99d\uc744 \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. JWT\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc11c\ubc84\uc5d0 \uc694\uccad\ud560 \ub54c\ub9c8\ub2e4 \ud1a0\ud070\uc744 \ud3ec\ud568\ud558\uc5ec \uc778\uc99d \uc815\ubcf4\ub97c \uc804\ub2ec\ud558\ub294 \ubc29\uc2dd\uc785\ub2c8\ub2e4.<\/p>\n
import io.jsonwebtoken.Jwts;\nimport io.jsonwebtoken.SignatureAlgorithm;\n\npublic class JwtUtil {\n private static final String SECRET_KEY = \"your_secret_key\";\n\n public static String generateToken(String username) {\n return Jwts.builder()\n .setSubject(username)\n .signWith(SignatureAlgorithm.HS256, SECRET_KEY)\n .compact();\n }\n\n public static boolean validateToken(String token, String username) {\n String extractedUsername = Jwts.parser()\n .setSigningKey(SECRET_KEY)\n .parseClaimsJws(token)\n .getBody()\n .getSubject();\n return (extractedUsername.equals(username));\n }\n}\n<\/code><\/pre>\n\uc704\uc758 \ucf54\ub4dc\ub294 JWT\ub97c \uc0dd\uc131\ud558\uace0 \uac80\uc99d\ud558\ub294 \uac04\ub2e8\ud55c \uc608\uc81c\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc0ac\uc6a9\uc790 \uc778\uc99d\uc744 \uc548\uc804\ud558\uac8c \ucc98\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
Spring Security\ub294 \ub610\ud55c URL \uae30\ubc18 \uc811\uadfc \uc81c\uc5b4\ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \ud2b9\uc815 URL\uc5d0 \ub300\ud55c \uc811\uadfc \uad8c\ud55c\uc744 \uc124\uc815\ud558\uc5ec, \uc778\uac00\ub418\uc9c0 \uc54a\uc740 \uc0ac\uc6a9\uc790\uac00 \ud574\ub2f9 URL\uc5d0 \uc811\uadfc\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubcf4\uc548\uc744 \ub354\uc6b1 \uac15\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
4. \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubcf4\uc548<\/h2>\n
\ub370\uc774\ud130\ubca0\uc774\uc2a4\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uac00\uc7a5 \uc911\uc694\ud55c \uad6c\uc131 \uc694\uc18c \uc911 \ud558\ub098\uc785\ub2c8\ub2e4. \ub530\ub77c\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubcf4\uc548\uc740 \ub9e4\uc6b0 \uc911\uc694\ud569\ub2c8\ub2e4. Spring Boot\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \uc2dc \ubcf4\uc548\uc744 \uac15\ud654\ud558\uae30 \uc704\ud55c \uc5ec\ub7ec \uac00\uc9c0 \ubc29\ubc95\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n
\uccab \ubc88\uc9f8\ub85c, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \uc815\ubcf4\ub97c \uc548\uc804\ud558\uac8c \uad00\ub9ac\ud558\ub294 \uac83\uc774 \uc911\uc694\ud569\ub2c8\ub2e4. Spring Boot\uc5d0\uc11c\ub294 application.properties \ud30c\uc77c\uc5d0 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0 \uc815\ubcf4\ub97c \uc800\uc7a5\ud558\uc9c0\ub9cc, \uc774 \ud30c\uc77c\uc774 \uc678\ubd80\uc5d0 \ub178\ucd9c\ub418\uc9c0 \uc54a\ub3c4\ub85d \uc8fc\uc758\ud574\uc57c \ud569\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 \ud658\uacbd \ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uac70\ub098, Spring Cloud Config\uc640 \uac19\uc740 \uc678\ubd80 \uc124\uc815 \uad00\ub9ac \ub3c4\uad6c\ub97c \ud65c\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
\ub450 \ubc88\uc9f8\ub85c, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc0ac\uc6a9\uc790 \uad8c\ud55c \uad00\ub9ac\ub97c \ucca0\uc800\ud788 \ud574\uc57c \ud569\ub2c8\ub2e4. \ucd5c\uc18c \uad8c\ud55c \uc6d0\uce59(Principle of Least Privilege)\uc744 \uc801\uc6a9\ud558\uc5ec, \uac01 \uc0ac\uc6a9\uc790\uc5d0\uac8c \ud544\uc694\ud55c \ucd5c\uc18c\ud55c\uc758 \uad8c\ud55c\ub9cc \ubd80\uc5ec\ud574\uc57c \ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub300\ud55c \ubb34\ub2e8 \uc811\uadfc\uc744 \ubc29\uc9c0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
\uc138 \ubc88\uc9f8\ub85c, \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc800\uc7a5\ub418\ub294 \ubbfc\uac10\ud55c \uc815\ubcf4\ub294 \ubc18\ub4dc\uc2dc \uc554\ud638\ud654\ud574\uc57c \ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc0ac\uc6a9\uc790 \ube44\ubc00\ubc88\ud638\ub294 \ud574\uc2dc \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc800\uc7a5\ud574\uc57c \ud558\uba70, \uac1c\uc778 \uc815\ubcf4\ub294 AES\uc640 \uac19\uc740 \uc54c\uace0\ub9ac\uc998\uc73c\ub85c \uc554\ud638\ud654\ud558\uc5ec \uc800\uc7a5\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;\n\npublic class PasswordUtil {\n private static final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();\n\n public static String hashPassword(String password) {\n return encoder.encode(password);\n }\n\n public static boolean verifyPassword(String password, String hashedPassword) {\n return encoder.matches(password, hashedPassword);\n }\n}\n<\/code><\/pre>\n\uc704\uc758 \ucf54\ub4dc\ub294 \ube44\ubc00\ubc88\ud638\ub97c \ud574\uc2dc\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4. BCrypt \ud574\uc2dc \ud568\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube44\ubc00\ubc88\ud638\ub97c \uc548\uc804\ud558\uac8c \uc800\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
5. \ub124\ud2b8\uc6cc\ud06c \ubcf4\uc548<\/h2>\n
\ub124\ud2b8\uc6cc\ud06c \ubcf4\uc548\uc740 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uacfc \uc0ac\uc6a9\uc790 \uac04\uc758 \ub370\uc774\ud130 \uc804\uc1a1\uc744 \uc548\uc804\ud558\uac8c \ubcf4\ud638\ud558\ub294 \ub370 \ud544\uc218\uc801\uc785\ub2c8\ub2e4. Spring Boot\uc5d0\uc11c\ub294 HTTPS\ub97c \ud1b5\ud574 \ub124\ud2b8\uc6cc\ud06c \ubcf4\uc548\uc744 \uac15\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
HTTPS\ub294 HTTP \ud504\ub85c\ud1a0\ucf5c \uc704\uc5d0 SSL\/TLS \ud504\ub85c\ud1a0\ucf5c\uc744 \ucd94\uac00\ud558\uc5ec \ub370\uc774\ud130\ub97c \uc554\ud638\ud654\ud558\ub294 \ubc29\uc2dd\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \uac04\uc758 \ud1b5\uc2e0\uc774 \uc548\uc804\ud558\uac8c \uc774\ub8e8\uc5b4\uc9c8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
Spring Boot\uc5d0\uc11c HTTPS\ub97c \uc124\uc815\ud558\ub824\uba74 SSL \uc778\uc99d\uc11c\ub97c \uc0dd\uc131\ud558\uace0, application.properties \ud30c\uc77c\uc5d0 \uad00\ub828 \uc124\uc815\uc744 \ucd94\uac00\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n
server.port=8443\nserver.ssl.key-store=classpath:keystore.p12\nserver.ssl.key-store-password=your_password\nserver.ssl.keyStoreType=PKCS12\nserver.ssl.keyAlias=your_alias\n<\/code><\/pre>\n\uc704\uc758 \uc124\uc815\uc740 Spring Boot \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c HTTPS\ub97c \ud65c\uc131\ud654\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4. SSL \uc778\uc99d\uc11c\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc548\uc804\ud55c \ud1b5\uc2e0\uc744 \ubcf4\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
6. \ub85c\uadf8 \ubc0f \ubaa8\ub2c8\ud130\ub9c1<\/h2>\n
\uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ub85c\uadf8 \ubc0f \ubaa8\ub2c8\ud130\ub9c1\uc740 \ubcf4\uc548 \uc0ac\uace0\ub97c \uc608\ubc29\ud558\uace0, \ubc1c\uc0dd\ud55c \uc0ac\uace0\ub97c \uc2e0\uc18d\ud558\uac8c \ub300\uc751\ud558\ub294 \ub370 \uc911\uc694\ud55c \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4. Spring Boot\uc5d0\uc11c\ub294 \ub2e4\uc591\ud55c \ub85c\uae45 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc9c0\uc6d0\ud558\uba70, \uc774\ub97c \ud1b5\ud574 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ub3d9\uc791\uc744 \ubaa8\ub2c8\ud130\ub9c1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
\ub85c\uadf8\ub97c \ud1b5\ud574 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc0c1\ud0dc\ub97c \ud30c\uc545\ud558\uace0, \uc774\uc0c1 \uc9d5\ud6c4\ub97c \uc870\uae30\uc5d0 \ubc1c\uacac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \ub85c\uadf8\uc778 \uc2e4\ud328 \ud69f\uc218\uac00 \uae09\uc99d\ud558\uac70\ub098, \ud2b9\uc815 URL\uc5d0 \ub300\ud55c \uc811\uadfc\uc774 \ube48\ubc88\ud558\uac8c \ubc1c\uc0dd\ud558\ub294 \uacbd\uc6b0 \uc774\ub97c \ub85c\uadf8\ub97c \ud1b5\ud574 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
Spring Boot\uc5d0\uc11c\ub294 SLF4J\uc640 Logback\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub85c\uadf8\ub97c \uae30\ub85d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub85c\uadf8 \ub808\ubca8\uc744 \uc124\uc815\ud558\uace0, \ud544\uc694\ud55c \uc815\ubcf4\ub97c \uae30\ub85d\ud558\uc5ec \ubcf4\uc548 \uc0ac\uace0 \ubc1c\uc0dd \uc2dc \uc720\uc6a9\ud55c \uc815\ubcf4\ub97c \uc81c\uacf5\ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
import org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class SecurityLogger {\n private static final Logger logger = LoggerFactory.getLogger(SecurityLogger.class);\n\n public static void logLoginAttempt(String username) {\n logger.info(\"Login attempt for user: {}\", username);\n }\n\n public static void logUnauthorizedAccess(String url) {\n logger.warn(\"Unauthorized access attempt to URL: {}\", url);\n }\n}\n<\/code><\/pre>\n\uc704\uc758 \ucf54\ub4dc\ub294 \ub85c\uadf8\uc778 \uc2dc\ub3c4\uc640 \ubb34\ub2e8 \uc811\uadfc \uc2dc\ub3c4\ub97c \uae30\ub85d\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ub85c\uadf8\ub294 \ubcf4\uc548 \uc0ac\uace0 \ubc1c\uc0dd \uc2dc \uc911\uc694\ud55c \ub2e8\uc11c\uac00 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
7. \ubcf4\uc548 \ud14c\uc2a4\ud2b8 \ubc0f \uac10\uc0ac<\/h2>\n
\ubcf4\uc548 \ud14c\uc2a4\ud2b8 \ubc0f \uac10\uc0ac\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubcf4\uc548\uc744 \uac15\ud654\ud558\ub294 \ub370 \ud544\uc218\uc801\uc778 \uacfc\uc815\uc785\ub2c8\ub2e4. \uc815\uae30\uc801\uc73c\ub85c \ubcf4\uc548 \ud14c\uc2a4\ud2b8\ub97c \uc218\ud589\ud558\uc5ec \ucde8\uc57d\uc810\uc744 \ubc1c\uacac\ud558\uace0, \uc774\ub97c \uc218\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n
Spring Boot \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c\ub294 \ub2e4\uc591\ud55c \ubcf4\uc548 \ud14c\uc2a4\ud2b8 \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, OWASP ZAP(Zed Attack Proxy)\ub294 \uc6f9 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ucde8\uc57d\uc810\uc744 \uc790\ub3d9\uc73c\ub85c \uc2a4\uce94\ud558\uace0 \ubcf4\uace0\uc11c\ub97c \uc0dd\uc131\ud558\ub294 \ub3c4\uad6c\uc785\ub2c8\ub2e4.<\/p>\n
\ub610\ud55c, \ucf54\ub4dc \ub9ac\ubdf0\uc640 \uac19\uc740 \uc218\ub3d9 \ud14c\uc2a4\ud2b8\ub3c4 \uc911\uc694\ud569\ub2c8\ub2e4. \uac1c\ubc1c\uc790 \uac04\uc758 \ucf54\ub4dc \ub9ac\ubdf0\ub97c \ud1b5\ud574 \ubcf4\uc548 \ucde8\uc57d\uc810\uc744 \ubc1c\uacac\ud558\uace0 \uc218\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n
\ubcf4\uc548 \uac10\uc0ac\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubcf4\uc548 \uc0c1\ud0dc\ub97c \ud3c9\uac00\ud558\uace0 \uac1c\uc120\ud558\uae30 \uc704\ud55c \uacfc\uc815\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ubcf4\uc548 \uc815\ucc45\uc774 \uc81c\ub300\ub85c \uc2dc\ud589\ub418\uace0 \uc788\ub294\uc9c0 \ud655\uc778\ud558\uace0, \ud544\uc694\ud55c \uacbd\uc6b0 \uc815\ucc45\uc744 \uc218\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n
8. \uacb0\ub860<\/h2>\n
Spring Boot\uc5d0\uc11c \ub370\uc774\ud130 \uc554\ud638\ud654\uc640 \ubcf4\uc548 \uc811\uadfc \uc804\ub7b5\uc740 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc548\uc804\uc131\uc744 \ub192\uc774\ub294 \ub370 \ud544\uc218\uc801\uc785\ub2c8\ub2e4. \ub370\uc774\ud130 \uc554\ud638\ud654\ub97c \ud1b5\ud574 \uae30\ubc00\uc131\uc744 \uc720\uc9c0\ud558\uace0, Spring Security\ub97c \ud1b5\ud574 \uc811\uadfc \uc81c\uc5b4\ub97c \uac15\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubcf4\uc548, \ub124\ud2b8\uc6cc\ud06c \ubcf4\uc548, \ub85c\uadf8 \ubc0f \ubaa8\ub2c8\ud130\ub9c1, \ubcf4\uc548 \ud14c\uc2a4\ud2b8 \ubc0f \uac10\uc0ac \ub4f1\uc744 \ud1b5\ud574 \uc885\ud569\uc801\uc778 \ubcf4\uc548 \uc804\ub7b5\uc744 \uad6c\ucd95\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n
\uc774\ub7ec\ud55c \uc804\ub7b5\ub4e4\uc744 \ud1b5\ud574 \uae30\uc5c5\uc740 \uace0\uac1d\uc758 \uc2e0\ub8b0\ub97c \uc5bb\uace0 \ubc95\uc801 \ucc45\uc784\uc744 \ud68c\ud53c\ud560 \uc218 \uc788\uc73c\uba70, \uc548\uc804\ud55c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c \uac1c\ubc1c\uc790\uc640 \uae30\uc5c5\uc740 \ubcf4\uc548\uc5d0 \ub300\ud55c \uc9c0\uc18d\uc801\uc778 \uad00\uc2ec\uacfc \ub178\ub825\uc744 \uae30\uc6b8\uc5ec\uc57c \ud569\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"
\ubaa9\ucc28 Spring Boot\uc5d0\uc11c\uc758 \ub370\uc774\ud130 \uc554\ud638\ud654\uc640 \ubcf4\uc548 \uc811\uadfc \uc804\ub7b5 1. \ub370\uc774\ud130 \uc554\ud638\ud654\uc758 \uc911\uc694\uc131 2. Spring Boot\uc5d0\uc11c\uc758 […]<\/p>\n","protected":false},"author":1,"featured_media":33704,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1957],"tags":[2058,2082,2079],"class_list":["post-50591","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development","tag-application","tag-cloud","tag-security"],"acf":[],"_links":{"self":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/50591","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/comments?post=50591"}],"version-history":[{"count":0,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/posts\/50591\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/media\/33704"}],"wp:attachment":[{"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/media?parent=50591"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/categories?post=50591"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/m9js.shop\/blog\/wp-json\/wp\/v2\/tags?post=50591"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}