2022-07-14-TIL
2022-07-14-TIL
Today I Learned
여러 필드로 정렬하기
Collections.sort로 여러 필드 기준 정렬을 할 때, 필드 값을 문자열로 이어 붙여 한 번에 비교하면 필드 길이가 다를 때 순서가 틀어진다. Java 8부터는 Comparator.comparing(...).thenComparing(...)으로 1차, 2차 기준을 차례로 연결하는 것이 읽기 쉽고 안전하다.
1
2
3
reports.sort(Comparator.comparing(Report::getReportKey)
.thenComparing(Report::getStudentNumber)
.thenComparing(Report::getSchool));
https://stackoverflow.com/questions/4258700/collections-sort-with-multiple-fields
MyBatis #{}와 ${}
MyBatis에서 #{name}은 PreparedStatement의 ? 바인딩 파라미터가 된다. 값이 따옴표 처리와 함께 안전하게 전달되므로 SQL 인젝션에 안전하다. ${name}은 값을 SQL 문자열에 그대로 치환한다. 컬럼명이나 ORDER BY 방향처럼 바인딩 파라미터로 넣을 수 없는 부분에만 쓰고, 사용자 입력이 들어간다면 허용 목록으로 검증한 값만 넣어야 한다. LIKE 검색은 ${} 대신 CONCAT('%', #{word}, '%')처럼 바인딩을 유지하는 방식으로 쓴다.
https://stackoverflow.com/questions/39954300/when-to-use-vs
MySQL SET @변수
MySQL에서 @가 붙은 이름은 사용자 정의 변수다. SET @total = 0;으로 값을 넣고 이후 쿼리에서 @total로 읽는다. 세션 단위로 유지되므로 같은 커넥션 안에서만 보인다. 커넥션 풀을 쓰는 애플리케이션에서는 이전 요청이 남긴 값이 남아 있을 수 있다는 점을 염두에 둬야 한다.
https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_db&wr_id=217598&sca=&sfl=wr_subject%7C%7Cwr_content&stx=set&sop=and
JWT
JWT(JSON Web Token)는 클레임을 JSON으로 담아 서명한 토큰이다. 헤더.페이로드.서명 세 부분을 각각 Base64URL로 인코딩해서 점으로 잇는다. 페이로드는 암호화가 아니라 인코딩일 뿐이라서 누구나 디코딩해 읽을 수 있다. 그래서 비밀번호 같은 민감 정보를 넣으면 안 되고, 서명은 내용이 바뀌지 않았다는 것만 보장한다.
RFC 7519는 미리 정의된 등록 클레임으로 iss(발급자), sub(주체), aud(대상), exp(만료 시각), nbf(이 시각 이전에는 무효), iat(발급 시각), jti(토큰 ID)를 둔다. exp는 초 단위 Unix 시각(NumericDate)이다. 서버는 서명뿐 아니라 exp, aud, iss까지 검증해야 하고, 토큰은 발급 후 서버가 상태를 갖지 않으므로 만료 전 강제 무효화가 어렵다. 이 때문에 액세스 토큰 만료를 짧게 두고 리프레시 토큰으로 재발급하는 구성이 흔하다.
- https://zkdlu.tistory.com/12
- https://velog.io/@devmin/JWT-token-expired-date-with-timedelta
- https://velopert.com/2389
- https://brunch.co.kr/@jinyoungchoi95/1
- https://auth0.com/docs/secure/tokens/json-web-tokens/json-web-token-claims
Cookie in Spring
Spring MVC에서는 @CookieValue("name")로 요청 쿠키를 읽고, 응답에는 HttpServletResponse.addCookie()나 ResponseCookie 빌더로 만든 Set-Cookie 헤더를 붙인다. 인증 토큰을 쿠키에 담는다면 JavaScript가 읽지 못하게 HttpOnly, HTTPS에서만 전송되게 Secure, 교차 사이트 전송을 제한하는 SameSite 속성을 함께 지정한다.
- https://programmingrecoding.tistory.com/28
Bearer Authentication
Bearer 토큰은 “가진 사람(bearer)이 곧 사용 권한자”인 토큰이다. RFC 6750이 OAuth 2.0 액세스 토큰을 전달하는 방법으로 정의했고, 가장 일반적인 방식은 Authorization: Bearer <token> 헤더다. 토큰만 있으면 누구든 쓸 수 있으므로 전송 구간은 반드시 TLS로 보호해야 한다.
Spring Security의 OAuth2 Resource Server는 기본적으로 Authorization 헤더에서 Bearer 토큰을 찾는다. DefaultBearerTokenResolver를 빈으로 등록하면 다른 헤더나 폼 인코딩된 본문 파라미터에서 읽도록 바꿀 수 있다.
- https://www.ssemi.net/what-is-the-bearer-authentication/
- https://docs.spring.io/spring-security/reference/servlet/oauth2/resource-server/bearer-tokens.html
Spring Security Login
Spring Security의 폼 로그인은 UsernamePasswordAuthenticationFilter가 로그인 요청을 가로채 AuthenticationManager에 인증을 맡기고, 성공하면 SecurityContext에 인증 정보를 저장하는 흐름이다. 사용자 정보는 UserDetailsService가 조회하고, 비밀번호 비교는 PasswordEncoder가 한다. 로그인 페이지, 성공·실패 이동 경로는 formLogin() 설정으로 바꾼다.
- https://www.baeldung.com/spring-security-login
댓글
아직 댓글이 없습니다