Back-End/JSP

5. 시큐리티 - 01. 선언적 시큐리티와 프로그래밍적 시큐리티

parkes811 2024. 6. 17. 01:26

 

  • 시큐리티의 개요

- 시큐리티는 허가된 사용자만이 특정 웹 페이지에 접근할 수 있도록 제한하는 보안 기능입니다.

- 사용자가 웹 브라우저에 접근할 때 JSP 컨테이너는 요청된 페이지에 보안 제약을 확인하고, 사용자에게 인증을 요청합니다.

- 인증이 완료되면 JSP 컨테이너는 특정 사용자가 해당 페이지에 접근할 수 있는지 확인하여 승인하는데 이를 권한 부여(authorization)이라고 합니다.

 

  • 시큐리티 처리 방법
시큐리티 처리 방법 설명
선언전 시큐리티 코드 작성 없이 web.xml 파일에 보안 구성을 작성하여 사용자의 인증을 수행하는 방식
프로그래밍적 시큐리티 request 내장 객체의 메소드를 통해 사용자의 권한을 부여를 처리하는 프로그래밍 방식

 

 

  • 웹 서버에 역할과 사용자 구성하기

- 웹 애플리 케이션의 인증과 권한 부여를 위해 톰캣 서버에 사용자와 역할을 쉽게 생성하고 구성할 수 있습니다. 

- 톰캣 서버에 인증 정보가 저장되는 장소는 /설치된 톰캣의 루트/conf/ 폴더 내 tomcat-user.xml 파일입니다.

<?xml version="1.0" encoding="UTF-8"?>
---(생략)---
<tomcat-users --->
---(생략)---
<!--
    <role rolename="tomcat"/>
    <role rolename="role1"/>
    <user username="tomcat" password="<must-be-changed> roles="tomcat"/>
    <user username="both" password="<must-be-changed> roles="tomcat, role1"/>
    <user username="role1" password="<must-be-changed> roles="role1"/>
  
-->
</tomcat-users>

- 2개의 역할 tomcat, role1을 가지고 3개의 사용자 tomcat, both, role1이 서로 다른 역할에 매핑되는 코드입니다.

 


 

  • 선언적 시큐리티 처리

- 선언적 시큐리티(Declarative Security) 는 웹 애플리케이션 배포 설명자 web.xml 파일에 보안 구성을 작성하여 수행하는 방식

- web.xml 파일에 보안 역할, 보안 제약 사항, 인증 처리 등을 설정하여 사용자가 웹 페이지에 접근할 수 있게 설정한다.

 

  • 시큐리티 역할 설정하기

- <Security-role> 은 웹 애플리케이션에 사용하는 역할을 나열하는 요소로, 형식은 다음과 같습니다.

<!-- web.xml -->
<security-role>
   <role-name>역할 이름</role-name>
</security-role>

- 역할 이름 : tomcat-users.xml에 등록된 역할과 사용자여야 합니다.

 

  • 시큐리티 제약 사항 설정하기

- 시큐리티 제약 사항(Security Constraint)은 사용자의 요청 URL에 대한 접근 권한을 정의하는데 사용하며 형식은 다음과 같습니다.

<security-constraint>
    <web-resource-collection> --- </web-resource-collection>
    <auth-constraint> --- </auth-constraint>
    <user-data-constraint> --- </user-data-constraint>
</security-constraint>

 

- <security-constraint> 를 구성하는 하위 요소

요소 설명
<web-resource-collection> 웹 자원에 대한 접근을 설정한다.
<auth-constraint> 웹 자원에 접근할 수 있는 인증된 사용자를 설정한다.
<user-data-constraint> 데이터 전송 시 데이터 보호를 설정한다.

 

<web-resource-collection>  요소

<!-- 웹 자원에 대한 접근을 설정하는 요소 -->
<web-resource-collection>
    <web-resource-name>자원 이름</web-resource-name>
    <url-pattern>접근 제한 URL</url-pattern>
    <http-method>전송 방식(GET/POST)</http-method>
</web-resource-collection>

 

-   <web-resource-collection> 을 구성하는 하위 요소

요소 설명
<web-resource-name> 웹 자원의 이름을 설정하며 생략할 수 있다.
<url-pattern> 접근 제한을 요청할 URL 목록을 설정한다. 
자원에 대한 접근을 제한하지 않는 경우 생략할 수 있다.
<http-method> 또는 
<http-method-omission>
http 메소드를 설정한다. (GET 또는 POST)

 

- <auth-constraint> 요소

<!-- 권한이 부여된 사용자만이 웹 자원에 접근할 수 있도록 이름을 설정하는 요소 -->
<auth-constraint>
    <description>설명</description>
    <role-name>역할 이름</role-name>
</auth-constraint>

 

- <auth-constraint> 를 구성하는 하위 요소

요소
설명
<description> 권한 부여 제약 사항에 대한 설명을 기술한다.
<role-name> 권한이 부여된 사용자의 이름을 대문자와 소문자를 구분하여 설정한다.
모든 사용자에게 권한을 부여하려면 *로 표시한다.
<role-name> 요소를 생략하면 <url-pattern> 요소에 설정된 접근 제한 URL에 대한 사용자의 요청을 허용하지 않는다.

 

- <user-data-constraint> 요소

<user-data-constraint>
    <trasport-guarantee>NONE/INTEGRAL/CONFIDENTIAL</trasport-guarantee>
</user-data-constraint>

 

- <user-data-constraint>의 종류

종류 설명
NONE 기본값으로 데이터를 보호하지 않겠다는 의미이다.
INTEGRAL 전송 중 데이터가 변경되지 않았음을 보장한다는 의미이다 (데이터 무결성)
CONFIDENTIAL 전송 중 데이터를 아무도 훔쳐보지 않았음을 보장한다는 의미이다 (기밀성)

 


 

  • 프로그래밍적 시큐리티 처리

- 프로그래밍적 시큐리티 (Programming Security) 는 웹 애플리케이션의 보안을 위해 코드를 작성하여 사용자의 권한 부여를 처리하는 방식입니다.

- 보안 관련 request 내장 객체의 메소드

메소드 형식 설명
getRemoteUser() String 사용자의 인증 상태를 반환한다.
getAuthType() String 서블릿을 보호하는 데 사용되는 인증 방식의 이름을 반환한다.
isUserInRole(java.lang.String role) boolean 현재 인증된 사용자에게 설정된 역할이 있는지 확인한다.
설정된 경우 true를 반환하고 그렇지 않은 경우 false를 반환한다.
getProtocol() String 웹 브라우저의 요청 프로토콜을 가져온다.
isSecure() boolean 웹 브라우저에서 https 요청으로 request가 들어왔는지 확인한다. 
웹 브라우저에서 https로 접근하면 true를 반환하고, http로 접근하면 false를 반환한다.
getUserPrinciple() Principle 현재 인증한 사용자의 이름을 포함하여 java.security.Principle 객체를 반환한다.