JSP - 시큐리티/보안 처리
시큐리티
사용자가 클라이언트를 통해 웹 페이지를 요청할 때 JSP 컨테이너는 요청된 페이지에 보안 제약이 있는지 확인하고, 허가된 사용자만 접근할 수 있게 제한하는 것을 말한다.
사용자 인증 확인 절차
1. 인증 : id/pwd를 통해 신원을 확인한다.
2. 권한 부여 : 인증이 완료되면 요청한 웹 페이지에 접근할 수 있는 권한을 부여한다.
WHY?
- 권한이 없는 상태로 데이터에 접근하는 것을 막기 위해 사용한다.(은행 계좌)
- 해킹 방지
처리 방법
처리 방법 | 설명 |
선언적 시큐리티 | 요청이 서버에 들어오기 전에 코드 작성 없이 web.xml 파일에 보안 구성을 작성해 사용자의 인증을 수행하는 것이다. |
프로그래밍적 시큐리티 | 요청이 서버에 들어온 후에 request 내장 객체의 메서드를 활용해 사용자의 권한 부여를 처리하는 방식이다. |
그룹과 사용자 추가
기존에 설정된 역할을 수정하거나 제거, 추가하기 위해
Servers/Tomcat v10.0 Server at localhost-config/tomcat-users.xml 파일에서
아래쪽에 주석 처리 되어있는 role태그와 user태그를 주석 해제 한다.
role 태그
- rolename 속성은 역할/그룹명으로 시스템에서 할당되는 권한을 설정한다. ex)admin, guest
user 태그
- username 속성은 로그인 시 사용되는 ID
- password 속성은 로그인 시 사용되는 Password
- roles는 속한 역할/그룹명이다.
선언적 시큐리티(전)
*모든 내용은 web.xml 안에 작성한다.
역할/그룹 설정
<security-role>
<role-name>역할/그룹 이름</role-name>
</security-role>
웹 애플리케이션에서 사용할, 보안을 적용할 역할/그룹을 설정한다.
*role-name 속성에 설정하는 이름은 반드시 tomcat-users.xml에 등록된 사용자와 역할/그룹이어야만 한다.
제약 사항 설정(누구를?)
<security-constraint>
<web-resource-collection>....</web-resource-collection>
<auth-constraint>....</auth-constraint>
<user-data-constraint>....</user-data-constraint>
<security-constraint>
요청 url에 대한 접근 권한을 정의한다.
요소 | 설명 |
web-resource-collection | 어떤 URL을 검사할 것인지 정의한다. |
auth-constraint | 접근 가능한 역할/그룹을 정의한다. |
user-data-constraint | 사용자 데이터 전송 시 보안 수준을 설정한다. |
web-resource-collection 요소
<web-resource-collection>
<web-resource-name>....</web-resource-name>
<url-pattern>....</url-pattern>
<http-method>....</http-method>
</web-resource-collection>
요소 | 설명 |
web-resource-name | 웹 리소스의 이름을 설정한다.(식별용) |
url-pattern | 보호할 URL의 패턴을 설정한다. ex) " /10_1 ", " /admin/* |
http-method | 보호할 요청 파라미터 전송 방식을 설정한다. GET/POST |
auth-constraint 요소
<auth-constraint>
<description>...</description>
<role-name>...</role-name>
</auth-constraint>
요소 | 설명 |
description | 권한 부여 제약 사항에 대해 설명한다. |
role-name | 접근 가능한 역할/그룹을 정의하며, 이 역할/그룹을 가진 사용자만 접근할 수 있다. |
user-data-constraint 요소
<user-data-constraint>
<transport-guarantee>...</transport-guarantee>
</user-data-constraint>
요소 | 설명 |
transport-guarantee | - NONE : 기본값, 보안 전송 X - INTEGRAL : 데이터의 무결성 보장, 암호화X - CONFIDENTIAL : 데이터 전송 시 보안 요구, 암호화 필요 |
시큐리티 인증 설정(검사 방법)
<login-config>
<auth-method>...</auth-method>
<realm-name>...</realm-name>
<form-login-config>...</form-login-config>
</login-config>
인증 처리, 누구인지 확인하기 위한 로그인 페이지나 오류 페이지를 호출하는 데 사용된다.
요소 | 설명 |
auth-method | 인증 방식 설정 |
realm-name | 인증 영역의 이름 설정 |
form-login-config | FORM으로 인증할 때 로그인 및 오류 페이지를 설정한다. |
auth-method 요소
종류 | 설명 |
BASIC | 사용자 이름과 비밀번호를 인코딩하여 전송하는 가장 간단한 인증 방법, 보안 취약 |
FORM | HTML 폼을 사용해 사용자의 인증을 처리한다. |
DIGEST | 사용자 이름과 비밀번호를 해시하여 전송하는 방법 BASIC보다 보안이 강화됨 |
CLIENT-CERT | 클라이언트 인증서를 가지고 공인 키 인증 방식을 사용해 로그인하는 방식, 고급 보안 |
form-login-config 요소
<form-login-config>
<form-login-page>로그인 페이지 경로</form-login-page>
<form-error-page>오류 페이지 경로</form-error-page>
</form-login-config>
인증 방식이 FORM일 때 사용하는 태그로 인증 처리를 위한 로그인 및 오류 페이지를 설정한다.
로그인 페이지의 요구사항(반드시 지켜야함)
속성 | 값 |
form 태그의 action 속성 | j_security_check |
사용자의 name 속성 | j_username |
비밀번호의 name 속성 | j_password |
프로그래밍적 시큐리티 처리(후)
선언적 시큐리티의 보안으로 충분하지 않을 때 request 내장 객체의 메서드를 사용해 사용자를 승인하는 방법
메서드 | 반환 타입 | 설명 |
getRemoteUser() | String | 사용자의 ID를 반환한다. |
getAuthType() | String | 현재 요청에 대한 인증 방식을 반환한다. |
isUserInRole(String role) | boolean | 사용자의 역할/그룹이 role인지 확인한다. |
getProtocol() | String | 웹 브라우저의 요청 프로토콜을 가져온다. |
isSecure() | boolean | 웹 브라우저에서 https로 접근하면 true, http로 접근하면 false 반환 |
getUserPrinciple() | Principle | 현재 인증한 사용자의 이름을 포함한 Principle 객체를 반환 |