6th Weekly Reflection

Metronon·2024년 12월 28일
0

REST-API

목록 보기
8/12
post-thumbnail

지난번 웹 어플리케이션에서 클라이언트와 서버의 3가지 연결방식에 대한 개념 정리를 했다.
오늘은 웹에서의 연결방식에서 인증키 + 암호화를 통해 사용자의 데이터를 보호하는 보안수단에 대해 조사해보았다.

HTTP 통신

  • 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);
    • OAuth 2.0 인증 프로토콜 사용 가능

Server-Sent Events (SSE)

  • HTTPS를 통한 SSL/TLS 암호화
  • HTTP 인증 방식 사용
    • Bearer 토큰: "Bearer" 접두어가 붙은 액세스 토큰으로, 주로 JWT 형식 사용
    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);
  • 이벤트 스트림에 대한 인증은 HTTP 헤더를 통해 처리

WebSocket

  • 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 인증 방식 사용 가능

  • 커스텀 토큰 기반 인증

  • 핸드쉐이크 과정에서 인증 키 교환

    • 클라이언트-서버 간 난수 기반 키 생성
    • Diffie-Hellman 키 교환 알고리즘 사용
    • 생성된 키는 세션 암호화에 사용
profile
비전공 개발 지망생의 벨로그입니다!

0개의 댓글