지난번 웹 어플리케이션에서 클라이언트와 서버의 3가지 연결방식에 대한 개념 정리를 했다.
오늘은 웹에서의 연결방식에서 인증키 + 암호화를 통해 사용자의 데이터를 보호하는 보안수단에 대해 조사해보았다.
SSL/TLS를 통한 HTTPS 암호화 지원
// 대칭키(AES) 암호화 예시
SecretKey secretKey = KeyGenerator.getInstance("AES").generateKey();
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = cipher.doFinal(data.getBytes());
// 비대칭키(RSA) 암호화 예시
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
KeyPair pair = keyGen.generateKeyPair();
PublicKey publicKey = pair.getPublic();
PrivateKey privateKey = pair.getPrivate();
// 인증서 검증 예시
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate cert = cf.generateCertificate(certInputStream);
cert.verify(publicKey);
// SHA 해시 예시
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest(data.getBytes());
세션/쿠키 기반 인증
JWT(JSON Web Token) 인증
// JWT 생성 예시
String secret = "mySecretKey";
String token = Jwts.builder()
.setHeader(Map.of("alg", "HS256", "typ", "JWT"))
.setSubject("user123")
.claim("name", "홍길동")
.claim("role", "ADMIN")
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 3600000))
.signWith(SignatureAlgorithm.HS256, secret.getBytes())
.compact();
// JWT 검증 예시
Claims claims = Jwts.parser()
.setSigningKey(secret.getBytes())
.parseClaimsJws(token)
.getBody();
String subject = claims.getSubject();
String name = claims.get("name", String.class);
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."; // JWT 토큰
HttpHeaders headers = new HttpHeaders();
headers.setBearerAuth(token); // "Authorization: Bearer <token>" 설정
// 또는 직접 헤더 설정
headers.set("Authorization", "Bearer " + token);
// RestTemplate 사용 예시
HttpEntity<String> entity = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(
url, HttpMethod.GET, entity, String.class);
WSS(WebSocket Secure) 프로토콜로 SSL/TLS 암호화
// WSS 연결 예시 코드
String wssUrl = "wss://example.com/websocket";
WebSocketClient client = new StandardWebSocketClient();
WebSocketHandler handler = new WebSocketHandler() {
@Override
public void afterConnectionEstablished(WebSocketSession session) {
// 연결 성공 후 처리
session.sendMessage(new TextMessage("Connected via WSS"));
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) {
// 메시지 수신 처리
}
};
client.doHandshake(handler, wssUrl);
최초 연결 시 HTTP 인증 방식 사용 가능
커스텀 토큰 기반 인증
핸드쉐이크 과정에서 인증 키 교환