GPT 요약

My-Books 프로젝트에서 세션 불일치 문제를 해결하기 위해 JWT 인증을 도입했습니다.
JWT는 서버 자원 없이 확장성이 높고 MSA에 적합합니다.
사용 시 보안에 유의해야 합니다.

My-Books 프로젝트에서의 경험을 다룬 글입니다

기존에 진행했던 토이 프로젝트에서는 Cookie-Session 기반으로 인증/인가를 구현했기에, My-Books에서도 동일한 방식을 적용하려 했지만 MSA 환경이라는 특수성 때문에 다음과 같은 문제에 직면했습니다.

세션 불일치 문제

Cookie-Session 방식은 세션에 유저 정보를 담아두고 쿠키에 세션 id를 기입하는 방식입니다.
쿠키의 경우 사용자가 HTTP 요청 시 자동으로 헤더에 담겨 서버로 전송되기 때문에 간단하고 직관적으로 구현이 가능하며 세션 데이터는 서버에 저장되므로 보안성도 챙긴 방식입니다.

여기서 중요한 건 세션 데이터는 서버에 저장된다는 것입니다. 세션 자체가 서버 자원의 일부이기 때문에 서버에 종속적임을 의미하고
이는 MSA 환경 혹은 Sacle-Out으로 서버가 구성돼있는 경우에 서버 간 세션 불일치 문제가 발생합니다.

사용자가 A 서버에서 로그인을 한 후 B 서버로 라우팅 된다면 세션에 유저 정보가 존재하지 않기 때문에
다시 로그인을 하라는 요청을 보낼 것입니다.

이는 사용자의 경험을 저하시키고 서버 측에서는 불필요한 데이터를 중복으로 갖게 되는 문제를 발생시킵니다.
또한 사용자의 트래픽이 몰려 요청을 분산시켜야 하는 경우에 확장성에 문제또한 발생합니다.

세션 불일치

이러한 문제는 세션을 모아주는 Session Clustering, 혹은 동일한 서버로만 요청을 주고받는 Sticky Session으로 해결이 가능하지만
추가적인 작업이 필요해 복잡도가 올라가기 때문에 또 다른 제약이 생기게 됩니다.

Session  Clustering
Sticky Session


해결법

따라서 저는 JWT를 기반으로 한 인증/인가 방식을 도입했습니다.
JWT는 Json Web Token의 약자로 Json 포맷의 데이터를 인코딩하여 사용하는 토큰입니다.

JWT 구조

방식은 Cookie-Session과 동일합니다.

  1. 사용자가 로그인 시 JWT 토큰을 발급
  2. 쿠키로 JWT 내려줌
  3. 사용자의 요청에 JWT 정보를 헤더에 담아 보냄

여기서 차이점은 JWT는 그 자체로 사용자의 상태와 권한 정보를 포함하고 있다는 것입니다.

JWT를 디코딩시 유저정보가 나오는 모습

서버의 자원인 세션을 사용할 필요가 없으며 각각의 서버에 JWT를 검증하고 읽어내는 코드만 추가되면 됩니다.

오픈소스인 auth0 사용 간단한 구현

서버에 종속되지 않기 때문에 자유롭게 Scale-Out 하거나 Load Balancing을 통해 요청을 분산시켜도 문제가 발생하지 않습니다.
또한 앞서 설명한 Session Clustering과 Sticky Session보다 훨씬 낮은 복잡도를 가지며 직관적입니다.

만약 모든 요청이 몰리는 Gateway 서버를 둔다면 JWT 관련 코드를 백서버와 아예 분리시켜 관리가 가능하며
My-Books에서도 동일한 방법을 사용 중입니다.

My-Books프로젝트 아키텍처

이외에도 서버의 자원인 세션을 사용하지 않기 때문에 서버의 자원을 아낄 수 있다는 이점도 존재합니다.

다만 주의할 것은 JWT는 그 자체로 암호화된 무언가가 아니라 그냥 인코딩한 문자열이라는 것입니다.
따라서 사용 시 고려해야 할 사항이 많으며 이와 관련해 추가적인 링크를 남깁니다.

JWT 안전성 개선기

 

제11회 대한민국 융합SW 해커톤 본선 발표 영상입니다.
발표한지는 좀 됐는데 이제야 블로그에 작성하네요.

 

제11회 대한민국 융합SW 해커톤 예선 발표 영상입니다.
발표한지는 좀 됐는데 이제야 블로그에 작성하네요.

 

들어가는 글

구름톤 유니브의 가장 큰 행사인 단풍톤 11월 23일 ~ 11월 24일에 이루어졌습니다.

이번 해커톤은 특히나 기억에 남는데요 굿즈 제작, 데모 부스 등등.. 기존에 겪어보지 못한 경험이었습니다.
장소 자체도 카카오 AI 캠퍼스를 사용했기 때문에 시설에 있어서도 매우 만족했습니다.

활동

데모 부스를 운영한 적은 처음인데요 생각보다 매우 재밌는 경험이었습니다.
이전에 경험한 해커톤은 발표로 결과가 정해지는 시스템이었기 때문에 더욱 그랬던 것 같아요

학생들이 만드는 프로젝트의 특성상 실제 사용자를 받기는커녕 알파테스트 단계에서 QA 진행도 없이 개발 완료 처리를 하고
서버 비용의 문제로 서비스가 내려가는 경우가 대부분인 것 같습니다.

하지만 데모 부스를 운영 시 해커톤 조직 안의 구성원들이 한 번 정도는 사용하거나 서비스의 전반적인 모습들을 보고 가기 때문에
그 자체로도 가치가 있는 것 같습니다.

저희가 운영했던 데모부스입니다. 이것 이외에도 팀 티셔츠를 맞췄는데 그것도 좋은 추억으로 남는 것 같습니다.

뒤에 QR을 찍게 되면 저희 서비스의 도메인으로 이동하게 됩니다. 이게 생각보다 호응이 좋았습니다.
기억에 남을만한 해커톤을 준비하고 계시다면 추천드립니다.

또 체력도 잘 분비해서 가길 바랍니다.. 안 그럼 얘처럼 자요

 

마무리

개발을 하면서 여러 프로젝트를 진행했지만 그중에서 실제로 유의미한 사용자를 받아낸 경험은 없는 것 같습니다.
이 점이 너무 아쉽게 느껴지고 목표인 "프로덕트를 이해하고 사용자 중심의 개발을 하는 개발자"와는 거리가 있어 보입니다.

해커톤과 같은 행사를 계속해서 나가는 것도 위에서 말한 목표에 다가가는 과정이라 생각합니다.
수십 개의 기획과 디자인을 공짜로 볼 수 있는 경우는 많지 않다고 생각해요

이번 연말에는 또 다른 해커톤에 참가하면서 일 년을 마무리할 것 같습니다.
제 블로그를 방문해 주시는 분들은 대부분 회고의 글을 보시는데 기억할 만한 일 년이었기를 바랍니다.

나머지 사진들 올리고 마무리하겠습니다.

감사합니다.

들어가는 글

안녕하세요 오랜만에 글을 쓰네요 12월 11일 정보처리기사를 취득했습니다.
개발자에게 자격증이 필요한가?에 대해서는 그럴 수도 있고 아닐 수도 있다고 생각합니다.

서비스 기업에 지원하는 경우 자격증이 채용에 있어 유의미한 영향을 줄 것 같진 않습니다만 SI/SM 혹은 전통적인 기업들(제조, 금융..)은 기사 자격증에 대한 채용 우대가 존재하기 때문에 지원하고자 하는 기업의 성향에 따라서는 필수적으로도 따야 할 수도 있습니다.

하지만 요즘 채용시장을 보면 빅 테크는 신입 채용문을 아예 닫아버렸고 스타트업도 혹한기를 겪고 있기 때문에 SI/SM이 대부분의 공고를 차지하고 있습니다.

따라서.. 개인적으로 기사 자격증은 필요하다고 생각합니다.

공부시간/느낀점

이번 시험을 보면서 느낀 것은 전공/비전공의 차이가 극심하게 갈릴 것 같다였습니다.

저의 경우 필기 3일 실기 2일의 공부시간을 가졌는데요 실기의 경우에 코딩 문제가 절반 이상이 출제됐기 때문에 기출만 풀어보고 이론 암기에 집중했습니다. 그래서 필기를 준비한 시간이 실기 준비 시간보다 더 깁니다.

정처기 시험 자체가 이론은 쉽게, 코딩은 어렵게 출제해 변별력을 갖추려 하기 때문에 비전공자에게는 정말 어려운 시험이 될 것 같습니다.
만약 1달 이상의 시간 투자가 필요해 보인다면 개인적으로는 다른 것에 투자하는 게 더 좋아 보입니다. 필요한 건 맞아도 그 정도의 가치는 없다고 생각해요

전공자분의 경우에는 안 딸 이유가 없다고 생각합니다. 어차피 공부에 많은 시간이 필요하진 않을 테니
"개발자는 자격증 필요 없어~"이러시지 말고 꼭! 필수로 따시길 바랍니다.
나중에 원서 쓸 때 우대사항에 기사 자격증 있는 거 보면 괜히 기분 나빠요..

마지막으로 공부하면서 참고했던 자료 올리고 마무리하겠습니다.
감사합니다.

 

뉴비티 기출문제 문제은행 - 완전 새로운 CBT, iBT 문제풀이 시스템

기사, 공무원, 공인중개사 등 로그인 필요 없는 수백가지 시험 기출문제 문제은행 시험 자격증 족보 2024년 최신

newbt.kr

 

 

흥달쌤

흥달쌤과 함께하는 IT 채널입니다. 정보처리기사 자격증 관련된 강의 및 실무 노하우, 프로그래밍 언어(JAVA, C언어, Python) 특강 등이 진행됩니다. 앞으로 진행 예정인 동영상은 IT 관련된 이야기

www.youtube.com

 

'자격증' 카테고리의 다른 글

AWS Solutions Architect Associate (SAA)합격 후기  (0) 2024.12.22

AWS 아키텍처와 관련한 발표 영상입니다.
발표한지는 좀 됐는데 이제야 블로그에 작성하네요.

 

JWT 사용과 관련한 발표 영상입니다.
발표한지는 좀 됐는데 이제야 블로그에 작성하네요.

 

이전 포스팅에서 Issue를 중심으로 한 오픈소스 읽기 훈련에 대해 말하였습니다.

 

우당탕탕 개발 인생 첫 오픈소스 Contribution

누구나 할 수 있는 오픈소스 Contribution이전 포스팅에서 SIPE 합격 후기를 올렸었습니다.이번엔 SIPE에서 진행하는 미션의 일부인 오픈소스를 활용한 읽기 훈련에 대해 말해보려 합니다.저는 현재

masiljangajji-coding.tistory.com


이번에 선택한 오픈소스는 lombok인데요 자바진영에서 매우 높은 인기를 가지며 보일러 플레이트 코드를 줄여주는 귀인이라 생각됩니다.
항상 사용해왔던 것인데 막상 실제 코드레벨에서 어떻게 구현됐는지를 찾아본 적은 없었기 때문에 이번 기회를 통해 읽어봤습니다. 

흥미로운 Issue

Missed null checks in record constructor when non-Lombok annotations are used

 

 

[BUG] Missed null checks in record constructor when non-Lombok annotations are used · Issue #3743 · projectlombok/lombok

Describe the bug Lombok does not generate record constructor with nullability checks for a record with annotated fields - if non-Lombok annotations are used for. The following annotations are affec...

github.com

 

record에서 non-Lombok annotations 사용시 null 체크가 안되는 문제가 있다 합니다.
또 찾아보니 이와같은 이슈를 겪는 사람들이 많은 것 같습니다.

테스트 코드를 실행해보니..

실제로 null 체킹이 안되는 문제를 발견했습니다.

비슷한 Issue를 조금 더 찾아보니

record의 경우에는 Compact Constructor를 기본으로 생성하기 때문에
이런 문제가 발생한다고 합니다

근데 lombok은 record에 대해서도 null 체킹을 하니까...
lombok의 NonNull은 record에 대해서 별도 처리를 한다는 가설을 새울 수 있습니다.

 

lombok의 NonNull은 record에 대해서 추가적인 처리를 하는가?

lombok의 프로젝트 구조입니다.
core안에 익숙해 보이는 이름의 파일이 존재합니다.

우리가 사용하는 lombok 어노테이션은 src/core 아래에 있는것으로 보입니다.

lombok은 기본적으로 컴파일 타임때 AST(Abstract Syntax Tree)를 순회하면서 어노테인션을 인지하고 코드를 주입합니다.

그래서 컴파일과 관련있어 보이는 javac패키지를 확인했고
javacAST , javacASTAdatprer , javacASTVisitor 등을 확인했습니다.

 

구조를 보니 Visitor는 스펙을 명시해놓은 인터페이스고 Adapter가 Visitor를 상속받아 실질적인 동작을 하는 것 처럼 보였습니다.
이름과 visitField , visitAnnotationOnField 등의 메서드 이름으로 추측하건데
AST를 순회하는 역할을 맡고있구나! 라고 생각했습니다.

JavacAST도 확인해보니

 

 

LombokNode -> AST -> JavacAST로 이어집니다.
따라서 JavacAST가 실질적으로 SyntaxTree를 구성하며 그 Tree를 이루는것은 각각의 Node겠구나 생각했습니다.

여기까지 읽은 후 나머지 키지를 클릭해보던 중 익숙한 이름을 발견합니다.

 

어라? 이거 클래스네? -> 그럼 실질적으로 동작이 일어나나보다 그리고...

이름으로 추측하건데 JavacAST를 Adapter가 순회하면서 어노테이션 확인하면 그에 맞는
Handler가 동작해 어노테이션을 처리하는 것 같다


또한 private 메서드는 안읽고 그냥 넘겼습니다
어차피 private이면 밖으로 오픈 안한다는 소리기 때문에 public으로 열려있는 메서드만 읽으면 충분하다 생각해요

그렇게 모든 private메서드를 넘기고 처음 나오는 public는 handle메서드 입니다.

근데 이거... @override 돼있습니다 그말은 표준화된 스펙을 구현한 메서드란 소리며
이는 곧 handle메서드에서 실질적인 처리가 일어남을 의미합니다. 그렇게 쭉 읽다보면...

record에 대해서 추가적인 처리를 하는것을 볼 수 있습니다.

아마 record인 경우에는 lombok이 Modify할 수 있도록 record에 의해 생성되는 compact constructor를 사용하지 않고
따로 만들어 넣어주는 것 같습니다.

따라서 우리는 lombok의 NonNull은 record에 대해서 추가적인 처리를 해주며 다른 벤더에서 제공하는 어노테이션들은
record에 대한 추가적인 처리가 없기 때문에 이런 Issue가 발생한다는 결론을 내릴 수 있습니다.

이전 글과 마찬가지로 단서를 통해 추측하고 읽어내야 할 부분을 최소화 하여 빠르게 결론에 다달하는 읽기 연습을 하는 중입니다.

같이 보시면 좋은 발표 영상입니다.

 

'오픈소스' 카테고리의 다른 글

우당탕탕 개발 인생 첫 오픈소스 Contribution  (4) 2024.11.20

+ Recent posts