
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
주소 요청시 인증이 되지 않은 모든 사용자를 가로채서 redirection함
config : configuration. 환경설정
WebSecurityConfigurerAdapter :
@Configuration : Ioc에 등록하기 위해
@EnableWebSecurity : 해당 파일로 시큐리티를 활성화
antMatchers : 해당은 인증이 필요
anyRequest : 나머지 접근 허용
formLogin : 로그인폼이다
loginPage : 로그인으로 가게 하겠다
defaultSuccessUrl : 성공하면 이곳으로
f12에서 status 302번 : 재요청(redirection)
클라이언트가 요청을 보내면 시류리티 CSRF 토큰 검사를 한다.
응답시 CSRF를 달아서 돌려보낸다. 그 후 요청을 하면 보내준 CSRF 토큰이 있는지
검사한다. 이 프로젝트는 번거로운 CSRF 토큰을 해제시킨다.
http.csrf().disable(); // 토큰 해제
SecurityConfig.java 에 넣어준다.
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity // 디비에 테이블을 생성
public class User {
@GeneratedValue(strategy = GenerationType.IDENTITY) // 번호 증가 전략이 데이터베이스를 따라간다.
@Id
private int id;
private String username;
private String password;
private String name;
private String website; // 웹 사이트
private String bio; // 자기소개
private String email;
private String phone;
private String gender;
private String profileImageUrl; // 사진
private String role; // 권한
private LocalDateTime createDate;
@PrePersist // 디비에 INSERT 되기 직전에 실행
public void createDate() {
this.createDate = LocalDateTime.now();
}
}
@Builder : 필요한 데이터만 설정
@RequiredArgsConstructor : final에 대한 생성자를 만들어줌
JpaRepository : Ioc 자동등록
@Transactional : 일련의 작업들을 묶어서 하나의 단위로 처리. Write(Insert, Update, Delete)
@Column(unique = true) : 유니크 제약조건 추가
BCryptPasswordEncoder : 암호화 해주기

db까지 뒤져보지 않아도 앞단에서 확인 가능하므로 앞에서 처리. 전처리를 유효성검사(validationcheck) 로 처리하자
++ 프론트에서만 막아도 되지만
<input required="require" /> // 이런 식으로
프론트단이 아닌 다른데서 회원가입 요청할 수 있으므로 백에서도 막아줘야함(후처리)
db에서 확인해야함.
후처리를 exceptionhandler로 처리
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.4.4</version>
</dependency>
그 후 dao, dto 쿼리에 어노테이션을 넣어줌으로써 벨리데이션 기능을 사용할 수 있다.
CMRespDto.java 를 만들어주고
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CMRespDto<T> {
private int code; // 1(성공), -1(실패)
private String message;
private T data;
}
ControllerExceptionHandler.java 의 예외핸들러에 가서
@ExceptionHandler(CustomValidationException.class)
public CMRespDto<?> validationException(CustomValidationException e) { // <?> : 알아서 찾아감
return new CMRespDto<Map<String,String>>(-1, e.getMessage(),e.getErrorMap());
}
제너릭을 이용해
{
"code": -1,
"message": "유효성 검사 실패",
"data": {
"password": "공백일 수 없습니다",
"name": "공백일 수 없습니다",
"email": "공백일 수 없습니다",
"username": "크기가 2에서 20 사이여야 합니다"
}
}
이러한 형태로 만들어낸다.
Script.java 파일을 만들고
public class Script {
public static String back(String msg) {
StringBuffer sb = new StringBuffer();
sb.append("<script>");
sb.append("alert('"+msg+"');");
sb.append("history.back();");
sb.append("</script>");
return sb.toString();
}
}
ExceptionHandler 값을 Script로 처리해 줌
@ExceptionHandler(CustomValidationException.class)
public String validationException(CustomValidationException e) { // <?> : 알아서 찾아감
// CMRespDto, Script 비교
// 1. 클라이언트에게 응답할때는 Script가 좋음 --> 클라이언트가 응답받음
// 2. Ajax통신 - CMRespDto --> 개발자가 응답받음
// 3. Android 통신 - CMRespDto --> 개발자가 응답받음
return Script.back(e.getErrorMap().toString());
}