Security

gyeorrr·2024년 3월 31일

Security

로그인할 때 필요하며, 인증 과 권한을 다루는 프레임워크다

로그인 또는 회원가입 할 때 유저정보가
다 db에 들어갈 텐데 그 데이터를 다룰 때 비밀번호 같은 경우엔 암호화를 해줘야함 그런것들을 도와줄거임
그외에 유효성검사 , 권한설정 , provider 구글 ,네이버 로그인 같은것도..


세팅 우선순서

  1. yml
  2. html 파일구성
  3. page controller 만들고 구성
  4. config 페이지 컨트롤러 양식에 맞춰서 구성하고 시작하기
    (어노테이션 enableWebsecurity 나중에 달아보기)
  5. 프린시펄디테일서비스 에서 구현 (UserDetailsService) —> 설정 맞춰주고
  6. 핸들러 만들기(예외처리)
  7. xml은 만듬과 동시에 동기화 연결해줘야 오류가 해결된다
    → 보드 → 레포지토리 → xml 순으로 구성하자

Defendency

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1'
	implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.3.1'
	testImplementation 'org.springframework.security:spring-security-test'
}

이니셜라이저로 다운할 때 security 추가해놓고 작업할 땐 xml이건 , security건 방해되는 건 주석처리 해놓고 작업 후에 주석풀면서 진행하기

오류뜬다
※ spring boot 2.7.5 버전으로 진행해야 함
(기본버전이 상향됨으로 인해서 시큐리티 무료버전사용불가이슈)
boot starter 2.3.1
starter test 2.3.1
이렇게 해도 그래들은 X 표시되지만 서버는 돌아간다

기본 PageController

로그인 후 연결될 페이지 , 로그인페이지 , 회원가입 페이지

@Controller
Public Class Pagecontroller{

	@GetMapping({"/","/index})
	public String loadIndex(){
	return "index";
    }
	@GetMapping("/auth/signin")
	public String loadSignin() {
		return "auth/signin";
	}
	@GetMapping("/auth/signup")
	public String loadSignup() {
		return "auth/signup";
	}
}

파일 구성의 경우 return을 보고 경로 추측가능
auth가 붙은 건 templates/auth패키지 안에 들어있는거임
안 붙어있는 건 그냥 templates에 있는 거


YML설정

server:
  port: 8000
  servlet:
    encoding:
      charset: UTF-8
      enabled: true
      force: true
      force-request: true
      force-response: true
  tomcat:
    uri-encoding: UTF-8
spring:
#  security:
#    user:
#      name: user 
#      password: 1234
  mvc:
    static-path-pattern: /static/**
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://
    ⏩️AWS의RDS 엔드포인트 및 포트/데이터베이스명⏪️?useUnicode=true&characterEncoding=UTF-8
    username: ⏩️db아이디 
    password: ⏩️db비밀번호
    
mybatis:
  mapper-locations:
  - /mappers/*.xml

자동완성으로 넣을거임 복붙 해도 됨 그러고 url이랑 password만 신경쓰자


패지키 구성

config

AuthFailerHandler → 계정정보가 틀렸을 때 웹에서 오류 띄워주는 곳

⭐️SecurityConfig → 시큐리티 구성 설정하는 곳 로그인할 url 설정 로그인 성공 후 띄워줄 url
실패하면 Failer로 연결해주기

@Configuration 환경설정 파일이라고 지정 ,
@EnableWebSecurity 모드 요청 url이 스프링 시큐리티의 제어를 받도록 만든 어노테이션
(사용자설정으로 만들어주는 것) 
기존 어댑터 비활성화 하고 해당 config 활성화 하는 거

extends WebSecurityConfigurerAdapter
커스텀할 수 있게 상속 받기

http.csrf().disable(); → 비활성화 됨

http.authorizeRequests(); 
요청이 들어왔을 때 인증을 거치라는 의미 
후에 메소드체이닝 마이페이지에오는 모든것들을 /**로 걸어줌 ( 로그인절차를 거치게 함 )

CSRF: http 요청을 보냈을 때 csrf 공격이 있으니까 토큰값을 부여해서 보안을 지키는 거
토큰값 : UUID
403에러가 발생하는 이유는 CSRF기능이 동작해서이다
그래서 일단 비활성화 걸어두기 작업하기

세션 : 기본적으로 응용프로그램에 로그인 되어있으나 새로운 동작, 이벤트 발생시에 관한 것
( 로그인 만료시간 동작 같은 거)

config기본작성양식(예시)

.loginProcessingUrl 아래에 작성
.failureHandler(new AuthFailerHandler()) // 로그인 오류시에 처리될 곳

(configure)메서드 시작전에 적어주기(비밀번호 암호화 복호화 메서드)

@Bean
public BCryptPasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
        }
→ 비밀번호를 암호화해주는 것 → 그리고 서비스(구현) 에서 해당 비밀번호가 맞으면 복호화

userDetailService에서 복호화 진행하도록 작성해주기


HTML

loginProcessingUrl → 컨트롤러 역할 html에서 action “url”로 연결만 해주면 알아서 찾아감
형식 form태그 참고하기


domain.user

User → user의 데이터가 담길 곳
UserRepository → 유저데이터들을 xml로 오갈곳


handler(aop,exception)

데이터유효성 오류처리 할 곳
어노테이션 만들 곳(Log , Timer)
예외 , 아이디 비번 맞지않거나 오류가 터질 때 모든걸 모아서 해결해줄 곳 → 핸들러 만들어줌
AuthFaillerHandler 오류처리 뷰

aop

커스텀 annotation 만들어주는 곳
필수 어노테이션
@Aspect
@Component

private final Logger LOGGER = LoggerFactory.getLogger(getClass());

@Pointcut("execution(* com.securitysecond.securitysecond.web.controller..*..*(..))")
	private void pointCut() {}
    
@Pointcut("@annotation(com.securitysecond.securitysecond.handler.aop.annotation.Log)")
	private void enableLog() {}
	
	@Around ("enableLog()")

Logger 생성자느낌
Pointcut 어떤 동작될건지 지시해주는 거? 동작되는 경로를 맞춰주는 거?
@Around / @Before ,@AfterReturning 동작할 타이밍 잡아주는 거

exception


service.auth

PrincipalDetails → 서비스에서 받은 데이터를 커스텀해주는 곳 / 권한부여?(Granted) 관련도 같이 해줌

PrincipalDetailsService → 기본 서비스레이어 역할(로직처리)을 하고 만들어진 데이터를 Details로 보내줌
구현하면 loadUser 메소드 오버라이딩 됨 그 안에서 모든 DB필드를 username에 맞춘 걸 불러오는 쿼리문이랑 연동된다

authService / impl → 단순하게 username만을 db로 보낼 때 사용 (중복검사)


web.controller(api),dto

Controller

PageController 뷰
RestController 데이터 통신
GrantController 유저의 권한 관련 컨트롤러

AuthController 기존에 쓰던 것처럼 받아오는 서비스 컨트롤러

signupReqDto로 값을 받아서 toEntity로 구성해준다

어스 컨트롤러는 PrincipalService , AuthService 둘다 선언(의존성주입) 함

값을 보낼 땐 PrincipalService
읽을 땐 AuthService

Dto

데이터 유효성 검사할 SignupReqDto
단지 id만을 검사 할 UserNameCheckDto
데이터를 꾸며서 보내줄 CMResponseDto


0개의 댓글