Web
Access Token의 취약점과 Refresh Token을 어떻게 써야하는지
Access Token의 취약점 Access Token은 암호화 보다는 서명에 초점을 맞춘 토큰이므로 탈취 당할 위험성이 있다. 보통 Access Token에는 중요한 정보를 담지 않아서 탈취당하더라도 별 문제가 없다. 그러나 서비스 이용자에게 권한을 부여하는 경우에는 문제가 될 수 있다. Access Token은 발급된 이후 서버에 저장되지 않고 토큰 자체로 검증을 하여 사용자 권한을 인증하므로, 기한이 만료되기 전 까지 토큰을 탈취한 사람은 권한 접근이 가능해진다. Access Token은 발급한 후 삭제가 불가능하므로 토큰 유효기간을 짧게 설정하는 것이 해결책이 될 수 있지만, 그만큼 사용성이 떨어지는 단점이 있다(새로 Token을 발급받기 위해 로그인을 자주 해야함). ⇒ Access Token의..
비밀번호 암호화 함수로 Bcrypt를 사용하는 이유
비밀번호 암호화를 할 시 bcrypt를 추천하는 글들이 많았다. 스프링에서도 BCryptPasswordEncoder 사용을 권장하는데, 왜 그런지 궁금해서 찾아보았다. 해시 함수의 취약점 SHA, MD5 등의 해시 함수는 메시지 송수신시 무결성 검사를 위해 개발되었으며 이로 인해 빠른 처리속도로 보안에 취약하다(GPU를 사용하면 레인보우 테이블을 매우 빠르게 만들 수 있다). 따라서 패스워드 암호화에는 적합하지 않다. 해시 함수의 문제점을 보완해서 나온 암호화 함수에는 pbkfd2와 bcrypt 등이 있다. 이 둘은 salt와 같은 랜덤 문자열을 섞고 반복적인 해싱작업으로 해시를 강하게 한다. (함수 반복 횟수를 늘리면 연산속도를 늦출 수 있으므로 brute-forece 공격에 대비할 수 있기 때문) b..
Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource
스프링 에러 메시지 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Unsatisfied dependency expressed through method 'setFilterChains' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'filterChain..
DTO의 사용범위는 어디까지? 또, DTO 변환은 어디서?
전에 Controller와 Service 계층 간 데이터 전달을 어떻게 해야 좋을지에 대한 포스팅을 작성했었다. 뭔가 숲보다 나무를 먼저 본? 느낌이긴한데... 하하; 그때 배우던 예제에선 Service가 Entity를 반환했고, 또 Repository 는 DB단에 제일 가깝기 때문에, 단순히 DTO의 사용범위는 Controller에서 Service 계층까지-라고 생각했다. (그리고 tmi지만 파라미터와 반환타입 둘 다 고려해야 한다는 사실을 간과해서 뭔가 찝찝함이 남은 상태다..) 그런데 QueryDSL 학습 중.... @QueryProjection을 사용하면 DTO 가 Repository에서 생성되어서 Service에 반환되는데, Repository 계층까지 DTO가 들어와도 되나? 싶고 당황스러웠다..
[Error] Update/delete queries cannot be typed
JPQL - EntityManager 로 쿼리 작성중 생긴 문제 update 또는 delete 쿼리를 작성할 수 없다 createQuery() 메서드의 매개변수로 들어가는 Query는 2가지 종류 1. Typed Query: 조회 대상과 반환형이 Entity인 쿼리 2. Query: 조회 대상과 반환형이 Entity가 아닌, 기본형 또는 Wrapper 클래스인 쿼리 update/delete 쿼리는 엔티티를 조회하지도, 반환하지도 않는다. 따라서 일반 쿼리문이므로 .class를 명시하지 않아야 함. 빼주면 해결된다
테스트용 더미 데이터 넣기 (no entitymanager with actual transaction available for current thread)
문제원인 빈 생명주기 콜백 메서드를 사용해서 더미 데이터를 DB에 넣으려고 하니 에러가 뜬다. no entitymanager with actual transaction available for current thread 구글링을 해보니 @PostConstruct에는 직접적으로 @Transactional을 적용할 수 없다고 한다. 그래서 인프런 커뮤니티에 달린 글을 찾아봤는데 찾은 내용이 다음과 같다. @PostConstruct는 해당 빈 자체만 생성되었다고 가정하고 호출됩니다. 해당 빈에 관련된 AOP등을 포함한, 전체 스프링 애플리케이션 컨텍스트가 초기화 된 것을 의미하지는 않습니다. 트랜잭션을 처리하는 AOP등은 스프링의 후 처리기(post processer)가 완전히 동작을 끝내서, 스프링 애플리케..
javax.persistence.NoResultException: No entity found for query
에러 로그 문제 원인 @Override public Member findByLoginId(String loginId) { return em.createQuery("select m from Member m where m.loginId = :loginId", Member.class) .setParameter("loginId", loginId) .getSingleResult(); } 쿼리의 결과값이 없을 때가 있을 수 있으니 try catch문으로 NoResultException 예외처리를 해주어야 한다 변경 후 @Override public Member findByLoginId(String loginId) { try{ return em.createQuery("select m from Member m wher..