<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발노트</title>
    <link>https://sieunlim.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 13 Apr 2026 00:31:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>SieunLim</managingEditor>
    <item>
      <title>스프링 SNAPSHOT, M, RC, GA</title>
      <link>https://sieunlim.tistory.com/33</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스프링 version convention &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 GIT과 홈페이지를 참고하여 작성하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;테스트, 개발 단계&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SNAPSHOT (a.k.a Nightly) : 테스트, 개발용도이다. SNAPSHOT으로 delpoy하게되면 정식으로 Release되지않고 임시 저장소같은 역할을한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PRE-RELEASE 단계&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Milestone (Mx) : 주요 기능 및 버그를 수정 하며, 여러 버전으로 나뉠 수 있다 (예, M1, M2), 아직 모든 기능과 버그들이 수정되지 않은 단계이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Release Candidate (RC) : 전반적인 기능과 버그들이 수정되었으며 최종 릴리즈 이전 단계이다. 여러버전으로 나뉠수 있다 (예, RC1, RC2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RELEASE&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- General Availability (GA) : 최종 Release 단계, 대부분의 기능과 버그들이 안정화 된 버전이다.&lt;/p&gt;</description>
      <category>▶ Spring Releases &amp;amp; Issues</category>
      <author>SieunLim</author>
      <guid isPermaLink="true">https://sieunlim.tistory.com/33</guid>
      <comments>https://sieunlim.tistory.com/33#entry33comment</comments>
      <pubDate>Mon, 15 Nov 2021 17:10:21 +0900</pubDate>
    </item>
    <item>
      <title>non-compatible bean definition of same name and class [org.mybatis.spring.mapper.MapperFactoryBean]</title>
      <link>https://sieunlim.tistory.com/31</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;원인&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mybatis 사용시 이름이 같은 Mapper(DAO)가 있을 경우 발생하는 에러이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB를 두개이상 사용할때 패키지를 분리했지만 클래스를 같은 이름으로 만들어 종종 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[ mainDao 패키지 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- TestDao.class&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[ secondDao 패키지 ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- TestDao.class&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;해결방법&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dao 클래스들중 중복된 파일명을 수정한다.&lt;/p&gt;</description>
      <category>▶ 오류 모음</category>
      <category>mapper</category>
      <category>mybatis</category>
      <author>SieunLim</author>
      <guid isPermaLink="true">https://sieunlim.tistory.com/31</guid>
      <comments>https://sieunlim.tistory.com/31#entry31comment</comments>
      <pubDate>Thu, 12 Aug 2021 16:45:37 +0900</pubDate>
    </item>
    <item>
      <title>DTO, VO, Entity</title>
      <link>https://sieunlim.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;DTO (Data Transfer Object)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VO (Value Object)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거에는 DTO와 VO를 혼용하여 사용되는 경우가 많았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 3가지는 모두 의미가 다르며 활용법도 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 의미와 특징을 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;DTO ( Data Transfer Object )&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;의미&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data Transfer Object 를 직역하면 데이터 전달 객체 이다. 말 그대로 프로세스간에 데이터를 전달 하는 객체이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스란 사용자(Client) 또는 화면단 과 어플리케이션 사이에서 이루어 지는 동작들 이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Client 또는 presentation Layer &lt;b&gt;&amp;rarr;(DTO)&lt;/b&gt;&lt;b&gt;&amp;rarr;&lt;/b&gt;&amp;nbsp;Controller &lt;b&gt;&amp;rarr;(&lt;span style=&quot;color: #ee2323;&quot;&gt;DTO&lt;/span&gt;)&lt;/b&gt;&lt;b&gt;&amp;rarr; &lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Service &lt;b&gt;&amp;rarr;(&lt;span style=&quot;color: #ee2323;&quot;&gt;DTO&lt;/span&gt;)&lt;/b&gt;&lt;b&gt;&amp;rarr;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Dao&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Dao &lt;b&gt;&amp;rarr;(Entity)&lt;b&gt;&amp;rarr;&lt;/b&gt; &lt;/b&gt;Service &lt;b&gt;&amp;rarr;(&lt;span style=&quot;color: #ee2323;&quot;&gt;DTO&lt;/span&gt;)&lt;/b&gt;&lt;b&gt;&amp;rarr; &lt;/b&gt;Controller &lt;b&gt;&amp;rarr;(DTO)&lt;/b&gt;&lt;b&gt;&lt;b&gt;&amp;rarr;&lt;/b&gt;&lt;/b&gt; Client 또는 presentation Layer&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;빨간색 :&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;이 구간에서 DTO 사용시 사용 비용이 굉장이 커진다. 이유는 아래 특징에서 설명된다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;특징&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;1. getter / setter 이루어져 있으며 비즈니스 로직을 포함하지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 곳에서 getter/setter 외에 모든 로직을 가져서는 안된다고 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 &lt;a href=&quot;https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff649585(v=pandp.10)?redirectedfrom=MSDN&quot;&gt;마이크로소프트 문서&lt;/a&gt; 에서도 말했듯이 비지니스 로직을 포함하지 않는 것 이라고 언급 되었으며 getter/setter만 가져야 된다고 한것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 전달용 이라는 컨셉을 잊지 않고 POJO 형태를 유지하면서 다른 로직과 종속되지 않는 환경을 만든다면 사용 목적에 따라 충분히 다른 로직을 포함시켜도 나쁘지 않을 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 마틴 파울러가 말했듯이 DTO는 Presentation Model에 적합하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마틴파울러의&amp;nbsp;&lt;a href=&quot;https://martinfowler.com/bliki/LocalDTO.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이글&lt;/a&gt;을 읽어보면 DTO는 단점이 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #303633;&quot;&gt;coarse grained형태의 API 경우 수 많은 데이터를 DTO에 맵핑시켜줘야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #303633;&quot;&gt;Service layer에서의 DTO는 DB에 맞춰 DTO를 모두 만드는 시간과 &lt;/span&gt;객체 관계 맵핑에 대해 고민하는 비용이 매우 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 DB데이터와 Client 또는 사용자에게 받고 보내는 데이터 (Presentation Model) 는 다르고 서로 부조합 하기 때문에 DTO로 구분하여 사용하면 매우 적합하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[읽으면 도움이되는 문서]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DTO가 REST API 에서 사용되어야 하는 이유 &lt;a href=&quot;https://stackoverflow.com/a/36175349&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/a/36175349&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;VO ( Value Object )&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;의미&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Value Object 값 객체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;값을 가지고 그 값 자체를 표현하는 객체를 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떠한 특정한 정체성 또는 id를 가진 객체가 아니고 순수 값을 포함한 객체라는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순수 값이기 때문에 불변성을 유지해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순수 값을 나타내는 것들은 돈, 날짜, 숫자 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 국영수 시험점수를 나타내는&amp;nbsp;VO를 만든다고 가정하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;class 시험점수VO {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험점수VO(국어, 영어, 수학){&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;private int 국어, 영어, 수학&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; ... getter, setter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;List&amp;lt;시험점수VO&amp;gt; 시험점수_리스트;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험점수 리스트에서 점수가 모두 100점인 데이터를 찾는다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for( 시험점수VO : 시험점수_리스트 ){&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; aasert(시험점수VO.equals(new 시험점수VO(100, 100, 100));&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 equals를 이용하여 비교될것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 객체이기 때문에 객체안의 값이 같아도 결과는 false가 나올 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때문에 equals와 hashcode를 override 하여 구현해 줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;특징&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Entity&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entity는 흔히 데이터베이스에서 사용되는 단어이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #444444;&quot;&gt;인간이 생각하는 개념 또는 정보의 세계에서는 의미있는 정보의 단위로서, 파일 처리시스템에서는 한건의 자료를 구성하는 레코드가 하나의 엔티티에 해당한다. - &lt;a href=&quot;http://naver.me/5pN3FE9U&quot;&gt;http://naver.me/5pN3FE9U&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이로서 Entity는 어플리케이션 단에서도 DB를 나타내는 개체로 표현되어 DB 컬럼과 완전 매칭되어 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 정보들을 찾아보면 어느곳에는 로직을 구현하면 안되고 또 어느 곳에서는 로직을 구현할 수 있다라고 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모두 일리가 있는 말이지만 항상 그랬듯이 개발에는 정답이 없으며 사람의 판단으로 만들어 나아가는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 사용하려고 하는것에 대한 의미를 충분이 알고 내 환경에 맞게 최적의 방법을 선택하여 사용하면 되는것 같다.&lt;/p&gt;</description>
      <category>▶ Spring</category>
      <category>DTO</category>
      <category>Entitiy</category>
      <category>java</category>
      <category>Spring</category>
      <category>Vo</category>
      <category>마틴 파울러</category>
      <author>SieunLim</author>
      <guid isPermaLink="true">https://sieunlim.tistory.com/29</guid>
      <comments>https://sieunlim.tistory.com/29#entry29comment</comments>
      <pubDate>Tue, 18 May 2021 12:54:03 +0900</pubDate>
    </item>
    <item>
      <title>javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/servlet/ServletInputStream</title>
      <link>https://sieunlim.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;javax.servlet.ServletException:&amp;nbsp;java.lang.NoClassDefFoundError:&amp;nbsp;javax/servlet/ServletInputStream&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;원인&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 오류는 java 어플리케이션 실행시 servlet-api.jar가 library에 존재하지않기 때문에 나타나는 오류이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 케이스는 스프링 부트에서 내장 톰캣을 사용하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트내부에 톰캣 설정이 되어 있지않고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main 함수를 실행 시켰을때 나타나는 현상이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;해결방법&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치된 톰캣경로 lib 폴더에 있는 servlet-api.jar를&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 library dependency에 추가하면 해결할 수 있다.&lt;/p&gt;</description>
      <category>▶ 오류 모음</category>
      <category>java</category>
      <category>Spring</category>
      <category>오류</category>
      <author>SieunLim</author>
      <guid isPermaLink="true">https://sieunlim.tistory.com/27</guid>
      <comments>https://sieunlim.tistory.com/27#entry27comment</comments>
      <pubDate>Tue, 11 May 2021 18:26:29 +0900</pubDate>
    </item>
    <item>
      <title>Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException</title>
      <link>https://sieunlim.tistory.com/23</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;org.springframework.beans.factory.BeanCreationException:&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.userSession': Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request. at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:361) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.getTarget(CglibAopProxy.java:704) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:654) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at com.moffice.web.model.common.UserSession$$EnhancerBySpringCGLIB$$c93d32ff.getCompanySeqno() ~[classes/:na] at com.moffice.common.aopTest.before(aopTest.java:20) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_242] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_242] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_242] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_242] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:609) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.aspectj.AspectJMethodBeforeAdvice.before(AspectJMethodBeforeAdvice.java:43) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:55) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:84) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at com.moffice.web.interceptor.LoggingAspect.serviceChecker(LoggingAspect.java:43) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_242] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_242] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_242] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_242] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:672) ~[spring-aop-4.3.28.RELEASE.jar:4.3.28.RELEASE] at com.moffice.web.dao.SystemDao$$EnhancerBySpringCGLIB$$1d7fcb1a.selectSystemOptions() ~[classes/:na] at com.moffice.web.common.ApplicationContextProvider.init(ApplicationContextProvider.java:46) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_242] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_242] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_242] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_242] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:366) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:311) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:134) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:407) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1611) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:481) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:757) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) [spring-context-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) [spring-context-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:668) [spring-webmvc-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:634) [spring-webmvc-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:682) [spring-webmvc-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:553) [spring-webmvc-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:494) [spring-webmvc-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:171) [spring-webmvc-4.3.28.RELEASE.jar:4.3.28.RELEASE] at javax.servlet.GenericServlet.init(GenericServlet.java:160) [tomcat-embed-core-7.0.47.jar:7.0.47] at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1280) [tomcat-embed-core-7.0.47.jar:7.0.47] at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1193) [tomcat-embed-core-7.0.47.jar:7.0.47] at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1088) [tomcat-embed-core-7.0.47.jar:7.0.47] at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5176) [tomcat-embed-core-7.0.47.jar:7.0.47] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5460) [tomcat-embed-core-7.0.47.jar:7.0.47] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-7.0.47.jar:7.0.47] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) [tomcat-embed-core-7.0.47.jar:7.0.47] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) [tomcat-embed-core-7.0.47.jar:7.0.47] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_242] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_242] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_242] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_242] Caused by: java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request. at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131) ~[spring-web-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.web.context.request.SessionScope.get(SessionScope.java:91) ~[spring-web-4.3.28.RELEASE.jar:4.3.28.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:346) [spring-beans-4.3.28.RELEASE.jar:4.3.28.RELEASE] ... 67 common frames omitted&lt;/p&gt;</description>
      <category>▶ 오류 모음</category>
      <author>SieunLim</author>
      <guid isPermaLink="true">https://sieunlim.tistory.com/23</guid>
      <comments>https://sieunlim.tistory.com/23#entry23comment</comments>
      <pubDate>Mon, 10 May 2021 18:14:43 +0900</pubDate>
    </item>
    <item>
      <title>org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19 at</title>
      <link>https://sieunlim.tistory.com/21</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;정보:&amp;nbsp;Starting&amp;nbsp;Servlet&amp;nbsp;Engine:&amp;nbsp;Apache&amp;nbsp;Tomcat/7.0.47&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;심각: Unable to process Jar entry [META-INF/versions/11/module-info.class] from Jar [jar:file:/C:/Users/PC/.m2/repository/com/zaxxer/HikariCP/3.4.5/HikariCP-3.4.5.jar!/] for annotations &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19 at&lt;/b&gt; &lt;/span&gt;org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:133) at org.apache.tomcat.util.bcel.classfile.ConstantPool.(ConstantPool.java:60) at org.apache.tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:209) at org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:119) at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2134) at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:2010) at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1976) at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1961) at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1319) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:878) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:376) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5322) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[개발환경]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자바 8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 톰캣 7.0.47&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스프링&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[원인] 톰캣이 자바버전에 완벽히 호환되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[설명] 톰캣 7에서 사용되는 BCEL 라이브러리의 몇몇 기능들이 자바8 바이트 코드 형식과 호환되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[해결]&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 톰캣 8 업그레이드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 그냥 쓴다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;a href=&quot;http://tomcat.apache.org/whichversion.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;톰캣 공식 홈페이지&lt;/a&gt; 에 따르면 톰캣 7은 자바6 이상에서 사용 가능하다고 명시되어 있으며 사용에 큰 문제는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 몇몇 블로그에 &lt;span style=&quot;color: #333333;&quot;&gt;Web.xml 에서 metadata-complete=&quot;true&quot;를 추가하여&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;해결한다고 나와있는데..&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;metadata-complete를 true 로 설정할 경우 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;자바 자체 서블릿 어노테이션 기능인 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@WebServlet, @WebFilter, and @WebListener 등이 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;스캔되지 않아 작동하지 않음으로 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;매우 위험하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;(&lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://download.oracle.com/otn-pub/jcp/servlet-3.0-fr-oth-JSpec/servlet-3_0-final-spec.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;오라클 서블릿 상세설명서&lt;/a&gt; 에서 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;metadata-complete키워드 검색하여 참고)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;물론, 스프링 프레임워크는 스프링 자체 컨테이너를 사용하기 때문에 상관이없다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래도 &lt;span style=&quot;color: #333333;&quot;&gt;metadata-complete는 왠만하면 피하는걸로...&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>▶ 오류 모음</category>
      <category>org.apache.tomcat.util.bcel.classfile.ClassFormatException</category>
      <category>tomcat 오류</category>
      <category>자바 오류</category>
      <author>SieunLim</author>
      <guid isPermaLink="true">https://sieunlim.tistory.com/21</guid>
      <comments>https://sieunlim.tistory.com/21#entry21comment</comments>
      <pubDate>Tue, 27 Apr 2021 11:43:53 +0900</pubDate>
    </item>
    <item>
      <title>Spring Security 스프링 시큐리티?</title>
      <link>https://sieunlim.tistory.com/19</link>
      <description>&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기술적인 부분보다 &lt;/span&gt;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스프링 시큐리티가 무엇인지에 대해 먼저 알아보자.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;normal&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스프링 시큐리티가 무엇일까? 스프링 홈페이지에서 찾아보자 &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;/span&gt;&lt;a href=&quot;https://spring.io/projects/spring-security&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고서&lt;span style=&quot;color: #333333;&quot;&gt;)&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스프링 시큐리티는 강력하고 커스터마이징이 가능한 인증 및 접근제어 프레임 워크이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 스프링 기반의 애플리케이션을 안전하게 하는데에 사실상 표준이라고 할수있습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스프링 시큐리티는 자바 애플리케이션에 인증과 권한 부여를 제공하는 데 중점을 둔 프레임 워크입니다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;모든 스프링 프로젝트와 마찬가지로 스프링 시큐리티의 진정한 힘은&amp;nbsp;custom&amp;nbsp;requirements(맞춤형 요구사항)을 충족시키기 위해 얼마나 쉽게 확장될수 있는지에서 알수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;wut.png&quot; width=&quot;225&quot; height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKXG8H/btquSzTkOHd/iaAwvKz1DygCLO4NAatieK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKXG8H/btquSzTkOHd/iaAwvKz1DygCLO4NAatieK/img.png&quot; data-alt=&quot;???????&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKXG8H/btquSzTkOHd/iaAwvKz1DygCLO4NAatieK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKXG8H%2FbtquSzTkOHd%2FiaAwvKz1DygCLO4NAatieK%2Fimg.png&quot; data-filename=&quot;wut.png&quot; width=&quot;225&quot; height=&quot;169&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;???????&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; letter-spacing: 0px;&quot;&gt;간단하게 말해서,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 스프링 시큐리티는 스프링 기반의 어플리케이션에서 보안을 위해&amp;nbsp;&lt;span style=&quot;color: #6f45ec;&quot;&gt;&lt;b&gt;인증&lt;/b&gt;&lt;/span&gt;과 &lt;span style=&quot;color: #6f45ec;&quot;&gt;&lt;b&gt;권한 부여&lt;/b&gt;&lt;/span&gt;를 사용하여 &lt;b&gt;&lt;span style=&quot;color: #6f45ec;&quot;&gt;접근을 제어&lt;/span&gt;&lt;/b&gt;하는 프레임워크이다 라고 알고있으면 될것같다.&amp;nbsp;&lt;/span&gt;+ 커스터 마이징이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;웹으로 치자면 로그인 기능에서 인증을 하고 관리자나 사용자라는 권한부여하여 권한에 맞게 접속할수 있는 페이지를 제어 한다는 것이다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;로그인 기능?&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h2&gt;굳이 써야하는 이유가?&lt;/h2&gt;
&lt;h2&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;스프링 시큐리티 없이도 만들어 왔잖아?&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;normal&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스프링 시큐리티를 왜 써야할까 이유를 찾아보자.&amp;nbsp;(&lt;a href=&quot;https://docs.spring.io/spring-security/site/docs/5.1.5.RELEASE/reference/htmlsingle/#hello-web-security-java-configuration&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고서&lt;/a&gt;)&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 모든 URL을 가로채어 인증을 요구한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 로그인 폼을 생성해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. &lt;a href=&quot;https://namu.wiki/w/CSRF&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CSRF&lt;/a&gt; 공격을 막아준다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. Session Fixation을 막아준다. (&lt;a href=&quot;https://www.youtube.com/watch?v=MyB7gj0fJdw&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;예제&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5. 요청 헤더 보안&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/HTTPS&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;HSTS&lt;/a&gt; 강화&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://msdn.microsoft.com/en-us/library/ie/gg622941(v=vs.85).aspx&quot;&gt;X-Content-Type-Options&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;캐시 컨트롤 (정적 리소스 &lt;a href=&quot;https://aws.amazon.com/ko/caching/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;캐싱&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://msdn.microsoft.com/en-us/library/dd565647(v=vs.85).aspx&quot;&gt;X-XSS-Protection&lt;/a&gt; XSS 보안 (&lt;a href=&quot;https://namu.wiki/w/XSS&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;XSS?&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%ED%81%B4%EB%A6%AD%EC%9E%AC%ED%82%B9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;클릭재킹&lt;/a&gt;을 보안하기 위한 X-Frame-Options 통합&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;6. Servlet API 메소드 제공&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getRemoteUser()&quot;&gt;HttpServletRequest#getRemoteUser()&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getUserPrincipal()&quot;&gt;HttpServletRequest.html#getUserPrincipal()&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#isUserInRole(java.lang.String)&quot;&gt;HttpServletRequest.html#isUserInRole(java.lang.String)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#login(java.lang.String,%20java.lang.String)&quot;&gt;HttpServletRequest.html#login(java.lang.String, java.lang.String)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#logout()&quot;&gt;HttpServletRequest.html#logout()&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;보다시피 우리가 몰랐던 보안에 관련된 부분까지 스프링 시큐리티 설정만 해준다면 알아서 척척 처리 해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;스프링 시큐리티 없이 로그인 관련된 기능이나 보안처리를 구현하게 된다면 위에 나열된 모든것을&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;A부터 Z까지 구현해야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 스프링 시큐리티 프레임워크를 사용하여 이미 짜여 있는 틀을 이용해 쉽게 설정 할 수 있고 입맛에 맞지 않다면 커스터마이징 까지 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;써야할지 말아야 할지의 선택은 개발자의 몫이다. 강요하는 사람은 아무도 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;normal&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인증 Authentication &amp;amp; 권한허가 Authorization 의 작동 원리&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인증&amp;nbsp; Authentication 의 동작 시나리오 (&lt;a href=&quot;https://docs.spring.io/spring-security/site/docs/5.1.5.RELEASE/reference/htmlsingle/#what-is-authentication-in-spring-security&quot;&gt;참고서&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot;&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아이디와 패스워드로 로그인하도록 유저에게 알린다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유저에 대한 비밀번호가 올바른지 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유저의 정보 ( ROLE , 계정만료, 계정잠금 등)를 얻는다. (예 - DB를 통해 얻을수 있는 방법이있다)&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자에 대한 Security Context (유저의 인증 정보를 가지고있는 컨텍스트) 가 설정된다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;컨텍스트가 만들어지는과정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;사용자 이름과 암호를 가져 와서 UsernamePasswordAuthenticationToken 인스턴스로 결합합니다.&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;검증을 위해 토큰이 AuthenticationManager의 인스턴스로 전달됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;검증된 토큰을 Authentication 객체로 반환합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;반환 된 Authentication 객체를 SecurityContextHolder.getContext (). setAuthentication (...)을 호출하여 Security Context 에 설정됩니다.&lt;span style=&quot;overflow: hidden; line-height: 0px;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;overflow: hidden; line-height: 0px;&quot;&gt;&lt;/span&gt;중요! 마지막으로 GrantedAuthority에 추가된 권한 (Authorization) 이 설정됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li style=&quot;font-size: 0.94em;&quot;&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;권한 Authorization (&lt;a style=&quot;font-size: 16px; letter-spacing: 0px;&quot; href=&quot;https://docs.spring.io/spring-security/site/docs/5.1.5.RELEASE/reference/htmlsingle/#authz-arch&quot;&gt;참고서&lt;/a&gt;&lt;span style=&quot;font-size: 16px; letter-spacing: 0px;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;font-size: 0.94em;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위에서 생성된 인증(Authenticaion) 객체 구현체는&amp;nbsp;GrantedAuthority 객체 리스트를 내장하고 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;font-size: 0.94em;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GrantedAuthority&amp;nbsp;는 유저의 권한을 나타내며 권한 허가에 대한 결정이 내려질때&amp;nbsp;AccessDecisionManager 에 의해 읽혀집니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>▶ Spring</category>
      <category>spring security</category>
      <category>스프링</category>
      <category>스프링 시큐리티</category>
      <author>SieunLim</author>
      <guid isPermaLink="true">https://sieunlim.tistory.com/19</guid>
      <comments>https://sieunlim.tistory.com/19#entry19comment</comments>
      <pubDate>Sun, 28 Apr 2019 05:24:54 +0900</pubDate>
    </item>
    <item>
      <title>스프링 mvc 패턴</title>
      <link>https://sieunlim.tistory.com/18</link>
      <description>&lt;p&gt;스프링 mvc 이전에&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;mvc 패턴은&amp;nbsp;&lt;/p&gt;
&lt;p&gt;자바 뿐만아니라 모든 프로그래밍에서 사용하는 디자인패턴을 말한다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;mvc 패턴을 사용함으로서 작업할수 있는 부분이 확실하게 구분되어&amp;nbsp;&lt;/p&gt;
&lt;p&gt;유지보수와 헙업(역할 분담)에 용이하다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이전 mvc model 1 같은경우는 jsp 안에 자바코드와 html 이 같이 섞여 있엇다&lt;/p&gt;
&lt;p&gt;이떄문에 유지보수가 어려워서&amp;nbsp; model2 패턴이 나오게 되었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;mvc 패턴은 스프링뿐만아니라 프레임워크 없이 사용될수있고&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다른 언어에서도 mvc 패턴으로 프로젝트를 만들수있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/08bbZ/btqud6jkmm8/RZnRo9jmJk1EazHlzFkC21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/08bbZ/btqud6jkmm8/RZnRo9jmJk1EazHlzFkC21/img.png&quot; data-alt=&quot;https://server-engineer.tistory.com/253&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/08bbZ/btqud6jkmm8/RZnRo9jmJk1EazHlzFkC21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F08bbZ%2Fbtqud6jkmm8%2FRZnRo9jmJk1EazHlzFkC21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://server-engineer.tistory.com/253&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;AOP (관점 지향 프로그래밍) &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PSA (이동 가능한 서비스를 위한 추상화) &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;IOC 제어의 역행 : 객체생성 및 관계설정을 개발자가 하지않고 스프링이 처리 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DI 의존성 주입 : IOC의 구현모습중에 하나인 DI 클래스내에 필요한 의존객체를 외부에서 주입하는 기술&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt; POJO 순수한 자바객체&lt;/span&gt;&lt;/p&gt;</description>
      <category>▶ Spring</category>
      <author>SieunLim</author>
      <guid isPermaLink="true">https://sieunlim.tistory.com/18</guid>
      <comments>https://sieunlim.tistory.com/18#entry18comment</comments>
      <pubDate>Sun, 7 Apr 2019 02:18:57 +0900</pubDate>
    </item>
    <item>
      <title>Apache와 Tomcat이란?</title>
      <link>https://sieunlim.tistory.com/17</link>
      <description>&lt;p&gt;Apache는 웹서버 이다.&lt;/p&gt;
&lt;p&gt;Tomcat은 웹어플리케이션 서버 (WAS) 이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우리가 흔히 개발할때 사용하는 Apache Tomcat 은 Tomcat(WAS) 을 의미한다&lt;/p&gt;
&lt;p&gt;앞에 붙은 Apache는 아파치 재단에서 만들어서 그냥 붙여놓은 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그러면 웹서버와 WAS 의 차이점은 무엇인가?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;인터넷에서 검색을 하여 찾아보면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Apache는 정적데이터를 담당하고 (HTML , 이미지 등)&lt;/p&gt;
&lt;p&gt;Tomcat은 동적데이터를 담당한다고 나와있다. ( JSP , SERVLET , DB를 통한 데이터 등)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;말은 쉽지만 , Tomcat 만 사용하고 Apache를 쓰고 있지 않다면 정확히 이해가 가지 않을것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tomcat 만 사용하는 사람들에게 간단히 결론만 말하자면,&lt;/p&gt;
&lt;p&gt;Tomcat에는 Apache 기능이 포함되어 있어서&amp;nbsp;&lt;/p&gt;
&lt;p&gt;정적이든 동적이든 모든 데이터를 보여줄 수 있다고 한다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그렇기 때문에 굳이 Apache를 설치하여 정적데이터를 위한 서버를 가지고 있지 않아도 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그렇다면 Apache는 왜 존재하고&amp;nbsp;&lt;/p&gt;
&lt;p&gt;또 듣기로는 Apache 와 Tomcat을 구분해서 서비스하는 기업이 있다고하는데&lt;/p&gt;
&lt;p&gt;그 이유를 살펴보자.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;첫번째 기본이 되는 이유는 아래와 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Apache(웹서버) 에서는 웹문서(정적데이터) / Tomcat(WAS) 에서는 동적데이터만 처리하도록 분배하여 서버의 부담을 줄인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;하지만 이 이유는 잘못 알고있는 미신이 되었다.&lt;/p&gt;
&lt;p&gt;그이유는 아래 토비님의 글을 보면 이해될것이다&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;a href=&quot;http://toby.epril.com/?p=1125&quot;&gt;http://toby.epril.com/?p=1125&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;얼마전에 성철이 형이 물어봐서 답해줬던 내용이다.&lt;/p&gt;
&lt;p&gt;많은 개발자들이 애플리케이션 서버로 톰캣을 사용하는 경우에 스태틱 파일(html, css, js, 이미지)은 톰캣 앞에 아파치 웹 서버(Httpd)를 두어서 처리하게 하는 것이 좋다고 생각한다. 외부의 요청은 일단 Apache Httpd가 받고, 톰캣 내에서 처리할 자바 애플리케이션만 톰캣으로 다시 전달해서 처리하고 그 외의 리소스는 Apache Httpd가 직접 처리하게 만들어야 성능이 좋다고 생각한다. 자바로 만든 서버인 톰캣은 스태틱 파일 처리에서 Apache Httpd만 못하다는 것이 그 이유다.&lt;/p&gt;
&lt;p&gt;하지만 톰캣과 Httpd의 개발자에 따르면 이는 개발자들이 잘못 알고 있는 미신이다. 아직도 톰캣 3를 사용하고 있는 것이 아니라면 말이다.&lt;/p&gt;
&lt;p&gt;자세한 내용은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.tomcatexpert.com/blog/2010/03/24/myth-or-truth-one-should-always-use-apache-httpd-front-apache-tomcat-improve-perform&quot;&gt;Myth or truth: One should always use Apache httpd in front of Apache Tomcat to improve performance?&lt;/a&gt;에 잘 나와있다. 지금은 스프링 소스의 직원이 된 아파치 톰캣과 Httpd 의 핵심 개발자들이 직접 작성한 내용이다.&lt;/p&gt;
&lt;p&gt;톰캣은 5.5부터 Httpd의 native 모듈을 사용해서 스태틱 파일을 처리하는 기능을 제공한다. 이 경우 Httpd와 톰캣이 같은 모듈을 사용하는 셈이니 성능에서 차이가 날 이유가 없다. 실제 테스트 한 결과를 봐도 톰캣에서 아파치 Native 모듈을 사용하는 것이 순수하게 아파치 Httpd만 사용하는 것과 비교해서 성능이 전혀 떨어지지 않는다.&lt;/p&gt;
&lt;p&gt;따라서 단지 스태틱 파일 처리의 성능만을 위해서라면 굳이 톰캣 앞에 Apache Httpd를 두는 것은 불필요하다. 오히려 메모리만 많이 먹고, 관리부담은 커지고, 불필요한 부하만 걸릴 뿐이다.&lt;/p&gt;
&lt;p&gt;물론 Httpd의 다른 기능이나 모듈을 사용해야 할 필요가 있다면 그때는 Httpd를 앞에 두고 사용해야겠지만. 예를 들어 하나의 서버에서 PHP 애플리케이션과 자바 애플리케이션을 함께 사용하거나, Httpd 서버를 간단한 로드밸런싱을 위해서 사용해야 하는 경우라면 Httpd를 앞에 두고 톰캣을 연결해서 사용하도록 하면 될 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;그렇다면 진짜 이유는 무엇일까&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;토비님 글에서 마지막 부분에서 정확한 이유를 알수있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;물론 Httpd의 다른 기능이나 모듈을 사용해야 할 필요가 있다면 그때는 Httpd를 앞에 두고 사용해야겠지만. 예를 들어 하나의 서버에서 PHP 애플리케이션과 자바 애플리케이션을 함께 사용하거나, Httpd 서버를 간단한 로드밸런싱을 위해서 사용해야 하는 경우라면 Httpd를 앞에 두고 톰캣을 연결해서 사용하도록 하면 될 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;hr&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1. 보안 강화 (Apache에서 해킹을 당하여도 WAS 에서는 정상 작동)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2.&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;로드밸런싱 (2번과 같은경우를 대비 - 특정서버에서 에러/과부화가 발생하였을경우 다른 서버에서 정상적으로 서비스하기 위함)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. 하나의 Apache (웹서버) 에서 다른언어의 어플리케이션을 함께 사용할때&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bivH6A/btquauT7f5i/FrGnWcWCAMqwYfBKR0aYk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bivH6A/btquauT7f5i/FrGnWcWCAMqwYfBKR0aYk0/img.jpg&quot; data-alt=&quot;https://round1tko.tistory.com/64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bivH6A/btquauT7f5i/FrGnWcWCAMqwYfBKR0aYk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbivH6A%2FbtquauT7f5i%2FFrGnWcWCAMqwYfBKR0aYk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://round1tko.tistory.com/64&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://toby.epril.com/?p=1125&quot;&gt;http://toby.epril.com/?p=1125&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://okky.kr/article/243427&quot;&gt;https://okky.kr/article/243427&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://round1tko.tistory.com/64&quot;&gt;https://round1tko.tistory.com/64&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;로드밸런싱&amp;nbsp;&lt;a href=&quot;https://nesoy.github.io/articles/2018-06/Load-Balancer&quot;&gt;https://nesoy.github.io/articles/2018-06/Load-Balancer&lt;/a&gt;&lt;/p&gt;</description>
      <category>▶ Server</category>
      <category>Apache</category>
      <category>Apache와 Tomcat</category>
      <category>tomcat</category>
      <category>서버</category>
      <category>아파치</category>
      <category>톰캣</category>
      <author>SieunLim</author>
      <guid isPermaLink="true">https://sieunlim.tistory.com/17</guid>
      <comments>https://sieunlim.tistory.com/17#entry17comment</comments>
      <pubDate>Sat, 6 Apr 2019 23:32:53 +0900</pubDate>
    </item>
    <item>
      <title>암호화 복호화란</title>
      <link>https://sieunlim.tistory.com/16</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; margin-right: 0px; margin-bottom: 16px; margin-left: 0px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; margin-top: 0px !important;&quot;&gt;요약&lt;/h1&gt;&lt;ul style=&quot;box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;암호는 단방향, 양방향으로 나뉜다.&lt;br style=&quot;box-sizing: border-box;&quot;&gt;단방향 : 재사용 X (Ex.사용자 비밀번호)&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;양방향 : 재사용 O (Ex.주소,이메일)&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;단방향 암호는 bcrypt가&amp;nbsp;제일 보편화 되어있다.&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;양방향 암호는 AES 와 RSA 등을 쓴다 (선택사항)&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;암호의 알고리즘을 직접 구현할 수 있다.&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;jasypt 는 간편하고 단방향,양방향 모두 지원하지만 사용하는 암호 알고리즘의 보안이 약하다&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;DIGEST ALGORITHMS: [MD2, MD5, SHA, SHA-256, SHA-384, SHA-512]&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;PBE ALGORITHMS: [PBEWITHMD5ANDDES, PBEWITHMD5ANDTRIPLEDES, PBEWITHSHA1ANDDESEDE, PBEWITHSHA1ANDRC2_40&lt;/li&gt;&lt;/ul&gt;&lt;h1 style=&quot;box-sizing: border-box; margin-top: 24px; margin-right: 0px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;;&quot;&gt;&lt;a id=&quot;user-content-i-암호란&quot; class=&quot;anchor&quot; href=&quot;https://github.com/kimhoungkuk/ShoppingmallProject/wiki/%EC%95%94%EB%B3%B5%ED%98%B8%ED%99%94#i-%EC%95%94%ED%98%B8%EB%9E%80&quot; aria-hidden=&quot;true&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); float: left; padding-right: 4px; margin-left: -20px; line-height: 1;&quot;&gt;&lt;svg class=&quot;octicon octicon-link&quot; viewBox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;I. 암호란?&lt;/h1&gt;&lt;ul style=&quot;box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;암호(Cryptography)&lt;/span&gt;&amp;nbsp;: 평문을 암호문으로 변환 하거나 암호문을 평문으로&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;변환하는 기술&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;평문(Plaintext) : 해독 가능한 형태의 텍스트&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;&quot;&gt;Ex) (&quot;123456&quot;)&lt;/code&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;암호문(Ciphertext) : 해독 불가능한 형태의 텍스트&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;&quot;&gt;Ex) (&quot;aBD#fefa$fae!&quot;)&lt;/code&gt;&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 style=&quot;box-sizing: border-box; margin: 24px 0px 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;;&quot;&gt;&lt;a id=&quot;user-content-ii-암호화encryption복호화decryption&quot; class=&quot;anchor&quot; href=&quot;https://github.com/kimhoungkuk/ShoppingmallProject/wiki/%EC%95%94%EB%B3%B5%ED%98%B8%ED%99%94#ii-%EC%95%94%ED%98%B8%ED%99%94encryption%EB%B3%B5%ED%98%B8%ED%99%94decryption&quot; aria-hidden=&quot;true&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); float: left; padding-right: 4px; margin-left: -20px; line-height: 1;&quot;&gt;&lt;svg class=&quot;octicon octicon-link&quot; viewBox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;II. 암호화(Encryption)&amp;amp;복호화(Decryption)&lt;/h1&gt;&lt;ul style=&quot;box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;암호화(Encryption)&lt;/span&gt;&amp;nbsp;: 평문을 암호문으로&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;변환하는 과정&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;&quot;&gt;Ex) 평문(&quot;123456&quot;)&lt;/code&gt;&amp;nbsp;→&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;&quot;&gt;암호화&lt;/code&gt;&amp;nbsp;→&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;&quot;&gt;암호문(&quot;aBD#fefa$fae!&quot;)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;복호화(Decryption) : 암호문을 평문으로&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;변환하는 과정&lt;/span&gt;&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;&quot;&gt;Ex) 암호문(&quot;aBD#fefa$fae!!&quot;)&lt;/code&gt;&amp;nbsp;→&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;&quot;&gt;복호화&lt;/code&gt;&amp;nbsp;→&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;&quot;&gt;평문(&quot;123456&quot;)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 style=&quot;box-sizing: border-box; margin: 24px 0px 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;;&quot;&gt;&lt;a id=&quot;user-content-iii-암호화의-종류-&quot; class=&quot;anchor&quot; href=&quot;https://github.com/kimhoungkuk/ShoppingmallProject/wiki/%EC%95%94%EB%B3%B5%ED%98%B8%ED%99%94#iii-%EC%95%94%ED%98%B8%ED%99%94%EC%9D%98-%EC%A2%85%EB%A5%98-&quot; aria-hidden=&quot;true&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); float: left; padding-right: 4px; margin-left: -20px; line-height: 1;&quot;&gt;&lt;svg class=&quot;octicon octicon-link&quot; viewBox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;III. 암호화의 종류&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/h1&gt;&lt;ul style=&quot;box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;단방향 암호화 :&lt;/span&gt;&amp;nbsp;암호화 후 복호화 할 수 없다&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;Ex) 사용자 비밀번호 - 사용자가 입력한 비밀번호를 암호화 하여 DB에 저장이 될때, 모든 접근자(개발자포함)는 암호화 된 코드를 다시 평문으로 볼 수 없다.&lt;br style=&quot;box-sizing: border-box;&quot;&gt;또한, 해킹이 되어도 복호화가 매우 힘들다. (예외 - RainbowTable)&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;참고:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=TeIVhioUAXs&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;https://www.youtube.com/watch?v=TeIVhioUAXs&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;양방향 암호화 :&lt;/span&gt;&amp;nbsp;암호화와 복호화 모두 가능하다&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;Ex) 사용자 주소, 이메일, 번호 또는 전자서명 같이 재사용성이 있는 정보는 암호화 복호화 모두 이루어져야한다&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;양방향 암호화에는 두가지 종류가 있다.&lt;ul style=&quot;box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;1.대칭형(비밀키 암호)&lt;/span&gt;&amp;nbsp;: 암호화 할때 사용한 key == 복호화 할때 사용하는 key&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;주로 데이터 통신 암호화에 많이 쓰인다&lt;br style=&quot;box-sizing: border-box;&quot;&gt;참고:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=cs69fRxAzTQ&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;https://www.youtube.com/watch?v=cs69fRxAzTQ&lt;/a&gt;&amp;nbsp;,&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=at9dA1Q4-M8&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;https://www.youtube.com/watch?v=at9dA1Q4-M8&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;2.비대칭형(공개키 암호)&lt;/span&gt;&amp;nbsp;: 암호화 할때 사용한 key != 복호화 할때 사용하는 key&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;주로 인증에 많이 쓰인다&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;참고:&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=Qc1OqFv8b5Y&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;https://www.youtube.com/watch?v=Qc1OqFv8b5Y&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h1 style=&quot;box-sizing: border-box; margin: 24px 0px 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;;&quot;&gt;&lt;a id=&quot;user-content-iv-암호-알고리즘-&quot; class=&quot;anchor&quot; href=&quot;https://github.com/kimhoungkuk/ShoppingmallProject/wiki/%EC%95%94%EB%B3%B5%ED%98%B8%ED%99%94#iv-%EC%95%94%ED%98%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-&quot; aria-hidden=&quot;true&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); float: left; padding-right: 4px; margin-left: -20px; line-height: 1;&quot;&gt;&lt;svg class=&quot;octicon octicon-link&quot; viewBox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;IV. 암호 알고리즘&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/h1&gt;&lt;blockquote style=&quot;box-sizing: border-box; margin: 0px 0px 16px; padding: 0px 1em; color: rgb(106, 115, 125); border-left-width: 0.25em; border-left-color: rgb(223, 226, 229); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px;&quot;&gt;&lt;p style=&quot;box-sizing: border-box;&quot;&gt;이제, 평문을 암호문으로 어떻게 만드는지에 대해서 알아보자.&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;사용자가 정보를 입력하여 DB로 전달 되기 전에, 입력 값을 암호문으로 변경 해주는 알고리즘이 있다.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 style=&quot;box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;;&quot;&gt;&lt;a id=&quot;user-content-1-알고리즘단방향&quot; class=&quot;anchor&quot; href=&quot;https://github.com/kimhoungkuk/ShoppingmallProject/wiki/%EC%95%94%EB%B3%B5%ED%98%B8%ED%99%94#1-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EB%8B%A8%EB%B0%A9%ED%96%A5&quot; aria-hidden=&quot;true&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); float: left; padding-right: 4px; margin-left: -20px; line-height: 1;&quot;&gt;&lt;svg class=&quot;octicon octicon-link&quot; viewBox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;1). 알고리즘(단방향)&lt;/h2&gt;&lt;ul style=&quot;box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;알고리즘은 다양하다 그 중 가장 많이 쓰이는 해시함수 알고리즘이 적용된 것만 가져옴&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;해시 함수사용의 중요성&lt;/span&gt;&amp;nbsp;(&lt;a href=&quot;http://ppss.kr/archives/16823&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;http://ppss.kr/archives/16823&lt;/a&gt;)&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;SHA(대표적인 해시함수의 시초 since 1993)&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;&quot;&gt;SHA 적용코드&lt;/code&gt;&amp;nbsp;&lt;a href=&quot;http://blog.kindler.io/java-encrypt/&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;http://blog.kindler.io/java-encrypt/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;SHA를 보안해 좀더 쉽게 사용가능한 알고리즘&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 0px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;PBKDF2&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;blockquote style=&quot;box-sizing: border-box; margin: 0px 0px 16px; padding: 0px 1em; color: rgb(106, 115, 125); border-left-width: 0.25em; border-left-color: rgb(223, 226, 229);&quot;&gt;&lt;p style=&quot;box-sizing: border-box;&quot;&gt;해시 함수의 컨테이너인 PBKDF2는 솔트를 적용한 후 해시 함수의 반복 횟수를 임의로 선택할 수 있다. PBKDF2는 아주 가볍고 구현하기 쉬우며, SHA와 같이 검증된 해시 함수만을 사용한다.(Django 에서 사용)&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;&quot;&gt;PBKDF2 적용코드&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;bcrypt&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;blockquote style=&quot;box-sizing: border-box; margin: 0px 0px 16px; padding: 0px 1em; color: rgb(106, 115, 125); border-left-width: 0.25em; border-left-color: rgb(223, 226, 229);&quot;&gt;&lt;p style=&quot;box-sizing: border-box;&quot;&gt;bcrypt는 애초부터 패스워드 저장을 목적으로 설계되었다. bcrypt는 보안에 집착하기로 유명한 OpenBSD에서 기본 암호 인증 메커니즘으로 사용되고 있고 미래에 PBKDF2보다 더 경쟁력이 있다고 여겨진다. 입력값을 72 byte로 해야 해서 조금 귀찮다 하지만 가장많이쓰인다&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;&quot;&gt;bcrypt 적용코드&lt;/code&gt;&amp;nbsp;&lt;a href=&quot;http://vip00112.tistory.com/39&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;http://vip00112.tistory.com/39&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;http://kingle1024.tistory.com/11&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;http://kingle1024.tistory.com/11&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box; margin-top: 0.25em;&quot;&gt;scrypt&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;blockquote style=&quot;box-sizing: border-box; margin: 0px 0px 16px; padding: 0px 1em; color: rgb(106, 115, 125); border-left-width: 0.25em; border-left-color: rgb(223, 226, 229);&quot;&gt;&lt;p style=&quot;box-sizing: border-box;&quot;&gt;scrypt는 상대적으로 최신 알고리즘이며 나머지 둘보다 더 경쟁력 있는 것으로 평가되나, 아직 덜 확산되어 있다. scrypt는 다이제스트를 생성할 때 메모리 오버헤드를 갖도록 설계되어, 억지 기법 공격(brute-force attack)을 시도할 때 병렬화 처리가 매우 어렵다. 따라서 PBKDF2보다 안전하다고 평가되며 미래에 bcrypt에 비해 더 경쟁력이 있다고 여겨진다.&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0.2em 0.4em; margin: 0px; background-color: rgba(27, 31, 35, 0.05); border-radius: 3px;&quot;&gt;scrypt 적용코드&lt;/code&gt;&amp;nbsp;아직/ PBKDF2의 강화판. 굼벵이 같은 해싱 속도로 유명하다&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 16px; margin-bottom: 16px;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;암호학적 해시 함수 장단점 &amp;amp; 보안점&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;a href=&quot;http://d2.naver.com/helloworld/318732&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;http://d2.naver.com/helloworld/318732&lt;/a&gt;&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;span style=&quot;box-sizing: border-box; font-weight: 600;&quot;&gt;이 외 해킹공격 &amp;amp; 팁&lt;/span&gt;:&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;a href=&quot;http://www.codeok.net/%ED%8C%A8%EC%8A%A4%EC%9B%8C%EB%93%9C%20%EB%B3%B4%EC%95%88%EC%9D%98%20%EA%B8%B0%EC%88%A0&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;http://www.codeok.net/%ED%8C%A8%EC%8A%A4%EC%9B%8C%EB%93%9C%20%EB%B3%B4%EC%95%88%EC%9D%98%20%EA%B8%B0%EC%88%A0&lt;/a&gt;&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 style=&quot;box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;;&quot;&gt;&lt;a id=&quot;user-content-2-알고리즘-양방향&quot; class=&quot;anchor&quot; href=&quot;https://github.com/kimhoungkuk/ShoppingmallProject/wiki/%EC%95%94%EB%B3%B5%ED%98%B8%ED%99%94#2-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%96%91%EB%B0%A9%ED%96%A5&quot; aria-hidden=&quot;true&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); float: left; padding-right: 4px; margin-left: -20px; line-height: 1;&quot;&gt;&lt;svg class=&quot;octicon octicon-link&quot; viewBox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;2) 알고리즘 (양방향)&lt;/h2&gt;&lt;h3 style=&quot;box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; font-size: 1.25em; line-height: 1.25; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;;&quot;&gt;&lt;a id=&quot;user-content-a-대칭형비밀키-암호-알고리즘&quot; class=&quot;anchor&quot; href=&quot;https://github.com/kimhoungkuk/ShoppingmallProject/wiki/%EC%95%94%EB%B3%B5%ED%98%B8%ED%99%94#a-%EB%8C%80%EC%B9%AD%ED%98%95%EB%B9%84%EB%B0%80%ED%82%A4-%EC%95%94%ED%98%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-hidden=&quot;true&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); float: left; padding-right: 4px; margin-left: -20px; line-height: 1;&quot;&gt;&lt;svg class=&quot;octicon octicon-link&quot; viewBox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;a) 대칭형(비밀키 암호) 알고리즘&lt;/h3&gt;&lt;ul style=&quot;box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;AES (현재 가장 보편적으로 쓰이는 암호화 방식은 현 미국 표준 방식인 AES. 128~256비트 키를 적용할수 있어 보안성이 뛰어나며 공개된 알고리즘이라 누구나 사용할 수 있다.)&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style=&quot;box-sizing: border-box; margin: 0px 0px 16px; padding: 0px 1em; color: rgb(106, 115, 125); border-left-width: 0.25em; border-left-color: rgb(223, 226, 229); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px;&quot;&gt;&lt;p style=&quot;box-sizing: border-box;&quot;&gt;AES 적용 코드:&amp;nbsp;&lt;a href=&quot;http://blog.kindler.io/java-encrypt/&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;http://blog.kindler.io/java-encrypt/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 style=&quot;box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; font-size: 1.25em; line-height: 1.25; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;;&quot;&gt;&lt;a id=&quot;user-content-b-비대칭형공개키-암호알고리즘&quot; class=&quot;anchor&quot; href=&quot;https://github.com/kimhoungkuk/ShoppingmallProject/wiki/%EC%95%94%EB%B3%B5%ED%98%B8%ED%99%94#b-%EB%B9%84%EB%8C%80%EC%B9%AD%ED%98%95%EA%B3%B5%EA%B0%9C%ED%82%A4-%EC%95%94%ED%98%B8%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; aria-hidden=&quot;true&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); float: left; padding-right: 4px; margin-left: -20px; line-height: 1;&quot;&gt;&lt;svg class=&quot;octicon octicon-link&quot; viewBox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;b) 비대칭형(공개키 암호)알고리즘&lt;/h3&gt;&lt;ul style=&quot;box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;RSA (공개키 암호시스템의 하나로 암호화뿐만 아니라 전자서명이 가능한 최초의 알고리즘)&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote style=&quot;box-sizing: border-box; margin: 0px 0px 16px; padding: 0px 1em; color: rgb(106, 115, 125); border-left-width: 0.25em; border-left-color: rgb(223, 226, 229); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px;&quot;&gt;&lt;p style=&quot;box-sizing: border-box;&quot;&gt;RSA 적용 코드: (&lt;a href=&quot;https://www.holaxprogramming.com/2017/06/12/encryption-with-rsa/&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;https://www.holaxprogramming.com/2017/06/12/encryption-with-rsa/&lt;/a&gt;)&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 16px; word-wrap: normal; padding: 16px; overflow: auto; line-height: 1.45; background-color: rgb(246, 248, 250); border-radius: 3px; color: rgb(36, 41, 46);&quot;&gt;&lt;code style=&quot;box-sizing: border-box; font-family: SFMono-Regular, Consolas, &amp;quot;Liberation Mono&amp;quot;, Menlo, Courier, monospace; font-size: 13.6px; padding: 0px; margin: 0px; background: transparent; border-radius: 3px; word-break: normal; border: 0px; display: inline; overflow: visible; line-height: inherit; word-wrap: normal;&quot;&gt;대칭/비대칭형 비교: https://sungjk.github.io/2016/09/30/Security.html
&lt;/code&gt;&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px;&quot;&gt;암호종류 위키:&amp;nbsp;&lt;a href=&quot;https://namu.wiki/w/%EC%95%94%ED%98%B8%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;https://namu.wiki/w/%EC%95%94%ED%98%B8%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98&lt;/a&gt;&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;암호화 개념참고 :&lt;a href=&quot;http://blog.kindler.io/java-encrypt/&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration-line: underline; outline-width: 0px;&quot;&gt;http://blog.kindler.io/java-encrypt/&lt;/a&gt;&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;h1 style=&quot;box-sizing: border-box; margin: 24px 0px 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;;&quot;&gt;&lt;a id=&quot;user-content-jasypt-제이-싀뜨&quot; class=&quot;anchor&quot; href=&quot;https://github.com/kimhoungkuk/ShoppingmallProject/wiki/%EC%95%94%EB%B3%B5%ED%98%B8%ED%99%94#jasypt-%EC%A0%9C%EC%9D%B4-%EC%8B%80%EB%9C%A8&quot; aria-hidden=&quot;true&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); float: left; padding-right: 4px; margin-left: -20px; line-height: 1;&quot;&gt;&lt;svg class=&quot;octicon octicon-link&quot; viewBox=&quot;0 0 16 16&quot; version=&quot;1.1&quot; width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Jasypt (제이 싀뜨)&lt;/h1&gt;&lt;p style=&quot;box-sizing: border-box; color: rgb(36, 41, 46); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px;&quot;&gt;db properties 적용방법&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;a href=&quot;http://blusky10.tistory.com/266&quot; rel=&quot;nofollow&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214);&quot;&gt;http://blusky10.tistory.com/266&lt;/a&gt;&lt;/p&gt;</description>
      <category>▶ 웹 보안</category>
      <author>SieunLim</author>
      <guid isPermaLink="true">https://sieunlim.tistory.com/16</guid>
      <comments>https://sieunlim.tistory.com/16#entry16comment</comments>
      <pubDate>Fri, 13 Jul 2018 01:51:58 +0900</pubDate>
    </item>
  </channel>
</rss>