목록프로그래밍 (408)
쌓고 쌓다
다른 친구가 앱을 만들고 나는 API 서버를 구축하고 있는데 친구가 API 요청시 정상적인 응답을 못주는 상황을 발견했다. 서버에서 요청을 처리하는 코드는 다음과 같다. @PostMapping(value = "/locations/{locationId}/posters") public ResponseEntity addPoster(@Valid @RequestPart PosterRequest posterRequest, @RequestPart(required = false) List files, @PathVariable Long locationId, @AuthenticationPrincipal(expression = "member") Member member) throws IOException {...} Mult..
시큐리티 설정을 통해 인증, 인가 설정을 할 수 있다. 이제 이 인증, 인가에 실패했을 경우에 JSON 예외 응답을 보내보자. SecurityConfig.java http.exceptionHandling(e -> e .authenticationEntryPoint(new JwtAuthenticationEntryPoint()) .accessDeniedHandler(new JwtAccessDenyHandler())); exceptionHandling을 통해 예외를 처리할 로직은 시큐리티에 등록할 수 있다. 인증 예외는 AuthenticationEntryPoint 인터페이스를 구현하여 등록할 수 있고 인가 예외는 AccessDeniedHandler 인터페이스를 구현하여 등록할 수 있다. 먼저 Enum 타입으로 ..
에러 메시지를 보다 깔끔하게 관리하고 응답으로 보낼 수 있는 방법으로 Enum 타입이 있다. 먼저 Enum 타입을 보자. ErrorCode package com.example.spotserver.exception; import lombok.Getter; import org.springframework.http.HttpStatus; @Getter public enum ErrorCode { DUPLICATE_LOGINID(HttpStatus.CONFLICT,"중복된 아이디가 존재합니다."), DUPLICATE_NAME(HttpStatus.CONFLICT, "중복된 닉네임이 존재합니다."), FAIL_LOGIN(HttpStatus.UNAUTHORIZED, "아이디 또는 비밀번호를 잘못 입력했습니다."), NO..
API 서버를 만들며 유효성 검사와 예외 응답에 대한 방법을 고민하다가 생각해낸 방법이다. 먼저 유효성 검사를 쉽게하기위해 spring-boot-starter-validation를 build-gradle에 추가해주자. implementation 'org.springframework.boot:spring-boot-starter-validation' 유효성 검사 간단하게 입력하지 않은 경우의 유효성 검사만 보이겠다. 그 외 다양한 유효성 검사 어노테이션은 찾아보길! 먼저 회원가입시 컨트롤러에서 MemberRequest를 파라미터로 받는다. MemberRequest 클래스는 다음과 같으며 미입력을 방지하고자 미입력을 검사할 필드에 @NotEmpty 어노테이션을 붙인다. @ToString @Setter publ..
Entity 자체를 요청과 응답을 처리하는데 그대로 사용하니 다음과 같은 문제 또는 비효율적인 부분이 발생했다... 먼저 회원 엔티티를 보자. @Entity @Data public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String loginId; private String loginPwd; private String name; @Enumerated(EnumType.STRING) private Role role; @CreationTimestamp private LocalDateTime regDate; @Enumerated(EnumType.STRING) private Memb..
"/login"으로 로그인을 시도하여 System.out.println("로그인 시도한 pwd = " + member.getLoginPwd()); String encodePwd = bCryptPasswordEncoder.encode(member.getLoginPwd()); System.out.println("로그인시 입력한 비밀번호를 인코딩한 결과 = " + encodePwd); 인코딩된 비밀번호 로그를 출력해보았다. 로그인 시도한 pwd = 1234 로그인시 입력한 비밀번호를 인코딩한 결과 = $2a$10$Jr8A352R8VZcfnN/SP5vCubnL2TZSUm4FSNioawR.VZ5X7i2kvldu 로그인 시도한 pwd = 1234 로그인시 입력한 비밀번호를 인코딩한 결과 = $2a$10$Vf/peA..
컨트롤러에서 인증된 회원 정보를 어떻게 받아서 게시글을 쓰고 수정하고 삭제 등등을 할까? 싶었다. 다음과 같은 방법이 있었다. 1. SecurityContextHolder에서 꺼내기 @GetMapping("/get1") public String get1() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); PrincipalDetails principal = (PrincipalDetails) authentication.getPrincipal(); TestUser testUser = principal.getTestUser(); System.out.println("[1] testUser = " + t..
Authentication(인증) : 누구인지 확인하는 절차로 실제 사용자가 맞는지 로그인하는 과정이라고 생각하면 된다. Authorization(권한부여) : 인증된 사용자에 대해 특정 리소스에 접근이 가능한 권한을 부여하거나 확인하는 과정이다. build.gradle implementation group: 'com.auth0', name: 'java-jwt', version: '4.4.0' JwtProperties.java package com.example.spotserver.config.jwt; import org.springframework.beans.factory.annotation.Value; public class JwtProperties { @Value("${jwt.secrectKey}"..