본문 바로가기

Study/SpringBoot

[SpringBoot] security, logging(slf4j)

security 설정

 

-pom.xml

<!-- spring-boot-starter-security -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

위의 코드를 추가해준다.

 

SecurityConfig class 생성

 

java class를 사용해 configuration  authorization을 설정해준다.

- SecurityConfig.java

package kr.ac.hansung.cse.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http
			.authorizeHttpRequests()
				.anyRequest()
				.permitAll()
				.and()
			.csrf().disable();
	}

}

 

위의 코드는 아래 xml의 코드와 동일하다. 

 

<security:http auto-config="true" disable-url-rewriting="false"
	request-matcher="mvc" use-expressions="true">
<security:intercept-url pattern="/admin/**" access='hasRole("ROLE_ADMIN")' />
<security:form-login login-page="/login" authentication-failure-url="/login?error=1" />
</security:http>

 

 

permitAll()는 어떤 request든 다 허가하기 때문에 xml코드에서의 authentication는 설정할 필요가 없다.

 

xml로 Security 설정하는 방법 

- security-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.2.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

authentication
	<security:authentication-manager>
		<security:authentication-provider>
			<security:jdbc-user-service data-source-ref="dataSource"
				users-by-username-query="select username, password, enabled from users where username = ?"
				authorities-by-username-query="select username, authority from users where username = ?" />
			<security:password-encoder ref="passwordEncoder"></security:password-encoder>
		</security:authentication-provider>
	</security:authentication-manager>
	
authorization
	<security:http auto-config="true" disable-url-rewriting="false"
		request-matcher="mvc" use-expressions="true">
	<security:intercept-url pattern="/admin/**" access='hasRole("ROLE_ADMIN")' />
	<security:form-login login-page="/login" authentication-failure-url="/login?error=1" />
	</security:http>
	
	<bean
		class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"
		id="passwordEncoder">
	</bean>
	
</beans>

 

 

Logging 기능 구현

 

  • application.properties에서 컨트롤러 패키지 (여기서는 kr.ac.hansung.cse / 전체는 root) logging level을 debug로 설정한다.
  • logback이라는 logging framework를 사용한다.
  • slf4 j, logback-classic, logback-core를 설치한다.

 

로그의 장점

  • 상활별 Level을 지정하여 Level 별 메시지를 선택 가능
  • 응용 프로그램의 실행에 대한 흐름과 에러 확인 가능
  • 프레임워크를 이용하여 간단하고 쉬운 사용 환경 조성 가능
  • 모듈 별로 유연하게 메시지 출력 가능
  • 자유로운 출력 위치 및 다양한 출력 형식 지원

 

로깅 프레임워크 slf4 j log4 j logback

  • slf4j는 Simple Logging Facade For Java의 약자이다.
  • 자체적인 로킹 프레임워크가 아니고 logger 추상체로써 다른 로깅 프레임워크가 접근할 수 있도록 도와주는 추상화 계층이다.
  • logback이나 log4j2와 같은 로킹 프레임워크의 인터페이스의 역할을 해준다.
  • slf4j2를 이용하면 코드를 일정하게 유지하면서 구현체의 전환을 통해 다른 로깅 프레임워크로의 전환을 간단하게 할 수 있다.

 

  • log4j는 Apache의 Java기반 로깅 프레임 워크이다.
  • 콘솔 및 파일 출력의 형태로 로깅을 도와주며 xml, properties로 환경을 구성할 수 있다
  • log4j는 3개의 컴포넌트들로 이루어져 있다.
    logger: 데이터를 기록하는 역할
    appender: 데이터를 어디에 기록할지 정하는 역할 (파일, 콘솔, jdbc, smtp, 등)
    layout: 데이터를 어떤 스타일로 기록할지 정하는 역할

  • logback은 slf4j의 구현체로써 동작한다.
  • Springboot 환경의 경우는 spring-boot-starter-web안에 spring-boot-starter-logging의 logback이 기본적으로 포함되어 있어 별다른 dependency 추가 없이도 사용할 수 있다.

 

방법 1. 레벨 세팅

-application.properties

logging.level.kr.ac.hansung.cse = debug

 

Logback의 로그 레벨의 순서

TRACE  <  DEBUG  <  INFO  <  WARN  <  ERROR
  1. ERROR : 요청을 처리하는 중 오류가 발생한 경우 표시한다.
  2. WARN  : 처리 가능한 문제, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타낸다.
  3. INFO  : 상태 변경과 같은 정보성 로그를 표시한다.
  4. DEBUG : 프로그램을 디버깅하기 위한 정보를 표시한다.
  5. TRACE : 추적 레벨은 Debug보다 훨씬 상세한 정보를 나타낸다. 

 

info로 설정할 경우 info 이상의 레벨만 볼 수 있다.

-> logger.debug는 로그로 보이지 않게 된다.

 

-homeController.java

package kr.ac.hansung.cse.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {
	
	static Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	// @GetMapping is a composed annotation thia acts as a short cut for
	// @RequestMapping(value = "/", method = RequestMethod.GET);
	@GetMapping("/")
	public String home(Model model) {
		
		logger.debug("Calling home()");
		
		model.addAttribute("message", "hello world");
		return "index";
	}
	
}

 

실행했을 때 로그를 볼 수 있다.

 

방법 2. logback 설정 파일 생성

logback.xml 파일 생성

 

<configuration>

	<appender name = "STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n 
			</pattern>
		</encoder>
	</appender>

	<appender name="FILE" class="ch.qos.logback.core.FileAppender">
		<file>app.log</file>
		<encoder>
			<pattern> %date %level [%thread] %logger{10} [%file:%line] %msg%n
			</pattern>
		</encoder>
	</appender>

	<root level="INFO">
		<appender-ref ref="STDOUT" />
		<appender-ref ref="FILE" />
	</root>
	
	<logger name="kr.ac.hansung.cse" level="DEBUG" >
	</logger>
</configuration>

<logger name="kr.ac.hansung.cse" level="DEBUG" > </logger>

-> logging.level.kr.ac.hansung.cse = debug와 동일한 기능을 한다.

 

Logback-core에서 제공하는 appender를 활용하여 좀 더 정교하게 설정이 가능하다

 

Logback-core 에서 제공하는 appender

  • OutputStreamAppender
    java.io.OutputStream에 로그 이벤트를 append 한다.
    일반적으로 사용자들은 OutputStream을 쉽게 String으로 변환시킬 수 없기 때문에, 이 Appender를 직접적으로 사용하지 않는다.
  • ConsoleAppender
    콘솔에 System.out 또는 System.err를 이용하여 로그 이벤트를 append 한다.
    기본적으로 System.out을 사용한다.
  • FileAppender
    FileAppender는 파일에 로그 이벤트를 append 한다.

 

 

Logback - configuration 파일 구성

최상단 로거인 roor의 appener를 logger이 상속받는다

-> app.log라는 파일에 로그 메시지가 전부 저장이 된다.

 

FileAppender를 활용하여 app.log 파일이 생성된 것을 확인할 수 있다.

2022-08-21 22:21:26,059 INFO [main] k.a.h.c.HelloSpringBootApplication [StartupInfoLogger.java:55] Starting HelloSpringBootApplication using Java 1.8.0_181 on DESKTOP-K6G7LR6 with PID 8796 (C:\Users\MingCo\git\Web\helloSpringBoot\target\classes started by MingCo in C:\Users\MingCo\git\Web\helloSpringBoot)
2022-08-21 22:21:26,068 DEBUG [main] k.a.h.c.HelloSpringBootApplication [StartupInfoLogger.java:56] Running with Spring Boot v2.7.2, Spring v5.3.22
2022-08-21 22:21:26,069 INFO [main] k.a.h.c.HelloSpringBootApplication [SpringApplication.java:634] No active profile set, falling back to 1 default profile: "default"
2022-08-21 22:21:27,722 INFO [main] o.s.b.w.e.t.TomcatWebServer [TomcatWebServer.java:108] Tomcat initialized with port(s): 9000 (http)
2022-08-21 22:21:27,735 INFO [main] o.a.c.h.Http11NioProtocol [DirectJDKLog.java:173] Initializing ProtocolHandler ["http-nio-9000"]
2022-08-21 22:21:27,736 INFO [main] o.a.c.c.StandardService [DirectJDKLog.java:173] Starting service [Tomcat]
2022-08-21 22:21:27,737 INFO [main] o.a.c.c.StandardEngine [DirectJDKLog.java:173] Starting Servlet engine: [Apache Tomcat/9.0.65]
2022-08-21 22:21:27,990 INFO [main] o.a.c.c.C.[.[.[/] [DirectJDKLog.java:173] Initializing Spring embedded WebApplicationContext
2022-08-21 22:21:27,991 INFO [main] o.s.b.w.s.c.ServletWebServerApplicationContext [ServletWebServerApplicationContext.java:292] Root WebApplicationContext: initialization completed in 1827 ms
2022-08-21 22:21:28,205 WARN [main] o.s.b.a.s.s.UserDetailsServiceAutoConfiguration [UserDetailsServiceAutoConfiguration.java:88] 

...

ConsoleAppender를 활용하여 콘솔에 찍히는 로그들이 파일에도 저장된 것을 확인 할 수 있다.

 

 

 command 방식으로 Spring Boot 실행

 

스프링 부트 프로젝트를 생성하고 작업한 결과를 Eclipse나 IntelliJ같은 IDE에서 뿐만 윈도 메이븐을 설치하여 cammande방식으로 실행시킬 수 있다.

C:\Users\MingCo\git\Web\helloSpringBoot>mvn clean
C:\Users\MingCo\git\Web\helloSpringBoot>mvn package
C:\Users\MingCo\git\Web\helloSpringBoot>cd target
C:\Users\MingCo\git\Web\helloSpringBoot\target> dir
java -jar 생성된 jar 파일 실행

 

 

https://zetawiki.com/wiki/%EC%9C%88%EB%8F%84%EC%9A%B0_%EB%A9%94%EC%9D%B4%EB%B8%90_%EC%84%A4%EC%B9%98

 

윈도우 메이븐 설치 - 제타위키

 

zetawiki.com

 

 

 

각각의 phase에서 plugin이 수행되어 빌드와 배포가 가능하게 된다.

 

 

 

 

 


https://dololak.tistory.com/632

 

[Logback] Logback이란? log4J의 후속작 로그백(Logback) 살펴보기 및 비교

다음글 [Logback] 로그백(logback) 다운로드 및 사용해보기 Logback이란? 어떤 어플리케이션이든 실제로 사용자에게 판매 배포되는 경우 분석이 필요할때가 있고 개발자는 로그(기록)을 분석합니다. 예

dololak.tistory.com

https://ckddn9496.tistory.com/81

 

Logback - 4. Appenders (1). ConsoleAppender, FileAppender

logback 홈페이지의 매뉴얼을 읽으며 내용들을 정리한 글입니다. Appender란? Logback은 로그 이벤트를 write 하는 작업을 Appender에게 위임(delegate)합니다. Appender로 이용되기 위해서는 반드시 아래의 ch.q.

ckddn9496.tistory.com

https://www.fwantastic.com/2019/12/javautillogging-vs-log4j-vs-slf4j.html

 

자바 java.util.logging vs log4j vs slf4j? 어떤 것을 사용해야 할까?

 

www.fwantastic.com

https://cofs.tistory.com/354

 

Log4j의 정의, 개념, 설정, 사용법 정리

* Log4j 1에 대해서 가볍게 정리한 문서입니다. * Log4j 2는 일부 내용이 변경되었을 수 있습니다.  * 요약 * Log4j 정의 Log4j 특징 Log4j 구조 Log4j 레벨 Log4j Pattern Option Log4j 주요 클래스 Log4j 설정..

cofs.tistory.com

https://goddaehee.tistory.com/206

 

[스프링부트 (5)] Spring Boot 로그 설정(1) - Logback

[스프링부트 (5)] Spring Boot Log 설정(1) - Logback 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ 스프링 부트 Log 설정 - 로그백] 입니다. : -) 1. Logback 이란? 특징?  - 자바 오픈소스 로깅 프레임..

goddaehee.tistory.com

Maven을 이용한 빌드와 배포 (velog.io)

 

Maven을 이용한 빌드와 배포

201203 maven 보강

velog.io

[log4j] log4j.xml 설정 : Logger 위계구조, 로그 분리하기 (tistory.com)

 

[log4j] log4j.xml 설정 : Logger 위계구조, 로그 분리하기

※ 들어가기에 앞서, Spring Framework, maven, jboss(wildfly) 환경에서 log4j설정하는 법은 이곳을 참고. log4j.xml 파일을 아래와 같이 설정한다. ※ pom.xml 및 기타 설정은 되어있다 가정 [log4j.xml] 1 2 3..

developyo.tistory.com

Logback - 3. Logback의 설정 (2). configuration 파일 구성 (tistory.com)

 

Logback - 3. Logback의 설정 (2). configuration 파일 구성

logback 홈페이지의 매뉴얼을 읽으며 내용들을 정리한 글입니다. Configuration 파일 문법 Logback은 코드를 재 컴파일하지 않고도 logging에 대하여 재 구성할 수 있습니다. Logback의 configuration 파일은 매..

ckddn9496.tistory.com

 

'Study > SpringBoot' 카테고리의 다른 글

[SpringBoot] REST API  (0) 2022.10.02
[SpringBoot] 다양한설정  (1) 2022.09.20