Sparta과제로 Spring을 이용해 todo app을 만드게 되었다. 한번더.
/api/users/{userId}
저 userId는 뭐쓸까?
일단은 API를 정하는 것 부터 고민이었다. 항상 듣는 말이 주소창에 id적을 거면 12345678 이런식으로 늘어나면 않돼!! 이말을 많이 들었다.
첨에는 email이나 login id를 써볼 까 생각도 해봤지만
/api/users/1 요청이 들어왔을때 login id가 1인지 아니면 id가 1인지 명확하지 않을거 같았다. 그래서 포기하고 이번 과제에서는 그냥 12345678id를 주소에 적기로 했지만...
그래도 남들은 뭐하나 보기라도 하기로 하였다.
kakaomap의 api를 보면 이 사람들도 숫자를 id로 쓴다.
"map_user_id": "2624946471"
"map_user_id": "1471548626"
실제로 요청을 보고 싶다면 https://map.kakao.com/?target=other&tab=review&mapuserid=1471548626 클릭
그래서 저 id의 1을 더해 보아서 요청을 하였다.
https://map.kakao.com/?target=other&tab=review&mapuserid=1471548627
그리고... 요청 실패!
그래서 뭐지... 하고 자세히 보니 모든 유저 ID의 숫자가 10자리다. 딱 hashing의 정의와 부합한다. 이 사람들은 공공 id도 hashing 한담에 보내는 거 같다.
담으로는 이 글을 쓰고 있는 사이트, velog.
이분들은 graphql이라는 거를 쓰고 있었다.
신선하게도 모든 요청이 https://v3.velog.io/graphql 이라는 곳으로 간다.
여기에 무슨 DB 마냥 query를 직접 쏘면
{
"query": "
query trendingPosts($input: TrendingPostsInput!) {
trendingPosts(input: $input) {
id
title
short_description
thumbnail
likes
user {
id
username
profile {
id
thumbnail
display_name
}
}
url_slug
released_at
updated_at
is_private
comments_count
}
}
",
"variables": {
"input": {
"limit": 20,
"offset": 20,
"timeframe": "week"
}
}
}
서버가 답변을 잘해준다.
"id": "68719361-666f-4f7f-9565-9aacd9dd2fba"
여기는 UUID를 쓰므로 내가 겪고 있는 문제는 안겪을 거 같다.
session에 대해 공부하면서 Fixiation Attack에 대해 알게 되었다. 다 이해는 못하지만 간단한 원리 인거 같다. 자세히 보고 싶은 분들은 여기 참고. 은행을 예로 들자면
이러면 당연히 안되기 때문에 머리를 굴리다 Login 할때마다 옛날 session이 있으면 서버한테 그거 버리라고 얘기한 담에 항상 session을 새롭게 만들라고 하기로 했다.
private HttpSession renewSession(HttpServletRequest request) {
// 쓸데없는 fixation attack 예방 차원
HttpSession oldSession = request.getSession(false);
if (oldSession != null) {
oldSession.invalidate();
}
return request.getSession(true);
}
당연히 올바른 방법은 아니다! 올바른 방법은 Spring Security를 쓰는거. 하지만 그건 아직 안배웠으므로 담에.
BCrtypt는 자기가 hash한 결과를 60byte를 사용해 저장한다. 그래서 JPA에 어떻게 저장해야할지 구글에 검색해 봤는데... 이상하게 답이 없다.
그래서 AI한테 물어봤는데 답을 3개나 주었다.
@Column(columnDefinition = "BINARY(60)")
private byte[] yourField;
@Column(length = 60)
private byte[] yourField;
@Column(length = 60)
@Type(type = "org.hibernate.type.BinaryType")
private byte[] yourField;
1번은 다른 DB에서는 작동 안 할 수도 있고,
3번은 hibernate에서만 작동하고 (뭐, hibernate말고 딱히 딴거를 쓸일도 없겠지만)
2번은... 뭔가 JPA가 이상한 짓을 할거 같고.
뭐 MySql이나 H2에서는 저 셋중 하나 고르면 잘 작동 하겠지만, 그냥 무서워서 String에다가 저장하기로 하였다.
이에 대해서는 어떤분이 정말 훌룡한 글은 남기셨습니다. 제글 보지 말고 이거 보세요!
더 열심히 하장 <3