Development/JSP
다국어 처리& 시큐리티
우봉수
2023. 5. 18. 13:38
개요
- 웹 브라우저를 사용하는 국가에 따라 다양한 언어 및 지역을 지원 하는 서비스
- JSP 페이지에 JSTL foot 태그를 이용하면 언어별 페이지를 따로 만들 필요 없이 간단하게 다국어 지원이 가능
지역화
- 환경과 특정 언어를 지역에 맞게 적합화 하는 것
- L10n으로 표기
- 고려사항
- 숫자, 날짜, 시간 형식
- 화폐 표시
- 키보드 지원
- 심벌, 아이콘, 색상
- 문자열 순서와 정렬
국제화
- 여러 국가에서 사용할 수 있도록 다국어 지원
- i18n으로 표기
- 국제화 처리
- 유니코드 사용이나 기존 인코딩을 적절히 처리
- 문자 코드가 포함되지 않도록 설계 및 개발
- 세로쓰기/가로쓰기 등 언어의 특성을 반영하는 처리 등 지원
- 날짜, 시간, 지역, 숫자, 리스트 정렬과 표시
- 사용자 요청이나 설정에 따라 필요시 사용되도록 지역화 정보를 코드와 분리 해야 함
java.util.Locale 클래스
- 특정 지리적, 정치적, 문화적 지역을 나타내는 클래스
- 지역적 문화(언어, 날짜, 시간 등)의 정보를 담고 있는 클래스
- request 내장 객체를 이용하여 현재 웹 브라우저에 미리 정의도니 언어나 국가 정보를 가져옴
Locale locale = request.getLocale();
locale.getDisplayLanguage(); // 한국어 (언어이름)
locale.getLanguage(); // ko (언어 코드)
locale.getDisplayCountry(); // 대한민국 (언어 국가 이름)
locale.getCountry(); // KR (국가 코드)
- 날자: DateFormat 클래스의 getDateTimeInstance() 메소드 이용
Locale locale = request.getLocale();
String date = DateFormat.getDateTimeInstance(DateFormat.Full, DateFormat.SHORT, locale)
.format(new Date());
out.println((new Date()).toLocaleString()); // 2023. 4. 14. 오전 11:13:09
out.println(date) // 2023년 4월 14일 금요일 오전 11:13
- 화폐: NumberFormat 클래스 getCurrencyInstance() 메소드 사용
Locale locale = request.getLocale();
NumberFormat nf = NumberFormat.getCurrencyInstance(locale);
NumberFormat perNf = NumberFormat.getPercentInstance(locale);
String strnf = nf.format(1000);
String strPerNf = perNf.format(0.5);
out.println("<p>" + strnf + "</p>"); // ₩1000
out.println("<p>" + strPerNf + "</p>"); // 50%
JSTL 태그를 통한 다국어 처리
- JSTL fmt 태그와 메시지 번들을 통해 다국어 처리 가능
- jstl-1.2.jar 파일 필요
- <%@ taglib prefix=“fmt” uri=http://java.sun.com/jsp/jstl/fmt %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page import="java.util.Locale" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<%=response.getLocale() %>
<fmt:setLocale value="ko_KR"/>
<p><%=response.getLocale() %>
<fmt:setLocale value="en_US"/>
<p><%=response.getLocale() %>
<fmt:setLocale value="ja_JP"/>
<p><%=response.getLocale() %>
</body>
</html>
<메시지 번들>
- WEB-INF/classes 경로 아래 message.properties 파일 작성
name = \\uAD00\\uB9AC\\uC790
hello = \\uC548\\uB155\\uD558\\uC138\\uC694
- java.util.Properties 클래스에 정의된 방법으로 메시지를 읽음
- 알파벳이나 숫자, 라틴 문자 외의 언어를 유니코드 값으로 표현
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<fmt:setBundle basename="message" var="message"/>
<p> <fmt:message bundle="${message }" key="name"/></p>
<fmt:message bundle="${message }" key="hello" var="msg"/>
<p>${msg}</p>
</body>
</html>
<숫자, 통화, 퍼센트, 패턴, 날짜, 시간 formatNumber, formatDate>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<p> 숫자: <fmt:formatNumber value="0402" type="number"/></p>
<p> 통화: <fmt:formatNumber value="1000" type="currency" currencySymbol="원" />
</p>
<p> 퍼센트: <fmt:formatNumber value="0.9" type="percent" /></p>
<p> 패턴(.0000): <fmt:formatNumber value="10.1" pattern=".0000"/></p>
<p> date 형식: <fmt:formatDate value="${now }" type="date"/></p>
<p> time 형식: <fmt:formatDate value="${now }" type="time"/></p>
<p> both 형식: <fmt:formatDate value="${now }" type="both"/></p>
<jsp:useBean id="now" class="java.util.Date"/>
<fmt:timeZone value="GMT+9">
<p> 한국: <fmt:formatDate value="${now }" type="both"/> </p>
</fmt:timeZone>
<fmt:timeZone value="GMT">
<p> 런던: <fmt:formatDate value="${now }" type="both"/> </p>
</fmt:timeZone>
<fmt:timeZone value="GMT-8">
<p> 뉴욕: <fmt:formatDate value="${now }" type="both"/> </p>
</fmt:timeZone>
</body>
</html>
시큐리티
- 허가된 사용자만 특정 웹 페이지에 접근할 수 있도록 제한하는 보안 기능
- 인증: 사용자 아이디, 비밀번호 등으로 페이지 접근 여부 확인
- 권한: 로그인 후 특정 페이지 접근할 수 있는 접근 확인
- 시큐리티 처리 방법
- 선언적 시큐리티: 코드 작성 없이 web.xml 파일에 보안 구성을 작성하여 사용자 인증 수행 (직관적, 실시간 반영 x)
- (대세) 프로그래밍적 시큐리티: request 내장 객체의 메소드를 통해 사용자 권한 부여를 처리하는 방식