HTTP 요청 파라미터 Base64 화면 인코딩 후 서버에서 디코딩 예시

HTTP 요청 파라미터는 기본적으로 모두 String으로 전달되며,
Spring이 자동으로 타입 변환(컨버전)해줍니다.
반드시 int로만 받아야 할 특별한 상황이 아니라면,
String으로 받고, 필요시 int 파싱 및 유효성 검사를 직접 해주는 것이 오류 없는 설계입니다.

 

JS
const bbsNo = "23456";                  // 숫자를 문자열 형태로
const encoded = btoa(bbsNo);           // Base64 인코딩: "MjM0NTY="

location.href = "/search.do?bbsNo=" + encodeURIComponent(encoded);
// 요청 URL: /search.do?bbsNo=MjM0NTY%3D
  • btoa (binary-to-ascII)

JavaScript에서 문자열을 Base64로 인코딩하는 내장 함수

매개 변수 문자열을 바이트 배열로 취급하여 처리.

UTF-8이 아닌 Latin1(또는 ASCII) 문자만 지원

  • atob (ascII- to-binary)

Base64 문자열을 원본으로 디코딩

  • encodeURIComponent

유니코드 문자를 utf-8 인코딩 형식으로 16진수 값의 스트림을 문자열로 변환. URL인코딩

btoa()로 문자열을 Base64 인코딩하면 결과값에 +, /, = 문자가 포함되어 URL 인코딩 안할경우 

서버 Request param값으로 넘어올 경우 변환 될 수 있으므로 필요함.  

변화 : / -> %2F, = ->%3D, + ->%2B

 

JAVA
import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Base64;
import java.nio.charset.StandardCharsets;


@RequestMapping("/search.do")
public ResponseEntity<?> search(@RequestParam String bbsNo) {
    try {
        // 1.URL 디코딩 (예: MjM0NTY%3D → MjM0NTY=)
        String urlDecoded = URLDecoder.decode(bbsNo, "UTF-8");

        // 2.Base64 디코딩
        byte[] decodedBytes = Base64.getDecoder().decode(urlDecoded);
        String decodedBbsNo = new String(decodedBytes, StandardCharsets.UTF_8);

        //3.Biz로직 숫자인지 확인 후 분기
        //숫자일때 로직
        if (decodedBbsNo != null && decodedBbsNo.matches("\\d+")) {
            int bbsNoInt = Integer.parseInt(decodedBbsNo);
            // ... 로직 수행
            return ResponseEntity.ok("처리 성공(숫자): " + bbsNoInt);
        } else {
        	// 숫자 아님(또는 값 이상)
            return ResponseEntity.badRequest().body("숫자만 허용됩니다: " + decodedBbsNo);
        }

    } catch (Exception e) {
        return ResponseEntity.badRequest().body("디코딩 오류: " + e.getMessage());
    }
}
  • \\d+ 정규식: 순수 숫자 문자열에만 true 반환
  • -?\\d+ 정규식: 음수부호(-)를 허용, 순수 숫자 문자열에만 true 반환
  • 브라우저에서 encodeURIComponent()로 인코딩 된 URL 파라미터는 특수문자(예: =, /)가 %3D, %2F과 같이 바뀌기 때문에 서버에서 직접 처리하려면 한 번 URLDecoder.decode로 복구해 줘야 제대로 된 Base64 디코딩이 가능합니다.

 

결론
Base64 인코딩 "23456"  "MjM0NTY=" 암호화처럼 사용 가능
URL 인코딩 "MjM0NTY="  "MjM0NTY%3D" Base64 특수문자 대응 (에:=)
서버 처리 순서 URLDecoder  Base64 디코더 화면 암호화 순서 역으로 디코딩함