Enumeration<String> headers = request.getHeaderNames();
while (headers.hasMoreElements()) {
    String name = (String) headers.nextElement();
    String value = request.getHeader(name);
    log.debug("{}={}", name, value);
}

 

 

조회하면 다음과 같은 값들을 조회할 수 있다

host=localhost:8080
connection=keep-alive
content-length=141525
sec-ch-ua-platform="Windows"
authorization=bearer eyJ0eXBlIjoiSldUIiwiYWx....
user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
accept=application/json, text/javascript, */*; q=0.01
sec-ch-ua="Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"
content-type=multipart/form-data; boundary=----WebKitFormBoundaryErDQuy82mb8ADSJp
sec-ch-ua-mobile=?0
origin=null
sec-fetch-site=cross-site
sec-fetch-mode=cors
sec-fetch-dest=empty
accept-encoding=gzip, deflate, br, zstd
accept-language=ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7

 

adoc 적용후에 결과를 확인하는데

직접 테스트를 했을 경우에는 문제가 없었는데,

전체 테스트를 진행하니 한글이 깨져벼렸다

 

이유가 뭐지?

 

의심군 1번째

 

필터가 잘못되었나?

 

의심군 2번째

 

메인에서도 

APPLICATION_JSON -> APPLICATION_JSON_UTF8 로 변경

하지만 결과는 변하지 않았다

 

 

"?뀒?뒪?듃?썡?뱶"

 

도대체 뭐가 인코딩 된 것일까? 인코딩 검사를 돌려보았다

String originalStr = "테스트월드";

        byte[] bytes = originalStr.getBytes("utf-8");
        originalStr = new String(bytes);

        String[] charSet = {"utf-8", "euc-kr", "ksc5601", "iso-8859-1", "x-windows-949"};
        for(int i = 0; i<charSet.length; i++){
            for(int j = 0; j<charSet.length; j++){
                try{
                    System.out.println("[" + charSet[i] + "," + charSet[j] + "]" + new String(originalStr.getBytes(charSet[i]), charSet[j]));
                } catch (UnsupportedEncodingException e){
                    e.printStackTrace();
                }
            }
        }

 

인코딩 확인!

utf-8로 나왔는데 x-windows-949로 인코딩이 되었다?

 

x-windows-949 로 구글링

 

검거!

 

해당 부분을 UTF8로 변경하니 한글 깨지는 것이 해결되었다

'Dev Back > JAVA' 카테고리의 다른 글

[JAVA] Field injection is not recommended  (0) 2025.02.21
[JAVA] Aes 암복호화 소스코드  (0) 2024.10.25
[JAVA] 접근 제어자의 종류와 사용법  (0) 2024.06.26
[JAVA] AES256 암/복호화  (0) 2024.06.14
[JAVA] @Valid  (0) 2024.06.11
  • 1.형용사 (변화·움직임이 없이) 고정된[고정적인]
  • 2.형용사 정지 상태의
  • 3.명사 (수신기의) 잡음
  • 4.명사 정전기

자바에서 사용되는 용어는 '정적인', '고정적인'에 해당된다.

 

static 맴버들의 특징

- 메모리에 고정적으로 할당

- 객체 생성 없이 사용할 수 있다

- static 메모리 내에서는 인스턴스 변수를 사용할 수 없다

- 한번 메모리에 올라가면 메모리의 static 영역에 적재되고, 프로그램이 종료될때 해제된다(가비지 콜랙터 영역 밖)

 

사용처

 인스턴스를 생성할 경우 각각의 인스턴스는 서로 다른 메모리 주소값을 참조하고 있기 떄문에 독립적이다.

 그렇기 때문에 static 키워드는 인스턴스들이 공통적으로 값을 유지해야할 때 사용

 -> 프로그램 전역에 사용되는 유일한 클래스를 만들 때

 

'Study > Tech' 카테고리의 다른 글

세션(session)  (0) 2024.07.01
객체, 클래스, 인스턴스  (0) 2024.07.01
정렬의 종류  (0) 2024.06.06
자바 컬렉션 종류와 특징  (0) 2024.06.06
데이터베이스 정규화 과정  (0) 2024.06.06

 

AES256

- Advanced Encryption Standard 의 줄임말

- 256비트 길이의 키를 사용하는 암호화 알고리즘

- 대칭키 암호화

- 높은 보안성

- 속도가 빠름

 

 

 AES 개인키 설정

private final static String privateKey = "worldProject1234";

 

위는 그냥 자바 문자열로 선언해두었지만, 환경설정 파일에 세팅한 값을 불러올 수도 있다

 

 

AES 암복호화

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.apache.commons.codec.binary.Hex;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

@Slf4j
@Component
public class AESUtil {

    private final static String privateKey = "{16바이트 개인키 설정}";

    private final static String IVparam = "{16바이트 IV값 설정}";
    private final static String UTF8 = "UTF-8";
    private final static String AES = "AES";
    private final static String AESInstance = "AES/CBC/PKCS5Padding";

    public static String encrypt(String str) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(privateKey.getBytes(UTF8), AES);
            IvParameterSpec IV = new IvParameterSpec(IVparam.getBytes(UTF8));

            Cipher c = Cipher.getInstance(AESInstance);

            c.init(Cipher.ENCRYPT_MODE, secretKey, IV);

            byte[] encrypte = c.doFinal(str.getBytes(StandardCharsets.UTF_8));

            return Hex.encodeHexString(encrypte);

        } catch (Exception e) {
            log.error("Error while encrypt: {}", e);
            return null;
        }
    }

    public static String decrypt(String str) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(privateKey.getBytes(UTF8), AES);
            IvParameterSpec IV = new IvParameterSpec(IVparam.getBytes(UTF8));

            Cipher c = Cipher.getInstance(AESInstance);

            c.init(Cipher.DECRYPT_MODE, secretKey, IV);

            byte[] decode = Hex.decodeHex(str.toCharArray());

            return new String(c.doFinal(decode), UTF8);

        } catch (Exception e) {
            log.error("Error while decrypt: {}", e);
            return null;
        }
    }
}

 

 

 

Hex 의 경우 추가로 라이브러리가 필요할 수 있다

implementation group: 'commons-codec', name: 'commons-codec', version: '1.15'

 

 

 

암복호화가 잘 되는지 테스트

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

class AESUtilTest {

    final String test = "test1234";
    final String aesTest = "7b0934575f6e21a322912bb3adda16da";

    @Test
    void encrypt() {
        Assertions.assertEquals(AESUtil.encrypt(test), aesTest);
    }

    @Test
    void decrypt() {
        Assertions.assertEquals(AESUtil.decrypt(aesTest), test);
    }
}

'Dev Back > JAVA' 카테고리의 다른 글

[adoc] 한글이 깨지는 이슈  (1) 2024.07.03
[JAVA] 접근 제어자의 종류와 사용법  (0) 2024.06.26
[JAVA] @Valid  (0) 2024.06.11
[JAVA] 인텔리제이 자바 빌드 버전 바꾸기  (0) 2024.05.28
[JAVA] @JsonProperty  (0) 2024.05.27
public CustomApiResponse save(@RequestBody @Valid CardRequest cardRequest) {

 

어노테이션 Valid 를 활용하면 파라미터 매핑 단계에서 검증을 할 수 있다

스프링부트 2버전에서는 적용하면 알아서 된다고 하는 것 같은데,

3버전부터는 추가로 등록해주지 않으면 적용이 안되는 것을 확인했다(추측...)

implementation 'org.springframework.boot:spring-boot-starter-validation'

 

@JsonProperty("card_number")
@Schema(name = "card_number", description = "카드번호", example = "1125890588247725")
@Pattern(regexp = "[0-9]{16}")
private String cardNumber;

@JsonProperty("cvc")
@Schema(name = "cvc", description = "CVC", example = "445")
@Pattern(regexp = "[0-9]{3}")
private String cvc;

 

다음과 같이 정규식을 활용해서 제한할 수도 있다

 

Anotation 제약조건
@NotNull Null 불가
@Null Null만 입력 가능
@NotEmpty Null, 빈 문자열 불가
@NotBlank Null, 빈 문자열, 스페이스만 있는 문자열 불가
@Size(min=,max=) 문자열, 배열등의 크기가 만족하는가?
@Pattern(regex=) 정규식을 만족하는가?
@Max(숫자) 지정 값 이하인가?
@Min(숫자) 지정 값 이상인가
@Future 현재 보다 미래인가?
@Past 현재 보다 과거인가?
@Positive 양수만 가능
@PositiveOrZero 양수와 0만 가능
@Negative 음수만 가능
@NegativeOrZero 음수와 0만 가능
@Email 이메일 형식만 가능
@Digits(integer=, fraction = ) 대상 수가 지정된 정수와 소수 자리 수 보다 작은가?
@DecimalMax(value=)  지정된 값(실수) 이하인가?
@DecimalMin(value=) 지정된 값(실수) 이상인가?
@AssertFalse false 인가?
@AssertTrue true 인가?

'Dev Back > JAVA' 카테고리의 다른 글

[adoc] 한글이 깨지는 이슈  (1) 2024.07.03
[JAVA] 접근 제어자의 종류와 사용법  (0) 2024.06.26
[JAVA] AES256 암/복호화  (0) 2024.06.14
[JAVA] 인텔리제이 자바 빌드 버전 바꾸기  (0) 2024.05.28
[JAVA] @JsonProperty  (0) 2024.05.27

+ Recent posts