본문 바로가기

전체 글

(197)
토큰(Token) 방식과 세션(Session) 방식 1. 인증(Authentication)과 인가(Authorization)인증(Authentication)은 사용자가 서비스에 등록되어 있는지 검증하기 위해 사용된다. 예를 들어, 사용자가 입력한 정보가 서비스에 등록되어 있다면 인증된 사용자라고 할 수 있다.인가(Authorization) 는 인증이 완료된 사용자가 서버에서 보호하고 있는 자원에 접근할 수 있는지 권한을 확인하는 과정이다. 먼저 인증이 되어야만, 인가 여부를 확인할 수 있다. 예를 들어, 게시판에 글을 작성하는 것은 로그인 된(인증된) 사용자(USER, ADMIN)라면 누구나 할 수 있지만, 관리자 페이지에 접근하는 것은 관리자 권한(ADMIN)이 있는 사람만 가능할 것이다. 인증(Authentication), 인가(Authorizatio..
[Spring-Security] JWT 검증 시에 발생하는 예외는 ExceptionHandler에서 처리할 수 없다. 1. 내가 기대했던 결과사용자가 Authorization 헤더에 Bearer 타입의 Access Token을 담아서 서버로 요청한다.서버에서 Access Token을 받아서 만료된 토큰인지 검증한다.만료된 토큰이라면 ExpiredJwtException 예외를 발생시킨다.@ExceptionHandler를 사용하여 예외를 핸들링한다.JWT 토큰을 검증하는 FilterdoInternal()에서 사용자의 요청을 가로챈다.HttpServletRequest에서 1-1에서 담은 Access Token을 가져온다.try문에서 parseToken()를 호출한다.validateToken()를 통해 토큰을 검증한다.이때, 토큰이 만료되었는지 확인한다.토큰이 만료되었다면 ExpiredException 예외가 발생한다.try-..
[Spring] Code Deploy 사용 시에 환경변수가 적용되지 않는 문제 1. 프로젝트 환경Java 17SpringBoot 3.3.2Code Deploy기반 CI/CD 2. Code Deploy는 .bashrc 파일을 사용하지 못한다.CI/CD 파이프라인 구축을 위해 Code Deploy를 사용하였고, 빌드된 파일을 AWS EC2에서 실행하기 위해 .bashrc 파일에 환경변수 값을 등록하였다. EC2의 .bashrc에 환경변수를 등록하였으므로 빌드된 파일을 실행시켰을 때, 문제가 없을 것이라 생각했습니다. Github으로 코드를 push 하면 사진과 같이 문제없이 EC2로 jar 파일이 배포됩니다. AWS EC2의 .bashrc에 prod 환경에서 필요한 환경 변수 값을 저장하였고, 스프링 애플리케이션 실행 시에 사용하기를 기대하였습니다.  그러나… 스프링 애플리케이션 실행..
[Java] LockSupport와 ReentrantLock 1. LockSupport1-1. LockSupport란?synchronized의 경우 임계 영역에 접근하지 못하고 대기 중인 스레드는 BLOCKED 상태가 된다. BLOCKED 상태는 다른 스레드에 의해 interrupt 될 수 없기 때문에 lock을 얻지 못하면 영원히 대기 상태로 유지한다.LockSupport는 무한 대기를 해결하기 위해서 대기 중인 스레드의 상태를 BLOCKED가 아닌 WAITING 이 되게 한다. WAITING 상태는 다른 스레드가 interrupt를 통해 깨우거나, 스스로가 시간을 정하여 깨어날 수 있다.1-2. LockSupport의 대표적인 기능park() : 현재 스레드를 WAITING 상태로 바꾼다.parkNanos(nanos) : 나노초 동안 현재 스레드를 TIMED_..
전공자의 정보처리기사 실기 1주일만에 합격하기 (94점 / 100점) 저는 컴퓨터공학 4학년 학부생이며 2024년도 2차 정기 기사 시험을 쳤습니다.   일주일 동안 어떻게 공부를 했는지 공유해보겠습니다.1. 공부 기간을 너무 길게 잡지 말자.저는 실기가 아닌 필기를 공부할 때 3주를 학습하였습니다. 당시에는 뭐가 그렇게 불안했는지 정보처리기사에서 요구하는 모든 내용을 완벽하게 이해해야겠다는 압박감이 있었습니다. 그래서 긴 시간을 잡고 공부를 하였는데, 막상 하다 보니 "아직 시간이 많이 남았으니 내일부터 하자", "이 내용은 나중에 하자" 이런 식으로 미루는 제 자신을 보았습니다. 이러한 경험을 바탕으로 실기를 칠 때는 준비 기간을 확 줄여서 한 번에 집중해서 끝내자 했던 것 같습니다. 물론 컴퓨터공학 지식이 부족한 경우 좀 더 기간을 잡으시는 게 좋을 것 같습니다...
[Spring] java.lang.NullPointerException: save(...) must not be null 1. Mock 테스트를 위한 라이브러리 추가Mock 테스트를 위하여 gralde에 아래를 추가하였다.// MockitotestImplementation("org.mockito.kotlin:mockito-kotlin:4.0.0")testImplementation("org.mockito:mockito-core:4.0.0")testImplementation("org.junit.jupiter:junit-jupiter:5.8.2") 2. 서비스 레이어 작성게시물을 작성하는 코드를 작성한다.@Service@RequiredArgsConstructorclass DiaryService( private val diaryRepository: DiaryRepository) { @Transactional fun..
[Spring-Security] @AuthenticationPrincipal 객체에 null이 저장되는 문제 1. 오류 발생 흐름1-1. 사용자가 로그인을 한다.로그인이 완료된 사용자의 인증 정보가 SecurityContext에 저장된다.1-2. 인증된 사용자가 HTTP 요청을 한다.인증이 완료된 사용자는 페이지를 이동하면서 HTTP 요청을 보낸다. 게시물 작성 페이지로 이동하기 위해서는 인증이 완료된 사용자이어야 하며, 더불어 작성 완료하기 위해서 또한 인증이 완료된 사용자이어야 한다.1-3. HTTP 요청 시에 인증된 사용자 정보를 가져올 수 없다.사용자가 게시물 작성 버튼을 누르면 인증 정보를 가져올 수 없다는 에러가 발생한다.아래 코드를 보면 createPost()의 매개변수에 @AuthenticationPrincipal 애너테이션을 사용하여 인증된 사용자 정보를 주입받고자 한다. 그러나 HTTP 요청이..
[Kotlin] The following declarations have the same JVM signature 1. 오류 원인Kotlin은 컴파일 시에 자바 바이트코드(.class)로 변환되기 때문에 다른 자바 파일과 호환이 되고 JVM에 의해 실행된다. 오류 메시지를 보면 JVM 시그니처가 충돌했음을 알 수 있다. 아래 코드를 보면 4개의 프로퍼티(email, password, nickName, authorities)가 존재한다. 코틀린 컴파일러는 프로퍼티에 대해서 자동으로 getter와 setter를 생성한다. 따라서 password와 authroties 프로퍼티에 대해서도 자동으로 getter가 생성된다. 여기서 한 가지 문제점이 발생하는데 현재 코드에는 UserDetails을 상속하면서 getPassword(), getAuthorities()를 오버라이딩하고 있다. 코틀린 컴파일러에 의해 자바 바이트 코드..