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 디코더 | 화면 암호화 순서 역으로 디코딩함 |
'SPRING > SPRING' 카테고리의 다른 글
| JDBC, DBCP, JNDI 차이점 (1) | 2024.10.14 |
|---|---|
| Spring JDBC (3) | 2024.10.13 |
| MyBatis에서 바인드 변수 주입 방법 2가지 #{}, ${} (5) | 2024.09.07 |
| ibatis(mybatis) vs SP(Stored Procedure) 성능 차이 (3) | 2024.07.21 |
| MySQL 연동시 Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed 오류 해결 (2) | 2024.06.11 |