SNS 포토그램 만들기 (회원가입)

송용준·2023년 4월 15일
post-thumbnail

SecurityConfig 생성

		<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)

CSFR 토근 해제

클라이언트가 요청을 보내면 시류리티 CSRF 토큰 검사를 한다.
응답시 CSRF를 달아서 돌려보낸다. 그 후 요청을 하면 보내준 CSRF 토큰이 있는지
검사한다. 이 프로젝트는 번거로운 CSRF 토큰을 해제시킨다.

http.csrf().disable();	// 토큰 해제

SecurityConfig.java 에 넣어준다.

User 모델 만들기

@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 : 암호화 해주기

회원가입 전/후 처리. 관점지향처리(AOP)(Aspect Oriented Programming)

- 회원가입시 길이 제한

db까지 뒤져보지 않아도 앞단에서 확인 가능하므로 앞에서 처리. 전처리를 유효성검사(validationcheck) 로 처리하자
++ 프론트에서만 막아도 되지만

<input required="require" />	// 이런 식으로

프론트단이 아닌 다른데서 회원가입 요청할 수 있으므로 백에서도 막아줘야함(후처리)

- 회원가입시 중복

db에서 확인해야함.
후처리를 exceptionhandler로 처리

유효성 검사하기

  • pom.xml의 dependency부분에 벨리데이션 기능을 넣어준다.
		<dependency>
          <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-validation</artifactId>
		    <version>2.4.4</version>
		</dependency>

그 후 dao, dto 쿼리에 어노테이션을 넣어줌으로써 벨리데이션 기능을 사용할 수 있다.

@ResponseBody 사용하기

  • @ResponseBody : 데이터를 응답받는곳 지정

글로벌 예외처리 하기

  • throw new RuntimeException : 오류 발생시 RuntimeException 터트림
  • @ControllerAdvice : 오류들 낚아챔
  • @ExceptionHandler : Exception 낚아챔
  1. 유효성 검사 실패시 AuthController에 BindingResult에 담김
  2. bindingResult 발생시 errorMap에 담김
  3. 그 후 CustomValidationException 발생
  4. @ExceptionHandler가 낚아채는데 CustomValidationException에서 값을 받음
  5. CustomValidationException는 errorMap과 message(부모에게 떤짐)를 보내줌

공통 응답 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 만들기

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());
	}
profile
용용

0개의 댓글