분류 전체보기 174

[스프링] 8. JWT를 구현하기. 1단계: 일단 JWT를 위한 토큰을 만들자. (2)

이전에 정리해두었던 TokenProvider의 기능들을 정리해보려고 한다. 일단 생성자! public TokenProvider(@Value("${jwt.secret}") String secretKey) { byte[] keyBytes = Decoders.BASE64.decode(secretKey); this.key = Keys.hmacShaKeyFor(keyBytes); } @Value에서 jwt.secret는 application.yml에서 가져오는 것이다. jwt: secret: 이런식으로 되어있을 때, secret: 뒤에 사용할 키를 적으면 된다. 이전 페이지에서 정리를 간단히 했던 것 같은데, 그게 전부라 설명은 스킵! public TokenDto generateTokenDto(Authentica..

[스프링] 7. JWT를 구현하기. 1단계: 일단 JWT를 위한 토큰을 만들자. (1)

기본적인 스웨거와 CORS에 대한 처리를 완료했다. 이제 JWT(Json Web Token)를 만들어주고, 멤버 로직을 짜기 시작해야 한다. JWT를 정리한 내 순서는 TokenProvider, TokenDto 예외처리들 JwtFilter Filter를 SecurityConfig에 넣기 의 과정으로 정리할 것이며, 일단 토큰에 대해서 코드를 정리해봐야 겠다. 그럴려면, 일단 토큰이 있어야지! @Getter @NoArgsConstructor @AllArgsConstructor @Builder public class TokenDto { private String grantType; private String accessToken; private String refreshToken; private Date a..

[이론정리] Json Web Token

진짜 어디든 있는 JWT, Json Web Token에 대해서 간단하게 정리를 해보려고 한다. 모든 내용은 JWT 공홈 설명에서 발췌했다. JWT란 무엇인가? Json Web Token, 이하 JWT란 일종의 전자 서명으로 사용자가 직접 가지고 있는 컴팩트한 토큰이다. 전자서명처럼 어떤 사용자인지 JWT를 통해 알 수 있다. HMAC알고리즘을 사용하며, RSA나 ECDSA같은 공개키와 개인키를 이용한 암호화가 이루어져 있다. JWT를 통해 그 속에 담긴 안에 있는 claim(주장, 혹은 내용)의 무결성을 검증할 수 있다. 비대칭키(공개키와 개인키가 서로 다르지만 이를 토대로 암호화, 복호화가 되는) 암호화를 통해 토큰이 만들어졌을 때, 해당 사용자만 토큰을 토대로 인증을 할 수 있게 한다. JWT를 언제..

[스프링] 6. SecurityUtil 예외처리를 커스텀 해보자(부제: 2단계, 리스폰스를 이용해 예외처리하기)

이렇게 예외를 따로 만들었으며, 이를 통해 예외처리를 조금 더 직관적이게 만들 수 있었다. 일단, 이전에 만들었던 것을 어떻게 이용할 것인가? Exception이라는 것은 결국, Response에서 요청에 대해 실패했음을 알려주어야 한다. 결국, Response.failure를 반환하게 되는 것이다. 이를 어떻게 활용하는 것일까? @RestControllerAdvice public class ExceptionAdvice { @ExceptionHandler(NeedToLoginException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public Response needToLoginException(){ return Response.failure(403, "인증이 되..

[스프링] 5. SecurityUtil 예외처리를 커스텀 해보자(부제: 1단계, Response만들어주기)

public static Long getCurrentMemberId(){ Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if(authentication == null) throw new NeedToLoginException(); if(authentication.getName() == null) throw new NotRightAuthenticationException(); return Long.parseLong(authentication.getName()); } 이전의 SecurityUtil에서 이렇게 만들어, 각 에러 상황에 대해 다른 결과로 예외를 만들기 위해 코드를 조금 다듬었다. 일단 우..

@뭐시깽이Constructor

프로젝트를 만들다보면, 필요에 따라 AllArgsConstructor, RequiredArgsConstructor, NoArgsConstructor를 보게된다. 이에 대해 머리를 한번 정리하고 가야할 필요가 있다고 생각이 들어서, 하나씩 정리를 해보려고 한다. @AllArgsConstructor 클래스의 모든 인스턴스를 가지는 생성자를 자동적으로 만들어주는 역할을 한다. @RequiredArgsConstructor AllArgsConstructor와 비슷하게 모든 인스턴스를 가지는 생성자를 자동적으로 만들어주지만, @NonNull과 같은 특별한 제약조건을 가지게 되며, 이러한 조건들을 지키기 않을 경우 Exception을 던진다. @NoArgsConstructor 변수 없는 생성자를 만들어준다. 그런데,..

정적 변수, 메서드, 클래스, static static static

자바 프로젝트를 새로 만들면 항상 보이는 놈이 있다. public static void main(String[] args) { SpringApplication.run(BoardUpgradedApplication.class, args); } 이런식으로 존재하는 static 메서드가 존재한다. 근데 우리가 만드는 일반적인 클래스, 메서드, 변수들은 public class BoardUpgradedApplication 이런식으로 static이 아닌 클래스, 메서드, 변수를 쓴다. 이렇게 static이 붙은 것들을 '정적'을 앞에 붙여 부른다. 정적 클래스나 이런 것들의 특징이 무엇일까? static이 붙은 것들은 상위 객체와 수명을 같이한다. 즉, static클래스는 프로젝트와 시작과 끝을 같이하고, stati..

개발공부/자바 2023.01.02

@JsonInclude

백엔드를 공부해본 사람은 알 것이다. 모든 프로젝트의 데이터는 Json 타입으로 넘어간다. 그래야 프론트엔드에서 이를 받아 출력문을 만들기 수월해진다. 이렇게 Json타입으로 넘어가는 데이터를 관리하는데에 쓰이는 어노테이션중 하나가 JsonInclude이다. 객체에 데이터가 존재하고, 이 객체가 Json타입으로 넘어가 인스턴스들을 데이터로 가지고 프론트엔드로 간다. 이 때, 넘어가는 데이터에 Json으로 어떤 것들이 넘어가는지를 정할 수 있다. 그러면 어떻게 그 데이터들을 정할 수 있을까? @JsonInclude가 없고 해당 객체의 데이터를 프론트엔드로 넘기면, 데이터가 어떤 상태건 모든 데이터가 Json으로 프론트엔드로 넘어간다. 이 때 어노테이션과 괄호에 추가 설정을 통해 어떻게 데이터를 넘길지 정할..

[스프링] 4. SecurityConfig에 대한 유틸 추가하기

저번 게시글까지 SecurityConfig를 만들고, 이에 대해 간단한 설정을 해두었다. 문제는, 모든 과정이 시큐리티 필터 체인에 맞게 돌아가지 않을 수 있다. 사진을 보면 인증정보, 즉 Authentication은 SecurityContextHolder에서 SecurityContext를 찾아, 그 속에서 Authentication을 가져와 확인하게 된다. 즉, 우리(서버)가 사용자(클라이언트)에게 토큰을 주었을 때, 그 토큰을 그대로 저장하는 것이 아닌, 그 토큰에서 우리가 필요한 정보를 가져와 이를 확인하는 방식이다. 또한, 이 토큰은 암호화되어있는게 기본적인 약속이다(털리면 위험하니까) 그렇다면, 우리는 토큰을 검증할 때 어떻게 해야할까? 복호화 -> 필요한 정보 가져오기 -> 정보가 있는지 확인..

@Log(@Slf4j를 써보다가 궁금해서 찾아본 내용 정리)

이게 뭘까? 사실 다른 어노테이션들은 이름을 보면 간단하게 뜻을 유추해볼 수 있거나, 구글링해야할 단어들을 명확히 알 수 있다. 그런데 이건 진짜 모르겠다. 그대로 복사해서 구글링을 해보기도 했다(진짜 별다줄이라는 말이 괜히 있는게 아니다) 근데, 구글링 하기 전에 항상 들어가보는 곳이 있다. package lombok.extern.slf4j; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Causes lombok to generate a logger fi..